misc QEMU fixes

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3351 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2011-03-08 01:24:42 +00:00
parent 47f6b44c9a
commit 42ab9cc60c
4 changed files with 77 additions and 29 deletions

View File

@ -163,6 +163,44 @@ static inline uint32_t up_getsp()
return regval; return regval;
} }
/* Get segment registers */
static inline uint32_t up_getds()
{
uint32_t regval;
asm volatile(
"\tmov %%ds, %0\n"
: "=rm" (regval)
:
: "memory");
return regval;
}
static inline uint32_t up_getcs()
{
uint32_t regval;
asm volatile(
"\tmov %%cs, %0\n"
: "=rm" (regval)
:
: "memory");
return regval;
}
static inline uint32_t up_getss()
{
uint32_t regval;
asm volatile(
"\tmov %%ss, %0\n"
: "=rm" (regval)
:
: "memory");
return regval;
}
/**************************************************************************** /****************************************************************************
* Public Types * Public Types
****************************************************************************/ ****************************************************************************/

View File

@ -52,6 +52,8 @@
# define SYMBOL(s) s # define SYMBOL(s) s
#endif #endif
#define KSEG 0x10
/**************************************************************************** /****************************************************************************
* Nasm * Nasm
****************************************************************************/ ****************************************************************************/
@ -84,12 +86,12 @@ SYMBOL(gdt_flush):
mov eax, [esp+4] /* Get the pointer to the GDT, passed as a parameter */ mov eax, [esp+4] /* Get the pointer to the GDT, passed as a parameter */
lgdt [eax] /* Load the new GDT pointer */ lgdt [eax] /* Load the new GDT pointer */
mov ax, 0x10 /* 0x10 is the offset in the GDT to our data segment */ mov $KSEG, ax /* KSEG is the offset in the GDT to our data segment */
mov ds, ax /* Load all data segment selectors */ mov ax, ds /* Load all data segment selectors */
mov es, ax mov ax, es
mov fs, ax mov ax, fs
mov gs, ax mov ax, gs
mov ss, ax mov ax, ss
jmp 0x08:.gflush /* 0x08 is the offset to our code segment: Far jump! */ jmp 0x08:.gflush /* 0x08 is the offset to our code segment: Far jump! */
.gflush: .gflush:
ret ret
@ -135,12 +137,12 @@ SYMBOL(gdt_flush):
movl %eax, 4(%esp) /* Get the pointer to the GDT, passed as a parameter */ movl %eax, 4(%esp) /* Get the pointer to the GDT, passed as a parameter */
lgdt (%eax) /* Load the new GDT pointer */ lgdt (%eax) /* Load the new GDT pointer */
mov %ax, 0x10 /* 0x10 is the offset in the GDT to our data segment */ mov $KSEG, %ax /* KSEG is the offset in the GDT to our data segment */
mov %ds, %ax /* Load all data segment selectors */ mov %ax, %ds /* Load all data segment selectors */
mov %es, %ax mov %ax, %es
mov %fs, %ax mov %ax, %fs
mov %gs, %ax mov %ax, %gs
mov %ss, %ax mov %ax, %ss
jmp $0x08, $.Lgflush /* 0x08 is the offset to our code segment: Far jump! */ jmp $0x08, $.Lgflush /* 0x08 is the offset to our code segment: Far jump! */
.Lgflush: .Lgflush:
ret ret

View File

@ -93,6 +93,14 @@ void up_initial_state(_TCB *tcb)
xcp->regs[REG_EIP] = (uint32_t)tcb->start; xcp->regs[REG_EIP] = (uint32_t)tcb->start;
/* Set up the segment registers... assume the same segment as the caller.
* That is not a good assumption in the long run.
*/
xcp->regs[REG_DS] = up_getds();
xcp->regs[REG_CS] = up_getcs();
xcp->regs[REG_SS] = up_getss();
/* Enable or disable interrupts, based on user configuration. If the IF /* Enable or disable interrupts, based on user configuration. If the IF
* bit is set, maskable interrupts will be enabled. * bit is set, maskable interrupts will be enabled.
*/ */

View File

@ -408,14 +408,14 @@ isr_common:
/* trace 'S' */ /* trace 'S' */
pusha /* Pushes edi,esi,ebp,esp,ebx,edx,ecx,eax */ pusha /* Pushes edi,esi,ebp,esp,ebx,edx,ecx,eax */
mov %ax, %ds /* Lower 16-bits of eax = ds. */ mov %ds, %ax /* Lower 16-bits of eax = ds. */
pushl %eax /* Save the data segment descriptor */ pushl %eax /* Save the data segment descriptor */
mov %ax, KSEG /* Load the kernel data segment descriptor */ mov $KSEG, %ax /* Load the kernel data segment descriptor */
mov %ds, %ax mov %ax, %ds
mov %es, %ax mov %ax, %es
mov %fs, %ax mov %ax, %fs
mov %gs, %ax mov %ax, %gs
/* The current value of the SP points to the beginning of the state save /* The current value of the SP points to the beginning of the state save
* structure. Save that on the stack as the input parameter to isr_handler. * structure. Save that on the stack as the input parameter to isr_handler.
@ -446,14 +446,14 @@ irq_common:
/* trace 'R' */ /* trace 'R' */
pusha /* Pushes edi,esi,ebp,esp,ebx,edx,ecx,eax */ pusha /* Pushes edi,esi,ebp,esp,ebx,edx,ecx,eax */
mov %ax, %ds /* Lower 16-bits of eax = ds. */ mov %ds, %ax /* Lower 16-bits of eax = ds. */
push %eax /* Save the data segment descriptor */ push %eax /* Save the data segment descriptor */
mov %ax, KSEG /* Load the kernel data segment descriptor */ mov $KSEG, %ax /* Load the kernel data segment descriptor */
mov %ds, %ax mov %ax, %ds
mov %es, %ax mov %ax, %es
mov %fs, %ax mov %ax, %fs
mov %gs, %ax mov %ax, %gs
/* The current value of the SP points to the beginning of the state save /* The current value of the SP points to the beginning of the state save
* structure. Save that on the stack as the input parameter to irq_handler. * structure. Save that on the stack as the input parameter to irq_handler.
@ -488,13 +488,13 @@ irq_common:
.Lnoswitch: .Lnoswitch:
pop %ebx /* Reload the original data segment descriptor */ pop %ebx /* Reload the original data segment descriptor */
mov %ds, %bx mov %bx, %ds
mov %es, %bx mov %bx, %es
mov %fs, %bx mov %bx, %fs
mov %gs, %bx mov %bx, %gs
popa /* Pops edi,esi,ebp... */ popa /* Pops edi,esi,ebp... */
add %esp, 8 /* Cleans up the pushed error code and pushed ISR number */ add $8, %esp /* Cleans up the pushed error code and pushed ISR number */
sti sti
iret /* Pops 5 things at once: CS, EIP, EFLAGS, SS, and ESP */ iret /* Pops 5 things at once: CS, EIP, EFLAGS, SS, and ESP */
#ifndef __CYGWIN__ #ifndef __CYGWIN__