修改格式

This commit is contained in:
Huang bo 2021-11-18 09:23:29 +08:00
parent 8ab19db7fa
commit 2b13e2fa57
12 changed files with 216 additions and 219 deletions

View File

@ -20,13 +20,13 @@
*/ */
void rt_hw_board_init(void) void rt_hw_board_init(void)
{ {
// initial CPU core // initial CPU core
KeyStone_common_CPU_init(); KeyStone_common_CPU_init();
// initial interrupt controller // initial interrupt controller
rt_hw_interrupt_init(); rt_hw_interrupt_init();
// initial system timer // initial system timer
rt_hw_system_timer_init(); rt_hw_system_timer_init();
/* initialize memory system */ /* initialize memory system */

View File

@ -15,8 +15,8 @@
void rt_init_thread_entry(void *parameter) void rt_init_thread_entry(void *parameter)
{ {
rt_kprintf("hello rt-thread\n"); rt_kprintf("hello rt-thread\n");
return 0; return 0;
} }
int rt_application_init(void) int rt_application_init(void)
@ -39,42 +39,42 @@ int rt_application_init(void)
*/ */
void rtthread_startup(void) void rtthread_startup(void)
{ {
/* disable interrupt first */ /* disable interrupt first */
rt_hw_interrupt_disable(); rt_hw_interrupt_disable();
/* init board */
rt_hw_board_init();
/* init board */ /* show version */
rt_hw_board_init(); rt_show_version();
/* show version */ /* init timer system */
rt_show_version(); rt_system_timer_init();
/* init timer system */ /* init scheduler system */
rt_system_timer_init(); rt_system_scheduler_init();
/* init scheduler system */ /* init application */
rt_system_scheduler_init(); rt_application_init();
/* init application */ /* init timer thread */
rt_application_init(); rt_system_timer_thread_init();
/* init timer thread */ /* init idle thread */
rt_system_timer_thread_init(); rt_thread_idle_init();
/* init idle thread */ /* start scheduler */
rt_thread_idle_init(); rt_system_scheduler_start();
/* start scheduler */ /* never reach here */
rt_system_scheduler_start(); return ;
/* never reach here */
return ;
} }
void main(void) void main(void)
{ {
/* startup RT-Thread RTOS */ /* startup RT-Thread RTOS */
rtthread_startup(); rtthread_startup();
for ( ; ; ); for ( ; ; );
} }

View File

@ -20,13 +20,13 @@
*/ */
void rt_hw_systick_isr(void) void rt_hw_systick_isr(void)
{ {
/* enter interrupt */ /* enter interrupt */
rt_interrupt_enter(); rt_interrupt_enter();
rt_tick_increase(); rt_tick_increase();
/* leave interrupt */ /* leave interrupt */
rt_interrupt_leave(); rt_interrupt_leave();
} }
/** /**
@ -34,7 +34,7 @@ void rt_hw_systick_isr(void)
*/ */
void rt_hw_system_timer_init(void) void rt_hw_system_timer_init(void)
{ {
// initial system timer interrupt, map local timer interrupt to INT14 // initial system timer interrupt, map local timer interrupt to INT14
gpCGEM_regs->INTMUX3 = (CSL_GEM_TINTLN<<CSL_CGEM_INTMUX3_INTSEL14_SHIFT); gpCGEM_regs->INTMUX3 = (CSL_GEM_TINTLN<<CSL_CGEM_INTMUX3_INTSEL14_SHIFT);
// enable CPU INT14 // enable CPU INT14
CPU_interrupt_enable(1<<14); CPU_interrupt_enable(1<<14);

View File

@ -21,60 +21,60 @@
struct rt_hw_register struct rt_hw_register
{ {
RT_REG_PAIR(b17, b16); RT_REG_PAIR(b17, b16);
RT_REG_PAIR(b19, b18); RT_REG_PAIR(b19, b18);
RT_REG_PAIR(b21, b20); RT_REG_PAIR(b21, b20);
RT_REG_PAIR(b23, b22); RT_REG_PAIR(b23, b22);
RT_REG_PAIR(b25, b24); RT_REG_PAIR(b25, b24);
RT_REG_PAIR(b27, b26); RT_REG_PAIR(b27, b26);
RT_REG_PAIR(b29, b28); RT_REG_PAIR(b29, b28);
RT_REG_PAIR(b31, b30); RT_REG_PAIR(b31, b30);
RT_REG_PAIR(b1, b0); RT_REG_PAIR(b1, b0);
RT_REG_PAIR(b3, b2); RT_REG_PAIR(b3, b2);
RT_REG_PAIR(b5, b4); RT_REG_PAIR(b5, b4);
RT_REG_PAIR(b7, b6); RT_REG_PAIR(b7, b6);
RT_REG_PAIR(b9, b8); RT_REG_PAIR(b9, b8);
RT_REG_PAIR(b11, b10); RT_REG_PAIR(b11, b10);
RT_REG_PAIR(b13, b12); RT_REG_PAIR(b13, b12);
RT_REG_PAIR(a17, a16);
RT_REG_PAIR(a19, a18);
RT_REG_PAIR(a21, a20);
RT_REG_PAIR(a23, a22);
RT_REG_PAIR(a25, a24);
RT_REG_PAIR(a27, a26);
RT_REG_PAIR(a29, a28);
RT_REG_PAIR(a31, a30);
RT_REG_PAIR(a17, a16); RT_REG_PAIR(a1, a0);
RT_REG_PAIR(a19, a18); RT_REG_PAIR(a3, a2);
RT_REG_PAIR(a21, a20); RT_REG_PAIR(a5, a4);
RT_REG_PAIR(a23, a22); RT_REG_PAIR(a7, a6);
RT_REG_PAIR(a25, a24); RT_REG_PAIR(a9, a8);
RT_REG_PAIR(a27, a26); RT_REG_PAIR(a11, a10);
RT_REG_PAIR(a29, a28); RT_REG_PAIR(a13, a12);
RT_REG_PAIR(a31, a30);
RT_REG_PAIR(a1, a0); RT_REG_PAIR(a15, a14);
RT_REG_PAIR(a3, a2); RT_REG_PAIR(sp, dp);
RT_REG_PAIR(a5, a4);
RT_REG_PAIR(a7, a6);
RT_REG_PAIR(a9, a8);
RT_REG_PAIR(a11, a10);
RT_REG_PAIR(a13, a12);
RT_REG_PAIR(a15, a14);
RT_REG_PAIR(sp, dp);
}; };
struct rt_hw_exp_stack_register struct rt_hw_exp_stack_register
{ {
RT_REG_PAIR(tsr, orig_a4); RT_REG_PAIR(tsr, orig_a4);
RT_REG_PAIR(rilc, ilc); RT_REG_PAIR(rilc, ilc);
RT_REG_PAIR(pc, csr); RT_REG_PAIR(pc, csr);
struct rt_hw_register hw_register; struct rt_hw_register hw_register;
}; };
#define __dint() asm(" DINT") #define __dint() asm(" DINT")
#define __rint() asm(" RINT") #define __rint() asm(" RINT")
#define __system_call() asm(" SWE") #define __system_call() asm(" SWE")
#define __enter_idle() asm(" IDLE") #define __enter_idle() asm(" IDLE")
#define __nop() asm(" NOP") #define __nop() asm(" NOP")
#define __mfence() asm(" MFENCE") #define __mfence() asm(" MFENCE")
#define __SYSREG(ADDR, TYPE) (*(volatile TYPE*)(ADDR)) #define __SYSREG(ADDR, TYPE) (*(volatile TYPE*)(ADDR))
#define __SYSREGA(ADDR, TYPE) ((volatile TYPE*)(ADDR)) #define __SYSREGA(ADDR, TYPE) ((volatile TYPE*)(ADDR))
#endif /* __C66XX_H__ */ #endif /* __C66XX_H__ */

View File

@ -9,18 +9,18 @@
; ;
;----------------------------------------------------------- ;-----------------------------------------------------------
; context switch for C6000 DSP ; context switch for C6000 DSP
;----------------------------------------------------------- ;-----------------------------------------------------------
.include "contextinc.asm" .include "contextinc.asm"
;----------------------------------------------------------- ;-----------------------------------------------------------
; macro definition ; macro definition
;----------------------------------------------------------- ;-----------------------------------------------------------
DP .set B14 DP .set B14
SP .set B15 SP .set B15
;----------------------------------------------------------- ;-----------------------------------------------------------
; extern variable ; extern variable
;----------------------------------------------------------- ;-----------------------------------------------------------
.ref rt_system_stack_top .ref rt_system_stack_top
; ;
@ -28,7 +28,7 @@ SP .set B15
; ;
;----------------------------------------------------------- ;-----------------------------------------------------------
; global variable ; global variable
;----------------------------------------------------------- ;-----------------------------------------------------------
.global rt_interrupt_from_thread .global rt_interrupt_from_thread
.global rt_interrupt_to_thread .global rt_interrupt_to_thread
@ -47,7 +47,7 @@ rt_hw_enable_exception:
MVC .S2 B3,NRP MVC .S2 B3,NRP
MVK .L2 0xC,B1 MVK .L2 0xC,B1
OR .D2 B0,B1,B0 OR .D2 B0,B1,B0
MVC .S2 B0,TSR ; Set GEE and XEN in TSR MVC .S2 B0,TSR ; Set GEE and XEN in TSR
B .S2 NRP B .S2 NRP
NOP 5 NOP 5
@ -93,27 +93,27 @@ rt_hw_context_switch:
; { ; {
SUBAW .D2 SP,2,SP SUBAW .D2 SP,2,SP
ADD .D1X SP,-8,A15 ADD .D1X SP,-8,A15
|| STDW .D2T1 A15:A14,*SP--[3] ; Store A15:A14 || STDW .D2T1 A15:A14,*SP--[3] ; Store A15:A14
STDW .D2T2 B13:B12,*SP--[1] ; Store B13:B12 STDW .D2T2 B13:B12,*SP--[1] ; Store B13:B12
|| STDW .D1T1 A13:A12,*A15--[1] ; Store A13:A12 || STDW .D1T1 A13:A12,*A15--[1] ; Store A13:A12
|| MV B3,B13 || MV B3,B13
STDW .D2T2 B11:B10,*SP--[1] ; Store B11:B10 STDW .D2T2 B11:B10,*SP--[1] ; Store B11:B10
|| STDW .D1T1 A11:A10,*A15--[1] ; Store A11:A10 || STDW .D1T1 A11:A10,*A15--[1] ; Store A11:A10
|| MVC .S2 CSR,B12 || MVC .S2 CSR,B12
STDW .D2T2 B13:B12,*SP--[1] ; Store PC:CSR STDW .D2T2 B13:B12,*SP--[1] ; Store PC:CSR
|| MVC .S2 TSR,B5 || MVC .S2 TSR,B5
MVC .S2 ILC,B11 ; MVC .S2 ILC,B11
MVC .S2 RILC,B10 ; MVC .S2 RILC,B10
STDW .D2T2 B11:B10,*SP--[1] ; Store RILC:ILC STDW .D2T2 B11:B10,*SP--[1] ; Store RILC:ILC
|| MV .S1X B5,A3 || MV .S1X B5,A3
ZERO A2 ; ZERO A2 ;
STDW .D2T1 A3:A2,*SP--[1] ; Store TSR:stack type STDW .D2T1 A3:A2,*SP--[1] ; Store TSR:stack type
STW SP,*A4 ; Save thread's stack pointer STW SP,*A4 ; Save thread's stack pointer
B rt_hw_context_switch_to B rt_hw_context_switch_to
MV B4,A4 ; MV B4,A4
NOP 4 NOP 4
;} ;}
@ -126,24 +126,24 @@ rt_hw_context_switch_to:
;{ ;{
LDW *A4,SP LDW *A4,SP
NOP 4 NOP 4
LDDW .D2T2 *++SP[1],B9:B8 ; get TSR (B9) and stack frame type (B8) LDDW .D2T2 *++SP[1],B9:B8 ; get TSR (B9) and stack frame type (B8)
LDDW .D2T2 *++SP[1],B11:B10 ; get RILC (B11) and ILC (B10) LDDW .D2T2 *++SP[1],B11:B10 ; get RILC (B11) and ILC (B10)
LDDW .D2T2 *++SP[1],B13:B12 ; get PC (B13) and CSR (B12) LDDW .D2T2 *++SP[1],B13:B12 ; get PC (B13) and CSR (B12)
NOP 2 NOP 2
MV B8,B0 MV B8,B0
[B0] B _rt_thread_interrupt_stack ; [B0] B _rt_thread_interrupt_stack
NOP 5 NOP 5
; ;
; this maybe do better ; this maybe do better
; ;
LDDW .D2T2 *++SP[1],B11:B10 LDDW .D2T2 *++SP[1],B11:B10
|| MVC .S2 B11,RILC ; Restore RILC || MVC .S2 B11,RILC ; Restore RILC
LDDW .D2T2 *++SP[1],B13:B12 LDDW .D2T2 *++SP[1],B13:B12
|| MVC .S2 B10,ILC ; Restore ILC || MVC .S2 B10,ILC ; Restore ILC
LDDW .D2T1 *++SP[1],A11:A10 LDDW .D2T1 *++SP[1],A11:A10
|| MV B13,B3 ; Restore PC || MV B13,B3 ; Restore PC
LDDW .D2T1 *++SP[1],A13:A12 LDDW .D2T1 *++SP[1],A13:A12
|| MVC .S2 B12,CSR ; Restore CSR || MVC .S2 B12,CSR ; Restore CSR
LDDW .D2T1 *++SP[1],A15:A14 LDDW .D2T1 *++SP[1],A15:A14
B B3 ; Return to caller B B3 ; Return to caller
ADDAW .D2 SP,2,SP ADDAW .D2 SP,2,SP
@ -172,21 +172,21 @@ _rt_thread_interrupt_stack:
LDDW .D1T1 *++A15[1],A3:A2 LDDW .D1T1 *++A15[1],A3:A2
|| LDDW .D2T2 *++SP[1],B3:B2 || LDDW .D2T2 *++SP[1],B3:B2
|| MVC .S2 B9,ITSR ; Restore ITSR || MVC .S2 B9,ITSR ; Restore ITSR
LDDW .D1T1 *++A15[1],A5:A4 LDDW .D1T1 *++A15[1],A5:A4
|| LDDW .D2T2 *++SP[1],B5:B4 || LDDW .D2T2 *++SP[1],B5:B4
|| MVC .S2 B11,RILC ; Restore RILC || MVC .S2 B11,RILC ; Restore RILC
LDDW .D1T1 *++A15[1],A7:A6 LDDW .D1T1 *++A15[1],A7:A6
|| LDDW .D2T2 *++SP[1],B7:B6 || LDDW .D2T2 *++SP[1],B7:B6
|| MVC .S2 B10,ILC ; Restore ILC || MVC .S2 B10,ILC ; Restore ILC
LDDW .D1T1 *++A15[1],A9:A8 LDDW .D1T1 *++A15[1],A9:A8
|| LDDW .D2T2 *++SP[1],B9:B8 || LDDW .D2T2 *++SP[1],B9:B8
|| MVC .S2 B13,IRP ; Restore IPR || MVC .S2 B13,IRP ; Restore IPR
LDDW .D1T1 *++A15[1],A11:A10 LDDW .D1T1 *++A15[1],A11:A10
|| LDDW .D2T2 *++SP[1],B11:B10 || LDDW .D2T2 *++SP[1],B11:B10
|| MVC .S2 B12,CSR ; Restore CSR || MVC .S2 B12,CSR ; Restore CSR
LDDW .D1T1 *++A15[1],A13:A12 LDDW .D1T1 *++A15[1],A13:A12
|| LDDW .D2T2 *++SP[1],B13:B12 || LDDW .D2T2 *++SP[1],B13:B12
@ -242,9 +242,9 @@ rt_interrupt_context_restore:
CMPEQ 1,A1,A2 CMPEQ 1,A1,A2
[A2] BNOP rt_preempt_context_restore,5 [A2] BNOP rt_preempt_context_restore,5
NOP 5 NOP 5
LDDW .D2T2 *++SP[1],B9:B8 ; get TSR (B9) LDDW .D2T2 *++SP[1],B9:B8 ; get TSR (B9)
LDDW .D2T2 *++SP[1],B11:B10 ; get RILC (B11) and ILC (B10) LDDW .D2T2 *++SP[1],B11:B10 ; get RILC (B11) and ILC (B10)
LDDW .D2T2 *++SP[1],B13:B12 ; get PC (B13) and CSR (B12) LDDW .D2T2 *++SP[1],B13:B12 ; get PC (B13) and CSR (B12)
ADDAW .D1X SP,30,A15 ADDAW .D1X SP,30,A15
@ -290,15 +290,15 @@ rt_interrupt_context_restore:
|| MVKL .S1 rt_system_stack_top,A15 || MVKL .S1 rt_system_stack_top,A15
MVKH .S1 rt_system_stack_top,A15 MVKH .S1 rt_system_stack_top,A15
|| ADDAW .D1X SP,6,A14 || ADDAW .D1X SP,6,A14
STW .D1T1 A14,*A15 ; save system stack pointer STW .D1T1 A14,*A15 ; save system stack pointer
LDDW .D2T1 *++SP[1],A15:A14 LDDW .D2T1 *++SP[1],A15:A14
B .S2 IRP ; return from interruption B .S2 IRP ; return from interruption
LDDW .D2T2 *+SP[1],SP:DP LDDW .D2T2 *+SP[1],SP:DP
NOP 4 NOP 4
rt_preempt_context_restore: rt_preempt_context_restore:
ZERO A12 ZERO A12
STW A12,*A3 ; clear rt_thread_switch_interrupt_flag STW A12,*A3 ; clear rt_thread_switch_interrupt_flag
; ;
; restore saved registers by system stack ; restore saved registers by system stack
; ;
@ -316,11 +316,9 @@ rt_preempt_context_restore:
MVKH rt_interrupt_to_thread,B10 MVKH rt_interrupt_to_thread,B10
LDW *B10,B11 LDW *B10,B11
NOP 3 NOP 3
STW SP,*A10 ; store sp in preempted tasks's TCB STW SP,*A10 ; store sp in preempted tasks's TCB
B rt_hw_context_switch_to B rt_hw_context_switch_to
MV B11,A4 ; MV B11,A4
NOP 4 NOP 4
;} ;}
.end .end

View File

@ -9,28 +9,28 @@
; ;
;----------------------------------------------------------- ;-----------------------------------------------------------
; macro definition ; macro definition
;----------------------------------------------------------- ;-----------------------------------------------------------
SAVE_ALL .macro __rp, __tsr SAVE_ALL .macro __rp, __tsr
STW .D2T2 B0,*SP--[2] ; save original B0 STW .D2T2 B0,*SP--[2] ; save original B0
MVKL .S2 rt_system_stack_top,B0 MVKL .S2 rt_system_stack_top,B0
MVKH .S2 rt_system_stack_top,B0 MVKH .S2 rt_system_stack_top,B0
LDW .D2T2 *B0,B1 ; system stack LDW .D2T2 *B0,B1 ; system stack
NOP 3 NOP 3
STW .D2T2 B1,*+SP[1] ; save original B1 STW .D2T2 B1,*+SP[1] ; save original B1
XOR .D2 SP,B1,B0 ; check current stack types XOR .D2 SP,B1,B0 ; check current stack types
LDW .D2T2 *+SP[1],B1 ; restore B0/B1 LDW .D2T2 *+SP[1],B1 ; restore B0/B1
LDW .D2T2 *++SP[2],B0 LDW .D2T2 *++SP[2],B0
SHR .S2 B0,12,B0 ; 0 if already using system stack SHR .S2 B0,12,B0 ; 0 if already using system stack
[B0] STDW .D2T2 SP:DP,*--B1[1] ; thread: save thread sp/dp system stack [B0] STDW .D2T2 SP:DP,*--B1[1] ; thread: save thread sp/dp system stack
[B0] MV .S2 B1,SP ; and switch to system stack [B0] MV .S2 B1,SP ; and switch to system stack
||[!B0] STDW .D2T2 SP:DP,*--SP[1] ; kernel: nest interrupt save(not support) ||[!B0] STDW .D2T2 SP:DP,*--SP[1] ; kernel: nest interrupt save(not support)
SUBAW .D2 SP,2,SP SUBAW .D2 SP,2,SP
ADD .D1X SP,-8,A15 ADD .D1X SP,-8,A15
|| STDW .D2T1 A15:A14,*SP--[16] ; save A15:A14 || STDW .D2T1 A15:A14,*SP--[16] ; save A15:A14
STDW .D2T2 B13:B12,*SP--[1] STDW .D2T2 B13:B12,*SP--[1]
|| STDW .D1T1 A13:A12,*A15--[1] || STDW .D1T1 A13:A12,*A15--[1]
@ -73,15 +73,15 @@ SAVE_ALL .macro __rp, __tsr
STDW .D2T2 B17:B16,*SP--[1] STDW .D2T2 B17:B16,*SP--[1]
|| STDW .D1T1 A17:A16,*A15--[1] || STDW .D1T1 A17:A16,*A15--[1]
STDW .D2T2 B13:B12,*SP--[1] ; save PC and CSR STDW .D2T2 B13:B12,*SP--[1] ; save PC and CSR
STDW .D2T2 B11:B10,*SP--[1] ; save RILC and ILC STDW .D2T2 B11:B10,*SP--[1] ; save RILC and ILC
STDW .D2T1 A5:A4,*SP--[1] ; save TSR and orig A4(stack type) STDW .D2T1 A5:A4,*SP--[1] ; save TSR and orig A4(stack type)
.endm .endm
RESTORE_ALL .macro __rp, __tsr RESTORE_ALL .macro __rp, __tsr
LDDW .D2T2 *++SP[1],B9:B8 ; get TSR (B9) LDDW .D2T2 *++SP[1],B9:B8 ; get TSR (B9)
LDDW .D2T2 *++SP[1],B11:B10 ; get RILC (B11) and ILC (B10) LDDW .D2T2 *++SP[1],B11:B10 ; get RILC (B11) and ILC (B10)
LDDW .D2T2 *++SP[1],B13:B12 ; get PC (B13) and CSR (B12) LDDW .D2T2 *++SP[1],B13:B12 ; get PC (B13) and CSR (B12)
ADDAW .D1X SP,30,A15 ADDAW .D1X SP,30,A15
@ -127,7 +127,7 @@ RESTORE_ALL .macro __rp, __tsr
|| MVKL .S1 rt_system_stack_top,A15 || MVKL .S1 rt_system_stack_top,A15
MVKH .S1 rt_system_stack_top,A15 MVKH .S1 rt_system_stack_top,A15
|| ADDAW .D1X SP,6,A14 || ADDAW .D1X SP,6,A14
STW .D1T1 A14,*A15 ; save system stack pointer STW .D1T1 A14,*A15 ; save system stack pointer
LDDW .D2T1 *++SP[1],A15:A14 LDDW .D2T1 *++SP[1],A15:A14
LDDW .D2T2 *+SP[1],SP:DP LDDW .D2T2 *+SP[1],SP:DP
@ -139,7 +139,7 @@ THREAD_SAVE_ALL .macro __rp, __tsr
SUBAW .D2 SP,2,SP SUBAW .D2 SP,2,SP
ADD .D1X SP,-8,A15 ADD .D1X SP,-8,A15
|| STDW .D2T1 A15:A14,*SP--[16] ; save A15:A14 || STDW .D2T1 A15:A14,*SP--[16] ; save A15:A14
STDW .D2T2 B13:B12,*SP--[1] STDW .D2T2 B13:B12,*SP--[1]
|| STDW .D1T1 A13:A12,*A15--[1] || STDW .D1T1 A13:A12,*A15--[1]
@ -181,7 +181,7 @@ THREAD_SAVE_ALL .macro __rp, __tsr
STDW .D2T2 B17:B16,*SP--[1] STDW .D2T2 B17:B16,*SP--[1]
|| STDW .D1T1 A17:A16,*A15--[1] || STDW .D1T1 A17:A16,*A15--[1]
STDW .D2T2 B13:B12,*SP--[1] ; save PC and CSR STDW .D2T2 B13:B12,*SP--[1] ; save PC and CSR
STDW .D2T2 B11:B10,*SP--[1] ; save RILC and ILC STDW .D2T2 B11:B10,*SP--[1] ; save RILC and ILC
STDW .D2T1 A5:A4,*SP--[1] ; save TSR and orig A4(stack type) STDW .D2T1 A5:A4,*SP--[1] ; save TSR and orig A4(stack type)
.endm .endm

View File

@ -194,4 +194,3 @@ void hw_int15_handler(void)
{ {
} }

View File

@ -26,8 +26,8 @@ rt_uint32_t rt_thread_switch_interrupt_flag;
*/ */
void rt_hw_interrupt_init(void) void rt_hw_interrupt_init(void)
{ {
// initial system trap // initial system trap
rt_trap_init(); rt_trap_init();
/* init exceptions table */ /* init exceptions table */
rt_memset(isr_table, 0x00, sizeof(isr_table)); rt_memset(isr_table, 0x00, sizeof(isr_table));

View File

@ -9,11 +9,11 @@
; ;
;----------------------------------------------------------- ;-----------------------------------------------------------
; interrupt and execption handler for C6000 DSP ; interrupt and execption handler for C6000 DSP
;----------------------------------------------------------- ;-----------------------------------------------------------
;----------------------------------------------------------- ;-----------------------------------------------------------
; macro definition ; macro definition
;----------------------------------------------------------- ;-----------------------------------------------------------
DP .set B14 DP .set B14
SP .set B15 SP .set B15
@ -22,7 +22,7 @@ SP .set B15
; ;
.include "contextinc.asm" .include "contextinc.asm"
;----------------------------------------------------------- ;-----------------------------------------------------------
; global function ; global function
;----------------------------------------------------------- ;-----------------------------------------------------------
.global _nmi_handler .global _nmi_handler
.global _bad_handler .global _bad_handler
@ -43,7 +43,7 @@ SP .set B15
; ;
;----------------------------------------------------------- ;-----------------------------------------------------------
; extern function ; extern function
;----------------------------------------------------------- ;-----------------------------------------------------------
.ref hw_nmi_handler .ref hw_nmi_handler
.ref hw_bad_handler .ref hw_bad_handler
@ -66,7 +66,7 @@ SP .set B15
; ;
;----------------------------------------------------------- ;-----------------------------------------------------------
; extern variable ; extern variable
;----------------------------------------------------------- ;-----------------------------------------------------------
.ref rt_system_stack_top .ref rt_system_stack_top
; ;
@ -74,7 +74,7 @@ SP .set B15
; ;
;----------------------------------------------------------- ;-----------------------------------------------------------
; interrupt macro definition ; interrupt macro definition
;----------------------------------------------------------- ;-----------------------------------------------------------
RT_INTERRUPT_ENTRY .macro RT_INTERRUPT_ENTRY .macro
SAVE_ALL IRP,ITSR SAVE_ALL IRP,ITSR
@ -86,7 +86,7 @@ RT_CALL_INT .macro __isr
NOP 5 NOP 5
.endm .endm
;----------------------------------------------------------- ;-----------------------------------------------------------
; execption macro definition ; execption macro definition
;----------------------------------------------------------- ;-----------------------------------------------------------
RT_EXECPTION_ENTRY .macro RT_EXECPTION_ENTRY .macro
SAVE_ALL NRP,NTSR SAVE_ALL NRP,NTSR
@ -94,7 +94,7 @@ RT_EXECPTION_ENTRY .macro
RT_EXECPTION_EXIT .macro RT_EXECPTION_EXIT .macro
RESTORE_ALL NRP,NTSR RESTORE_ALL NRP,NTSR
B .S2 NRP ; return from execption B .S2 NRP ; return from execption
NOP 5 NOP 5
.endm .endm

View File

@ -35,73 +35,73 @@ ADDRESS_MSK .set 0xFFFFFFF0
;{ ;{
.global rt_hw_stack_init .global rt_hw_stack_init
rt_hw_stack_init: rt_hw_stack_init:
SUB A6,1,B1 ; SUB A6,1,B1 ;
MVKL .S1 ADDRESS_MSK,A1 ; MVKL .S1 ADDRESS_MSK,A1 ;
MVKH .S1 ADDRESS_MSK,A1 ; Build address mask MVKH .S1 ADDRESS_MSK,A1 ; Build address mask
MVC .S2 CSR,B0 ; MVC .S2 CSR,B0 ;
AND -2,B0,B0 ; Clear GIE bit AND -2,B0,B0 ; Clear GIE bit
OR 2,B0,B0 ; Set PGIE bit for interrupt return OR 2,B0,B0 ; Set PGIE bit for interrupt return
AND A1,B1,B1 ; Ensure alignment AND A1,B1,B1 ; Ensure alignment
; ;
; Actually build the stack frame. ; Actually build the stack frame.
; ;
MV .S1 B1,A3 MV .S1 B1,A3
MV .S1 B14,A2 MV .S1 B14,A2
STDW .D2T1 A3:A2,*--B1[1] ; Initial B15:B14 STDW .D2T1 A3:A2,*--B1[1] ; Initial B15:B14
SUBAW .D2 B1,2,B1 SUBAW .D2 B1,2,B1
ZERO A2 ZERO A2
ZERO A3 ; Clear value ZERO A3 ; Clear value
STDW .D2T1 A3:A2,*B1--[1] ; Initial A15:A14 STDW .D2T1 A3:A2,*B1--[1] ; Initial A15:A14
STDW .D2T1 A3:A2,*B1--[1] ; Initial A13:A12 STDW .D2T1 A3:A2,*B1--[1] ; Initial A13:A12
STDW .D2T1 A3:A2,*B1--[1] ; Initial A11:A10 STDW .D2T1 A3:A2,*B1--[1] ; Initial A11:A10
STDW .D2T1 A3:A2,*B1--[1] ; Initial A9:A8 STDW .D2T1 A3:A2,*B1--[1] ; Initial A9:A8
STDW .D2T1 A3:A2,*B1--[1] ; Initial A7:A6 STDW .D2T1 A3:A2,*B1--[1] ; Initial A7:A6
MV .S1 B4,A2 MV .S1 B4,A2
STDW .D2T1 A3:A2,*B1--[1] ; Initial A5:A4 STDW .D2T1 A3:A2,*B1--[1] ; Initial A5:A4
ZERO A2 ZERO A2
STDW .D2T1 A3:A2,*B1--[1] ; Initial A3:A2 STDW .D2T1 A3:A2,*B1--[1] ; Initial A3:A2
STDW .D2T1 A3:A2,*B1--[1] ; Initial A1:A0 STDW .D2T1 A3:A2,*B1--[1] ; Initial A1:A0
STDW .D2T1 A3:A2,*B1--[1] ; Initial A31:A30 STDW .D2T1 A3:A2,*B1--[1] ; Initial A31:A30
STDW .D2T1 A3:A2,*B1--[1] ; Initial A29:A28 STDW .D2T1 A3:A2,*B1--[1] ; Initial A29:A28
STDW .D2T1 A3:A2,*B1--[1] ; Initial A27:A26 STDW .D2T1 A3:A2,*B1--[1] ; Initial A27:A26
STDW .D2T1 A3:A2,*B1--[1] ; Initial A25:A24 STDW .D2T1 A3:A2,*B1--[1] ; Initial A25:A24
STDW .D2T1 A3:A2,*B1--[1] ; Initial A23:A22 STDW .D2T1 A3:A2,*B1--[1] ; Initial A23:A22
STDW .D2T1 A3:A2,*B1--[1] ; Initial A21:A20 STDW .D2T1 A3:A2,*B1--[1] ; Initial A21:A20
STDW .D2T1 A3:A2,*B1--[1] ; Initial A19:A18 STDW .D2T1 A3:A2,*B1--[1] ; Initial A19:A18
STDW .D2T1 A3:A2,*B1--[1] ; Initial A17:A16 STDW .D2T1 A3:A2,*B1--[1] ; Initial A17:A16
STDW .D2T1 A3:A2,*B1--[1] ; Initial B13:B12 STDW .D2T1 A3:A2,*B1--[1] ; Initial B13:B12
STDW .D2T1 A3:A2,*B1--[1] ; Initial B11:B10 STDW .D2T1 A3:A2,*B1--[1] ; Initial B11:B10
STDW .D2T1 A3:A2,*B1--[1] ; Initial B9:B8 STDW .D2T1 A3:A2,*B1--[1] ; Initial B9:B8
STDW .D2T1 A3:A2,*B1--[1] ; Initial B7:B6 STDW .D2T1 A3:A2,*B1--[1] ; Initial B7:B6
STDW .D2T1 A3:A2,*B1--[1] ; Initial B5:B4 STDW .D2T1 A3:A2,*B1--[1] ; Initial B5:B4
MV .S1 B6,A3 MV .S1 B6,A3
STDW .D2T1 A3:A2,*B1--[1] ; Initial B3:B2 STDW .D2T1 A3:A2,*B1--[1] ; Initial B3:B2
ZERO A3 ZERO A3
STDW .D2T1 A3:A2,*B1--[1] ; Initial B1:B0 STDW .D2T1 A3:A2,*B1--[1] ; Initial B1:B0
STDW .D2T1 A3:A2,*B1--[1] ; Initial B31:B30 STDW .D2T1 A3:A2,*B1--[1] ; Initial B31:B30
STDW .D2T1 A3:A2,*B1--[1] ; Initial B29:B28 STDW .D2T1 A3:A2,*B1--[1] ; Initial B29:B28
STDW .D2T1 A3:A2,*B1--[1] ; Initial B27:B26 STDW .D2T1 A3:A2,*B1--[1] ; Initial B27:B26
STDW .D2T1 A3:A2,*B1--[1] ; Initial B25:B24 STDW .D2T1 A3:A2,*B1--[1] ; Initial B25:B24
STDW .D2T1 A3:A2,*B1--[1] ; Initial B23:B22 STDW .D2T1 A3:A2,*B1--[1] ; Initial B23:B22
STDW .D2T1 A3:A2,*B1--[1] ; Initial B21:B20 STDW .D2T1 A3:A2,*B1--[1] ; Initial B21:B20
STDW .D2T1 A3:A2,*B1--[1] ; Initial B19:B18 STDW .D2T1 A3:A2,*B1--[1] ; Initial B19:B18
STDW .D2T1 A3:A2,*B1--[1] ; Initial B17:B16 STDW .D2T1 A3:A2,*B1--[1] ; Initial B17:B16
MV .S1 A4,A3 MV .S1 A4,A3
MV .S1 B0,A2 MV .S1 B0,A2
STDW .D2T1 A3:A2,*B1--[1] ; Initial PC:CSR STDW .D2T1 A3:A2,*B1--[1] ; Initial PC:CSR
ZERO A2 ZERO A2
ZERO A3 ZERO A3
STDW .D2T1 A3:A2,*B1--[1] ; Initial ILC:RILC STDW .D2T1 A3:A2,*B1--[1] ; Initial ILC:RILC
B B3 B B3
MVKL .S2 0x3,B0 MVKL .S2 0x3,B0
MV .S1 B0,A3 MV .S1 B0,A3
MVKL .S1 1,A2 MVKL .S1 1,A2
STDW .D2T1 A3:A2,*B1--[1] ; Initial TSR:stack type STDW .D2T1 A3:A2,*B1--[1] ; Initial TSR:stack type
MV .S1 B1,A4 ; Save to TCB MV .S1 B1,A4 ; Save to TCB
;} ;}
.end .end

View File

@ -333,26 +333,26 @@ int rt_hw_process_exception(struct rt_hw_exp_stack_register *regs)
type_num = __fls(type) - 1; type_num = __fls(type) - 1;
switch(type_num) { switch(type_num) {
case EXCEPT_TYPE_NXF: /* NMI exception */ case EXCEPT_TYPE_NXF: /* NMI exception */
ack_exception(EXCEPT_TYPE_NXF); /* clear exception */ ack_exception(EXCEPT_TYPE_NXF); /* clear exception */
if (hw_nmi_handler != RT_NULL) if (hw_nmi_handler != RT_NULL)
hw_nmi_handler(regs); hw_nmi_handler(regs);
break; break;
case EXCEPT_TYPE_IXF: /* internal exception */ case EXCEPT_TYPE_IXF: /* internal exception */
if (process_iexcept(regs)) if (process_iexcept(regs))
return 1; return 1;
break; break;
case EXCEPT_TYPE_EXC: /* external exception */ case EXCEPT_TYPE_EXC: /* external exception */
process_except(regs); process_except(regs);
break; break;
case EXCEPT_TYPE_SXF: /* software exception */ case EXCEPT_TYPE_SXF: /* software exception */
ie_num = 8; ie_num = 8;
ack_exception(type_num); ack_exception(type_num);
break; break;
default: /* clear exception */ default: /* clear exception */
ack_exception(type_num); ack_exception(type_num);
do_trap(&iexcept_table[ie_num], regs); do_trap(&iexcept_table[ie_num], regs);
break; break;

View File

@ -41,30 +41,30 @@
enum SYSTEM_TRAP_CODE enum SYSTEM_TRAP_CODE
{ {
ABORT_BUS_ADDRERR = 0, // bus address error ABORT_BUS_ADDRERR = 0, // bus address error
ABORT_BUS_ACCERR, // bus access permission error ABORT_BUS_ACCERR, // bus access permission error
ABORT_OPCODE_ILL, // illegal opcode ABORT_OPCODE_ILL, // illegal opcode
ABORT_PRVREG_ILL, // privilege register ABORT_PRVREG_ILL, // privilege register
ABORT_PRVOPC_ILL, // privileged opcode ABORT_PRVOPC_ILL, // privileged opcode
ABORT_ILLTRP_ILL, // illegal trap ABORT_ILLTRP_ILL, // illegal trap
ABORT_BRKPT_ILL, // handling breakpoints ABORT_BRKPT_ILL, // handling breakpoints
}; };
/* /*
* abort types * abort types
*/ */
#define ABORT_TYPE_BUS 0 // bus access abnormal #define ABORT_TYPE_BUS 0 // bus access abnormal
#define ABORT_TYPE_MAP 1 // page table mapping error #define ABORT_TYPE_MAP 1 // page table mapping error
#define ABORT_TYPE_UNDDEF 0xff // undefined exception #define ABORT_TYPE_UNDDEF 0xff // undefined exception
#define ABORT_TYPE_FATAL 0xffffffff // fatal error #define ABORT_TYPE_FATAL 0xffffffff // fatal error
struct rt_exception_info { struct rt_exception_info {
char *kernel_str; char *kernel_str;
int type; int type;
int code; int code;
}; };
#define BKPT_OPCODE 0x56454314 /* illegal opcode */ #define BKPT_OPCODE 0x56454314 /* illegal opcode */
#define INTC_MEXPMASK __SYSREGA(0x018000e0, unsigned int) #define INTC_MEXPMASK __SYSREGA(0x018000e0, unsigned int)
#define __ffs(a) (_lmbd(1, _bitr(a))) #define __ffs(a) (_lmbd(1, _bitr(a)))