From f5e796e604e6454c8fbc6639040fe0fd5afd4973 Mon Sep 17 00:00:00 2001 From: patacongo Date: Thu, 10 Mar 2011 18:38:37 +0000 Subject: [PATCH] Fix QEMU context switch bug git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3361 42af7a65-404d-4744-a932-0658087f49c3 --- arch/x86/src/qemu/qemu_fullcontextrestore.S | 16 ++++++-- arch/x86/src/qemu/qemu_saveusercontext.S | 41 ++++++++++++++++----- 2 files changed, 44 insertions(+), 13 deletions(-) diff --git a/arch/x86/src/qemu/qemu_fullcontextrestore.S b/arch/x86/src/qemu/qemu_fullcontextrestore.S index 7d25e9072ed..9a1e1e64e4f 100644 --- a/arch/x86/src/qemu/qemu_fullcontextrestore.S +++ b/arch/x86/src/qemu/qemu_fullcontextrestore.S @@ -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 diff --git a/arch/x86/src/qemu/qemu_saveusercontext.S b/arch/x86/src/qemu/qemu_saveusercontext.S index ffa1cf7f627..e9a98b33154 100644 --- a/arch/x86/src/qemu/qemu_saveusercontext.S +++ b/arch/x86/src/qemu/qemu_saveusercontext.S @@ -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