xref: /nrf52832-nimble/rt-thread/libcpu/arc/em/cpuport.c (revision 104654410c56c573564690304ae786df310c91fc)
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 }