[PATCH 12/12] bsps/i386: SMP and per-CPU thread dispatch disable
Sebastian Huber
sebastian.huber at embedded-brains.de
Mon Aug 5 14:08:19 UTC 2013
Interrupt support for SMP and the per-CPU thread dispatch disable level.
---
c/src/lib/libbsp/i386/shared/irq/irq_asm.S | 13 ++++++++++---
1 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/c/src/lib/libbsp/i386/shared/irq/irq_asm.S b/c/src/lib/libbsp/i386/shared/irq/irq_asm.S
index f77dd7f..d73c517 100644
--- a/c/src/lib/libbsp/i386/shared/irq/irq_asm.S
+++ b/c/src/lib/libbsp/i386/shared/irq/irq_asm.S
@@ -144,7 +144,14 @@ ISR_STOP:
.check_stack_switch:
movl esp, ebp /* ebp = previous stack pointer */
+#ifdef RTEMS_SMP
+ call SYM(_CPU_SMP_Get_current_processor)
+ sall $PER_CPU_CONTROL_SIZE_LOG2, eax
+ addl $SYM(_Per_CPU_Information), eax
+ movl eax, ebx
+#else
movl $SYM(_Per_CPU_Information), ebx
+#endif
/* is this the outermost interrupt? */
cmpl $0, PER_CPU_ISR_NEST_LEVEL(ebx)
@@ -159,8 +166,8 @@ ISR_STOP:
nested:
incl PER_CPU_ISR_NEST_LEVEL(ebx) /* one nest level deeper */
- incl SYM (_Thread_Dispatch_disable_level) /* disable multitasking */
-
+ incl PER_CPU_THREAD_DISPATCH_DISABLE_LEVEL(ebx) /* disable
+ multitasking */
/*
* GCC versions starting with 4.3 no longer place the cld
* instruction before string operations. We need to ensure
@@ -215,7 +222,7 @@ nested:
/* If interrupts are nested, */
/* then dispatching is disabled */
- decl SYM (_Thread_Dispatch_disable_level)
+ decl PER_CPU_THREAD_DISPATCH_DISABLE_LEVEL(ebx)
/* unnest multitasking */
/* Is dispatch disabled */
jne .exit /* Yes, then exit */
--
1.7.7
More information about the devel
mailing list