1*10465441SEvalZero /*
2*10465441SEvalZero * Copyright (c) 2018, Synopsys, Inc.
3*10465441SEvalZero *
4*10465441SEvalZero * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero */
6*10465441SEvalZero #include <rtthread.h>
7*10465441SEvalZero
8*10465441SEvalZero #include "inc/arc/arc_exception.h"
9*10465441SEvalZero
10*10465441SEvalZero /* enable interrupt and set interrupt priority mask */
11*10465441SEvalZero #define ARC_INIT_STATUS (AUX_STATUS_MASK_IE | ((-1 - INT_PRI_MIN) << 1))
12*10465441SEvalZero
13*10465441SEvalZero
14*10465441SEvalZero extern void start_r(void);
15*10465441SEvalZero
16*10465441SEvalZero
17*10465441SEvalZero rt_uint32_t context_switch_reqflg;
18*10465441SEvalZero rt_uint32_t rt_interrupt_from_thread;
19*10465441SEvalZero rt_uint32_t rt_interrupt_to_thread;
20*10465441SEvalZero
21*10465441SEvalZero struct init_stack_frame {
22*10465441SEvalZero rt_uint32_t pc;
23*10465441SEvalZero rt_uint32_t blink;
24*10465441SEvalZero rt_uint32_t task;
25*10465441SEvalZero rt_uint32_t status32;
26*10465441SEvalZero rt_uint32_t r0;
27*10465441SEvalZero };
28*10465441SEvalZero
29*10465441SEvalZero /**
30*10465441SEvalZero * shutdown CPU
31*10465441SEvalZero */
rt_hw_cpu_shutdown(void)32*10465441SEvalZero void rt_hw_cpu_shutdown(void)
33*10465441SEvalZero {
34*10465441SEvalZero
35*10465441SEvalZero }
36*10465441SEvalZero
rt_hw_stack_init(void * tentry,void * parameter,rt_uint8_t * stack_addr,void * texit)37*10465441SEvalZero rt_uint8_t *rt_hw_stack_init(void *tentry,
38*10465441SEvalZero void *parameter,
39*10465441SEvalZero rt_uint8_t *stack_addr,
40*10465441SEvalZero void *texit)
41*10465441SEvalZero {
42*10465441SEvalZero struct init_stack_frame *stack_frame;
43*10465441SEvalZero rt_uint8_t *stk;
44*10465441SEvalZero
45*10465441SEvalZero stk = stack_addr + sizeof(rt_uint32_t);
46*10465441SEvalZero stk = (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stk, 8);
47*10465441SEvalZero stk -= sizeof(struct init_stack_frame);
48*10465441SEvalZero
49*10465441SEvalZero stack_frame = (struct init_stack_frame *)stk;
50*10465441SEvalZero
51*10465441SEvalZero stack_frame->pc = (rt_uint32_t)start_r;
52*10465441SEvalZero stack_frame->blink = (rt_uint32_t)texit;
53*10465441SEvalZero stack_frame->task = (rt_uint32_t)tentry;
54*10465441SEvalZero stack_frame->status32 = ARC_INIT_STATUS;
55*10465441SEvalZero stack_frame->r0 = (rt_uint32_t)parameter;
56*10465441SEvalZero
57*10465441SEvalZero return stk;
58*10465441SEvalZero }
59*10465441SEvalZero
60*10465441SEvalZero
61*10465441SEvalZero /**
62*10465441SEvalZero * This function set the hook, which is invoked on fault exception handling.
63*10465441SEvalZero *
64*10465441SEvalZero * @param exception_handle the exception handling hook function.
65*10465441SEvalZero */
rt_hw_exception_install(rt_err_t (* exception_handle)(void * context))66*10465441SEvalZero void rt_hw_exception_install(rt_err_t (*exception_handle)(void *context))
67*10465441SEvalZero {
68*10465441SEvalZero exception_handle = exception_handle;
69*10465441SEvalZero }