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:
parent
38c0171af3
commit
36f62fdea2
@ -61,14 +61,24 @@
|
||||
|
||||
/* Trace macros, use like trace 'i' to print char to serial port. */
|
||||
|
||||
.macro trace, ch
|
||||
.macro chout, addr, ch
|
||||
#ifdef CONFIG_DEBUG
|
||||
mov $0x3f8, %dx
|
||||
mov $\addr, %dx
|
||||
mov $\ch, %al
|
||||
out %al, %dx
|
||||
#endif
|
||||
.endm
|
||||
|
||||
.macro trace, ch
|
||||
#ifdef CONFIG_DEBUG
|
||||
push %eax
|
||||
push %edx
|
||||
chout 0x3f8, \ch
|
||||
pop %edx
|
||||
pop %eax
|
||||
#endif
|
||||
.endm
|
||||
|
||||
/**************************************************************************
|
||||
* Public Functions
|
||||
**************************************************************************/
|
||||
@ -151,5 +161,5 @@ up_fullcontextrestore:
|
||||
popl %eax
|
||||
iret
|
||||
.size up_fullcontextrestore, . - up_fullcontextrestore
|
||||
.end
|
||||
.end
|
||||
|
||||
|
@ -57,14 +57,24 @@
|
||||
|
||||
/* Trace macros, use like trace 'i' to print char to serial port. */
|
||||
|
||||
.macro trace, ch
|
||||
.macro chout, addr, ch
|
||||
#ifdef CONFIG_DEBUG
|
||||
mov $0x3f8, %dx
|
||||
mov $\addr, %dx
|
||||
mov $\ch, %al
|
||||
out %al, %dx
|
||||
#endif
|
||||
.endm
|
||||
|
||||
.macro trace, ch
|
||||
#ifdef CONFIG_DEBUG
|
||||
push %eax
|
||||
push %edx
|
||||
chout 0x3f8, \ch
|
||||
pop %edx
|
||||
pop %eax
|
||||
#endif
|
||||
.endm
|
||||
|
||||
/**************************************************************************
|
||||
* .text
|
||||
**************************************************************************/
|
||||
@ -132,15 +142,26 @@ up_saveusercontext:
|
||||
|
||||
movl %ebp, (4*REG_EBP)(%eax)
|
||||
|
||||
/* Get and save the interrupt state */
|
||||
|
||||
pushf
|
||||
pop %ecx
|
||||
movl %ecx, (4*REG_EFLAGS)(%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.
|
||||
*/
|
||||
|
||||
/* And return 0. 'ret' will remove the EIP from the top of the stack. */
|
||||
movl $1, (4*REG_EAX)(%eax)
|
||||
|
||||
xorl %eax, %eax
|
||||
/* Get and save the interrupt state */
|
||||
|
||||
pushf
|
||||
pop %ecx
|
||||
movl %ecx, (4*REG_EFLAGS)(%eax)
|
||||
|
||||
/* 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
|
||||
ret
|
||||
.size up_saveusercontext, . - up_saveusercontext
|
||||
.end
|
||||
.end
|
||||
|
Loading…
Reference in New Issue
Block a user