# HG changeset patch # User Mychaela Falconia # Date 1532057725 0 # Node ID 4484ab3f6ab3a47a88dfb60b95c63fec2bb5c570 # Parent 8019491a67a9821a082d9178b33e5abc988bb551 FFS interrupt voodoo: made original TMS470 approach work with gcc diff -r 8019491a67a9 -r 4484ab3f6ab3 src/cs/drivers/drv_app/ffs/board/amdsbdrv.c --- a/src/cs/drivers/drv_app/ffs/board/amdsbdrv.c Fri Jul 20 02:48:06 2018 +0000 +++ b/src/cs/drivers/drv_app/ffs/board/amdsbdrv.c Fri Jul 20 03:35:25 2018 +0000 @@ -13,7 +13,6 @@ #include "ffs/ffs.h" #include "ffs/board/drv.h" #include "ffs/board/ffstrace.h" -#include "nucleus.h" // Due to long branches, we disable all tracing and led function calls. @@ -142,30 +141,48 @@ * Interrupt Enable/Disable ******************************************************************************/ -uint32 amd_int_disable(void) +#ifdef __GNUC__ +#define NOINLINE __attribute__ ((noinline)) +#else +#define NOINLINE +#endif + +uint32 NOINLINE amd_int_disable(void) { #ifdef __GNUC__ - return NU_Control_Interrupts(0xC0); + asm(" .code 16"); #else asm(" .state16"); +#endif asm(" mov A1, #0xC0"); asm(" ldr A2, tct_amd_disable"); asm(" bx A2 "); +#ifdef __GNUC__ + asm(".balign 4"); + asm("tct_amd_disable:"); + asm(" .word TCT_Control_Interrupts"); +#else asm("tct_amd_disable .field _TCT_Control_Interrupts+0,32"); asm(" .global _TCT_Control_Interrupts"); #endif } -void amd_int_enable(uint32 cpsr) +void NOINLINE amd_int_enable(uint32 cpsr) { #ifdef __GNUC__ - return NU_Control_Interrupts(cpsr); + asm(" .code 16"); #else asm(" .state16"); +#endif asm(" ldr A2, tct_amd_enable"); asm(" bx A2 "); +#ifdef __GNUC__ + asm(".balign 4"); + asm("tct_amd_enable:"); + asm(" .word TCT_Control_Interrupts"); +#else asm("tct_amd_enable .field _TCT_Control_Interrupts+0,32"); asm(" .global _TCT_Control_Interrupts"); #endif diff -r 8019491a67a9 -r 4484ab3f6ab3 src/cs/drivers/drv_app/ffs/board/drv.c --- a/src/cs/drivers/drv_app/ffs/board/drv.c Fri Jul 20 02:48:06 2018 +0000 +++ b/src/cs/drivers/drv_app/ffs/board/drv.c Fri Jul 20 03:35:25 2018 +0000 @@ -1426,30 +1426,48 @@ // Note that we use our own interrupt disable/enable function because // Nucleus allegedly should have a bug in its implementation for this. -uint32 int_disable(void) +#ifdef __GNUC__ +#define NOINLINE __attribute__ ((noinline)) +#else +#define NOINLINE +#endif + +uint32 NOINLINE int_disable(void) { #ifdef __GNUC__ - return NU_Control_Interrupts(0xC0); + asm(" .code 16"); #else asm(" .state16"); +#endif asm(" mov A1, #0xC0"); asm(" ldr A2, tct_disable"); asm(" bx A2 "); +#ifdef __GNUC__ + asm(".balign 4"); + asm("tct_disable:"); + asm(" .word TCT_Control_Interrupts"); +#else asm("tct_disable .field _TCT_Control_Interrupts+0,32"); asm(" .global _TCT_Control_Interrupts"); #endif } -void int_enable(uint32 cpsr) +void NOINLINE int_enable(uint32 cpsr) { #ifdef __GNUC__ - return NU_Control_Interrupts(cpsr); + asm(" .code 16"); #else asm(" .state16"); +#endif asm(" ldr A2, tct_enable"); asm(" bx A2 "); +#ifdef __GNUC__ + asm(".balign 4"); + asm("tct_enable:"); + asm(" .word TCT_Control_Interrupts"); +#else asm("tct_enable .field _TCT_Control_Interrupts+0,32"); asm(" .global _TCT_Control_Interrupts"); #endif diff -r 8019491a67a9 -r 4484ab3f6ab3 src/cs/drivers/drv_app/ffs/board/intelsbdrv.c --- a/src/cs/drivers/drv_app/ffs/board/intelsbdrv.c Fri Jul 20 02:48:06 2018 +0000 +++ b/src/cs/drivers/drv_app/ffs/board/intelsbdrv.c Fri Jul 20 03:35:25 2018 +0000 @@ -13,7 +13,6 @@ #include "ffs/ffs.h" #include "ffs/board/drv.h" #include "ffs/board/ffstrace.h" -#include "nucleus.h" #define INTEL_UNLOCK_SLOW 1 @@ -226,30 +225,48 @@ * Interrupt Enable/Disable ******************************************************************************/ -uint32 intel_int_disable(void) +#ifdef __GNUC__ +#define NOINLINE __attribute__ ((noinline)) +#else +#define NOINLINE +#endif + +uint32 NOINLINE intel_int_disable(void) { #ifdef __GNUC__ - return NU_Control_Interrupts(0xC0); + asm(" .code 16"); #else asm(" .state16"); +#endif asm(" mov A1, #0xC0"); asm(" ldr A2, tct_intel_disable"); asm(" bx A2 "); +#ifdef __GNUC__ + asm(".balign 4"); + asm("tct_intel_disable:"); + asm(" .word TCT_Control_Interrupts"); +#else asm("tct_intel_disable .field _TCT_Control_Interrupts+0,32"); asm(" .global _TCT_Control_Interrupts"); #endif } -void intel_int_enable(uint32 cpsr) +void NOINLINE intel_int_enable(uint32 cpsr) { #ifdef __GNUC__ - return NU_Control_Interrupts(cpsr); + asm(" .code 16"); #else asm(" .state16"); +#endif asm(" ldr A2, tct_intel_enable"); asm(" bx A2 "); +#ifdef __GNUC__ + asm(".balign 4"); + asm("tct_intel_enable:"); + asm(" .word TCT_Control_Interrupts"); +#else asm("tct_intel_enable .field _TCT_Control_Interrupts+0,32"); asm(" .global _TCT_Control_Interrupts"); #endif