diff --git a/ChangeLog b/ChangeLog index d61da5f5de9..3101aa93e5e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1530,3 +1530,5 @@ reported by Uros Platise). * drivers/mtd/ramtron.c - Driver for SPI-based RAMTRON NVRAM devices FM25V10 (and others). Contributed by Uros Platise. + * examples/nsh and tools/mkromfsimg.sh -- Add support for platform-specific + ROMFS-based NSH start-up scripts. diff --git a/Documentation/NuttX.html b/Documentation/NuttX.html index bf638b5ec84..95b132afade 100644 --- a/Documentation/NuttX.html +++ b/Documentation/NuttX.html @@ -8,7 +8,7 @@

NuttX RTOS

-

Last Updated: March 6, 2011

+

Last Updated: March 7, 2011

@@ -2154,6 +2154,8 @@ nuttx-5.19 2011-xx-xx Gregory Nutt <spudmonkey@racsa.co.cr> reported by Uros Platise). * drivers/mtd/ramtron.c - Driver for SPI-based RAMTRON NVRAM devices FM25V10 (and others). Contributed by Uros Platise. + * examples/nsh and tools/mkromfsimg.sh -- Add support for platform-specific + ROMFS-based NSH start-up scripts. pascal-2.1 2011-xx-xx Gregory Nutt <spudmonkey@racsa.co.cr> diff --git a/arch/x86/include/i486/arch.h b/arch/x86/include/i486/arch.h index e2dde5555fc..5910f08a15e 100755 --- a/arch/x86/include/i486/arch.h +++ b/arch/x86/include/i486/arch.h @@ -163,6 +163,44 @@ static inline uint32_t up_getsp() 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 ****************************************************************************/ diff --git a/arch/x86/src/i486/i486_utils.S b/arch/x86/src/i486/i486_utils.S index eae168fbd6d..9010b5a7116 100644 --- a/arch/x86/src/i486/i486_utils.S +++ b/arch/x86/src/i486/i486_utils.S @@ -52,6 +52,8 @@ # define SYMBOL(s) s #endif +#define KSEG 0x10 + /**************************************************************************** * Nasm ****************************************************************************/ @@ -84,12 +86,12 @@ SYMBOL(gdt_flush): mov eax, [esp+4] /* Get the pointer to the GDT, passed as a parameter */ lgdt [eax] /* Load the new GDT pointer */ - mov ax, 0x10 /* 0x10 is the offset in the GDT to our data segment */ - mov ds, ax /* Load all data segment selectors */ - mov es, ax - mov fs, ax - mov gs, ax - mov ss, ax + mov $KSEG, ax /* KSEG is the offset in the GDT to our data segment */ + mov ax, ds /* Load all data segment selectors */ + mov ax, es + mov ax, fs + mov ax, gs + mov ax, ss jmp 0x08:.gflush /* 0x08 is the offset to our code segment: Far jump! */ .gflush: ret @@ -135,12 +137,12 @@ SYMBOL(gdt_flush): movl %eax, 4(%esp) /* Get the pointer to the GDT, passed as a parameter */ lgdt (%eax) /* Load the new GDT pointer */ - mov %ax, 0x10 /* 0x10 is the offset in the GDT to our data segment */ - mov %ds, %ax /* Load all data segment selectors */ - mov %es, %ax - mov %fs, %ax - mov %gs, %ax - mov %ss, %ax + mov $KSEG, %ax /* KSEG is the offset in the GDT to our data segment */ + mov %ax, %ds /* Load all data segment selectors */ + mov %ax, %es + mov %ax, %fs + mov %ax, %gs + mov %ax, %ss jmp $0x08, $.Lgflush /* 0x08 is the offset to our code segment: Far jump! */ .Lgflush: ret diff --git a/arch/x86/src/i486/up_initialstate.c b/arch/x86/src/i486/up_initialstate.c index 6e7417d5c39..1a13b89915e 100644 --- a/arch/x86/src/i486/up_initialstate.c +++ b/arch/x86/src/i486/up_initialstate.c @@ -93,6 +93,14 @@ void up_initial_state(_TCB *tcb) 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 * bit is set, maskable interrupts will be enabled. */ diff --git a/arch/x86/src/qemu/qemu_vectors.S b/arch/x86/src/qemu/qemu_vectors.S index 6795203e268..55aabaf39a3 100755 --- a/arch/x86/src/qemu/qemu_vectors.S +++ b/arch/x86/src/qemu/qemu_vectors.S @@ -408,14 +408,14 @@ isr_common: /* trace 'S' */ 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 */ - mov %ax, KSEG /* Load the kernel data segment descriptor */ - mov %ds, %ax - mov %es, %ax - mov %fs, %ax - mov %gs, %ax + mov $KSEG, %ax /* Load the kernel data segment descriptor */ + mov %ax, %ds + mov %ax, %es + mov %ax, %fs + mov %ax, %gs /* 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. @@ -446,14 +446,14 @@ irq_common: /* trace 'R' */ 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 */ - mov %ax, KSEG /* Load the kernel data segment descriptor */ - mov %ds, %ax - mov %es, %ax - mov %fs, %ax - mov %gs, %ax + mov $KSEG, %ax /* Load the kernel data segment descriptor */ + mov %ax, %ds + mov %ax, %es + mov %ax, %fs + mov %ax, %gs /* 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. @@ -488,13 +488,13 @@ irq_common: .Lnoswitch: pop %ebx /* Reload the original data segment descriptor */ - mov %ds, %bx - mov %es, %bx - mov %fs, %bx - mov %gs, %bx + mov %bx, %ds + mov %bx, %es + mov %bx, %fs + mov %bx, %gs 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 iret /* Pops 5 things at once: CS, EIP, EFLAGS, SS, and ESP */ #ifndef __CYGWIN__ diff --git a/configs/qemu-i486/ostest/ld.script b/configs/qemu-i486/ostest/ld.script index 612160e41f0..eb4fcd290c2 100755 --- a/configs/qemu-i486/ostest/ld.script +++ b/configs/qemu-i486/ostest/ld.script @@ -33,7 +33,7 @@ * ****************************************************************************/ -OUTPUT_ARCH(elf_i386) +OUTPUT_ARCH(i386) ENTRY(__start) SECTIONS { diff --git a/configs/qemu-i486/ostest/setenv.sh b/configs/qemu-i486/ostest/setenv.sh index df098332ab1..b119c7e62cf 100755 --- a/configs/qemu-i486/ostest/setenv.sh +++ b/configs/qemu-i486/ostest/setenv.sh @@ -42,7 +42,7 @@ if [ -z ${PATH_ORIG} ]; then export PATH_ORIG=${PATH}; fi # Uncomment and modify the following if you are using anything other # than the system GCC # WD=`pwd` -# export BUILDROOT_BIN="${WD}/../../buildroot/build_i486/staging_dir/bin" +# export BUILDROOT_BIN="${WD}/../../../buildroot/build_i486/staging_dir/bin" # export PATH="${BUILDROOT_BIN}:/sbin:/usr/sbin:${PATH_ORIG}" echo "PATH : ${PATH}"