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