[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