summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2013-08-02 16:28:23 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2013-08-09 23:02:45 +0200
commit4e3b7e26a29fccd3022d0c021c54b51f2d081c1d (patch)
treedec81e649181c584584d162cb6e08cd3e147b342
parentbsps/i386: Revert most SMP related changes (diff)
downloadrtems-4e3b7e26a29fccd3022d0c021c54b51f2d081c1d.tar.bz2
bsps/i386: SMP and per-CPU thread dispatch disable
Interrupt support for SMP and the per-CPU thread dispatch disable level.
-rw-r--r--c/src/lib/libbsp/i386/shared/irq/irq_asm.S13
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 f77dd7f0cf..d73c51725d 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 */