103 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /****************************************************************************
 | |
|  *
 | |
|  * Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
 | |
|  *
 | |
|  * This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
 | |
|  * be copied by any method or incorporated into another program without
 | |
|  * the express written consent of Aerospace C.Power. This Information or any portion
 | |
|  * thereof remains the property of Aerospace C.Power. The Information contained herein
 | |
|  * is believed to be accurate and Aerospace C.Power assumes no responsibility or
 | |
|  * liability for its use in any way and conveys no license or title under
 | |
|  * any patent or copyright and makes no representation or warranty that this
 | |
|  * Information is free from patent or copyright infringement.
 | |
|  *
 | |
|  * ****************************************************************************/
 | |
| /* os shim includes */
 | |
| #include "os_types.h"
 | |
| #include "iot_irq.h"
 | |
| #include "iot_wdg.h"
 | |
| #include "os_mem.h"
 | |
| #include "efuse.h"
 | |
| #include "iot_system.h"
 | |
| #include "iot_io.h"
 | |
| 
 | |
| #include "platform.h"
 | |
| #include "encoding.h"
 | |
| 
 | |
| extern void def_trap_entry_2();
 | |
| extern void intc_handler(uint32_t cpu);
 | |
| 
 | |
| cpu_state g_cpu1_state;
 | |
| 
 | |
| static void exception_handler_2(uintptr_t mcause, uintptr_t epc, saved_registers *reg)
 | |
| {
 | |
|     /* save cpu1's crash state */
 | |
|     g_cpu1_state.crash = 1;
 | |
|     g_cpu1_state.mcause = mcause;
 | |
|     g_cpu1_state.mepc = epc;
 | |
|     g_cpu1_state.trap_frame  = reg;
 | |
| 
 | |
|     while(1);
 | |
| }
 | |
| 
 | |
| uintptr_t handle_trap_2(uintptr_t mcause, uintptr_t epc, saved_registers *reg)
 | |
| {
 | |
|     if ((mcause & MCAUSE_CAUSE) == IRQ_M_EXT) {
 | |
|         intc_handler(HAL_INTR_CPU_1);
 | |
|     }else {
 | |
|         exception_handler_2(mcause, epc, reg);
 | |
|     }
 | |
| 
 | |
|     return epc;
 | |
| }
 | |
| 
 | |
| void _init_2()
 | |
| {
 | |
|     write_csr(mtvec, &def_trap_entry_2);
 | |
| 
 | |
|     clear_csr(mie, MIP_MEIP);
 | |
|     clear_csr(mie, MIP_MTIP);
 | |
| 
 | |
|     iot_interrupt_init(HAL_INTR_CPU_1);
 | |
| 
 | |
|     set_csr(mie, MIP_MEIP);
 | |
| 
 | |
|     // Enable interrupts in general.
 | |
|     set_csr(mstatus, MSTATUS_MIE);
 | |
|     wdg_deinit(HAL_WDG_CPU_1);
 | |
| 
 | |
|     g_cpu1_state.flags = CPU_FLAG_RUNNING;
 | |
| }
 | |
| 
 | |
| void _fini()
 | |
| {
 | |
| 
 | |
| }
 | |
| 
 | |
| void assert_failed( unsigned char *pucFile, unsigned long ulLine )
 | |
| {
 | |
|     ( void ) pucFile;
 | |
|     ( void ) ulLine;
 | |
| 
 | |
|     g_cpu1_state.assert_failed = 1;
 | |
|     if (pucFile) {
 | |
|         os_mem_cpy(g_cpu1_state.assert_info.file, pucFile, 32);
 | |
|     } else {
 | |
|         os_mem_set(g_cpu1_state.assert_info.file, 0, 32);
 | |
|     }
 | |
|     g_cpu1_state.assert_info.line = ulLine;
 | |
| 
 | |
|     /* do a breakpoint exception */
 | |
|     asm volatile("ebreak");
 | |
| }
 | |
| 
 | |
| void assert_failed_simple()
 | |
| {
 | |
|     g_cpu1_state.assert_failed = 1;
 | |
|     os_mem_set(g_cpu1_state.assert_info.file, 0, 32);
 | |
|     g_cpu1_state.assert_info.line = 0;
 | |
| 
 | |
|     /* do a breakpoint exception */
 | |
|     asm volatile("ebreak");
 | |
| }
 |