1*10465441SEvalZero /* 2*10465441SEvalZero * Copyright (c) 2006-2018, RT-Thread Development Team 3*10465441SEvalZero * 4*10465441SEvalZero * SPDX-License-Identifier: Apache-2.0 5*10465441SEvalZero * 6*10465441SEvalZero * Change Logs: 7*10465441SEvalZero * Date Author Notes 8*10465441SEvalZero * 2018-09-01 xuzhuoyi the first version. 9*10465441SEvalZero */ 10*10465441SEvalZero 11*10465441SEvalZero #include <rtthread.h> 12*10465441SEvalZero 13*10465441SEvalZero /* exception and interrupt handler table */ 14*10465441SEvalZero rt_uint32_t rt_interrupt_from_thread; 15*10465441SEvalZero rt_uint32_t rt_interrupt_to_thread; 16*10465441SEvalZero rt_uint32_t rt_thread_switch_interrupt_flag; 17*10465441SEvalZero /* exception hook */ 18*10465441SEvalZero static rt_err_t (*rt_exception_hook)(void *context) = RT_NULL; 19*10465441SEvalZero 20*10465441SEvalZero struct exception_stack_frame 21*10465441SEvalZero { 22*10465441SEvalZero rt_uint32_t t_st0; 23*10465441SEvalZero rt_uint32_t acc; 24*10465441SEvalZero rt_uint32_t p; 25*10465441SEvalZero rt_uint32_t ar1_ar0; 26*10465441SEvalZero rt_uint32_t dp_st1; 27*10465441SEvalZero rt_uint32_t dbgstat_ier; 28*10465441SEvalZero rt_uint32_t return_address; 29*10465441SEvalZero }; 30*10465441SEvalZero 31*10465441SEvalZero struct stack_frame 32*10465441SEvalZero { 33*10465441SEvalZero struct exception_stack_frame exception_stack_frame; 34*10465441SEvalZero 35*10465441SEvalZero /* r4 ~ r11 register */ 36*10465441SEvalZero rt_uint16_t ar0h; 37*10465441SEvalZero rt_uint16_t ar1h; 38*10465441SEvalZero rt_uint32_t xar2; 39*10465441SEvalZero rt_uint32_t xar3; 40*10465441SEvalZero rt_uint32_t xar4; 41*10465441SEvalZero rt_uint32_t xar5; 42*10465441SEvalZero rt_uint32_t xar6; 43*10465441SEvalZero rt_uint32_t xar7; 44*10465441SEvalZero rt_uint32_t xt; 45*10465441SEvalZero rt_uint32_t rpc; 46*10465441SEvalZero 47*10465441SEvalZero 48*10465441SEvalZero }; 49*10465441SEvalZero rt_hw_stack_init(void * tentry,void * parameter,rt_uint8_t * stack_addr,void * texit)50*10465441SEvalZerort_uint8_t *rt_hw_stack_init(void *tentry, 51*10465441SEvalZero void *parameter, 52*10465441SEvalZero rt_uint8_t *stack_addr, 53*10465441SEvalZero void *texit) 54*10465441SEvalZero { 55*10465441SEvalZero struct stack_frame *stack_frame; 56*10465441SEvalZero rt_uint8_t *stk; 57*10465441SEvalZero unsigned long i; 58*10465441SEvalZero 59*10465441SEvalZero stk = stack_addr; 60*10465441SEvalZero stk = (rt_uint8_t *)RT_ALIGN((rt_uint32_t)stk, 8); 61*10465441SEvalZero //stk -= sizeof(struct stack_frame); 62*10465441SEvalZero 63*10465441SEvalZero stack_frame = (struct stack_frame *)stk; 64*10465441SEvalZero 65*10465441SEvalZero /* init all register */ 66*10465441SEvalZero for (i = 0; i < sizeof(struct stack_frame) / sizeof(rt_uint32_t); i ++) 67*10465441SEvalZero { 68*10465441SEvalZero ((rt_uint32_t *)stack_frame)[i] = 0xdeadbeef; 69*10465441SEvalZero } 70*10465441SEvalZero 71*10465441SEvalZero stack_frame->exception_stack_frame.t_st0 = 0x11110000 | rt_hw_get_st0(); 72*10465441SEvalZero stack_frame->exception_stack_frame.acc = 0x33332222; 73*10465441SEvalZero stack_frame->exception_stack_frame.ar1_ar0 = 0x00001111 & (unsigned long)parameter; /* ar0 : argument */ 74*10465441SEvalZero stack_frame->exception_stack_frame.p = 0x55554444; /* p */ 75*10465441SEvalZero stack_frame->exception_stack_frame.dp_st1 = (0x00000000) | rt_hw_get_st1(); /* dp_st1 */ 76*10465441SEvalZero stack_frame->exception_stack_frame.dbgstat_ier = 0; /* dbgstat_ier */ 77*10465441SEvalZero stack_frame->exception_stack_frame.return_address = (unsigned long)tentry; /* return_address */ 78*10465441SEvalZero stack_frame->rpc = (unsigned long)texit; 79*10465441SEvalZero 80*10465441SEvalZero /* return task's current stack address */ 81*10465441SEvalZero return stk + sizeof(struct stack_frame); 82*10465441SEvalZero } 83*10465441SEvalZero 84*10465441SEvalZero /** 85*10465441SEvalZero * This function set the hook, which is invoked on fault exception handling. 86*10465441SEvalZero * 87*10465441SEvalZero * @param exception_handle the exception handling hook function. 88*10465441SEvalZero */ rt_hw_exception_install(rt_err_t (* exception_handle)(void * context))89*10465441SEvalZerovoid rt_hw_exception_install(rt_err_t (*exception_handle)(void *context)) 90*10465441SEvalZero { 91*10465441SEvalZero rt_exception_hook = exception_handle; 92*10465441SEvalZero } 93*10465441SEvalZero 94*10465441SEvalZero 95*10465441SEvalZero struct exception_info 96*10465441SEvalZero { 97*10465441SEvalZero rt_uint32_t exc_return; 98*10465441SEvalZero struct stack_frame stack_frame; 99*10465441SEvalZero }; 100*10465441SEvalZero 101*10465441SEvalZero 102*10465441SEvalZero /** 103*10465441SEvalZero * shutdown CPU 104*10465441SEvalZero */ rt_hw_cpu_shutdown(void)105*10465441SEvalZerovoid rt_hw_cpu_shutdown(void) 106*10465441SEvalZero { 107*10465441SEvalZero rt_kprintf("shutdown...\n"); 108*10465441SEvalZero 109*10465441SEvalZero RT_ASSERT(0); 110*10465441SEvalZero } 111