Fix QEMU context switch bug

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3361 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo
2011-03-10 18:38:37 +00:00
parent 38c0171af3
commit 36f62fdea2
2 changed files with 44 additions and 13 deletions
+12 -2
View File
@@ -61,14 +61,24 @@
/* Trace macros, use like trace 'i' to print char to serial port. */ /* Trace macros, use like trace 'i' to print char to serial port. */
.macro trace, ch .macro chout, addr, ch
#ifdef CONFIG_DEBUG #ifdef CONFIG_DEBUG
mov $0x3f8, %dx mov $\addr, %dx
mov $\ch, %al mov $\ch, %al
out %al, %dx out %al, %dx
#endif #endif
.endm .endm
.macro trace, ch
#ifdef CONFIG_DEBUG
push %eax
push %edx
chout 0x3f8, \ch
pop %edx
pop %eax
#endif
.endm
/************************************************************************** /**************************************************************************
* Public Functions * Public Functions
**************************************************************************/ **************************************************************************/
+24 -3
View File
@@ -57,14 +57,24 @@
/* Trace macros, use like trace 'i' to print char to serial port. */ /* Trace macros, use like trace 'i' to print char to serial port. */
.macro trace, ch .macro chout, addr, ch
#ifdef CONFIG_DEBUG #ifdef CONFIG_DEBUG
mov $0x3f8, %dx mov $\addr, %dx
mov $\ch, %al mov $\ch, %al
out %al, %dx out %al, %dx
#endif #endif
.endm .endm
.macro trace, ch
#ifdef CONFIG_DEBUG
push %eax
push %edx
chout 0x3f8, \ch
pop %edx
pop %eax
#endif
.endm
/************************************************************************** /**************************************************************************
* .text * .text
**************************************************************************/ **************************************************************************/
@@ -132,13 +142,24 @@ up_saveusercontext:
movl %ebp, (4*REG_EBP)(%eax) movl %ebp, (4*REG_EBP)(%eax)
/* Save EAX=1. This will be the "apparent" return value from this
* function when context is switch back to this thread. The non-zero
* return value is the indication that we have been resumed.
*/
movl $1, (4*REG_EAX)(%eax)
/* Get and save the interrupt state */ /* Get and save the interrupt state */
pushf pushf
pop %ecx pop %ecx
movl %ecx, (4*REG_EFLAGS)(%eax) movl %ecx, (4*REG_EFLAGS)(%eax)
/* And return 0. 'ret' will remove the EIP from the top of the stack. */ /* And return 0 -- The zero return value is the indication that that
* this is the original, "true" return from the function.
*
* 'ret' will remove the EIP from the top of the stack.
*/
xorl %eax, %eax xorl %eax, %eax
ret ret