diff options
-rw-r--r-- | nuttx/ChangeLog | 2 | ||||
-rw-r--r-- | nuttx/Documentation/NuttX.html | 4 | ||||
-rwxr-xr-x | nuttx/arch/x86/include/i486/arch.h | 38 | ||||
-rw-r--r-- | nuttx/arch/x86/src/i486/i486_utils.S | 26 | ||||
-rw-r--r-- | nuttx/arch/x86/src/i486/up_initialstate.c | 8 | ||||
-rwxr-xr-x | nuttx/arch/x86/src/qemu/qemu_vectors.S | 34 | ||||
-rwxr-xr-x | nuttx/configs/qemu-i486/ostest/ld.script | 2 | ||||
-rwxr-xr-x | nuttx/configs/qemu-i486/ostest/setenv.sh | 2 |
8 files changed, 84 insertions, 32 deletions
diff --git a/nuttx/ChangeLog b/nuttx/ChangeLog index d61da5f5d..3101aa93e 100644 --- a/nuttx/ChangeLog +++ b/nuttx/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/nuttx/Documentation/NuttX.html b/nuttx/Documentation/NuttX.html index bf638b5ec..95b132afa 100644 --- a/nuttx/Documentation/NuttX.html +++ b/nuttx/Documentation/NuttX.html @@ -8,7 +8,7 @@ <tr align="center" bgcolor="#e4e4e4"> <td> <h1><big><font color="#3c34ec"><i>NuttX RTOS</i></font></big></h1> - <p>Last Updated: March 6, 2011</p> + <p>Last Updated: March 7, 2011</p> </td> </tr> </table> @@ -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/nuttx/arch/x86/include/i486/arch.h b/nuttx/arch/x86/include/i486/arch.h index e2dde5555..5910f08a1 100755 --- a/nuttx/arch/x86/include/i486/arch.h +++ b/nuttx/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/nuttx/arch/x86/src/i486/i486_utils.S b/nuttx/arch/x86/src/i486/i486_utils.S index eae168fbd..9010b5a71 100644 --- a/nuttx/arch/x86/src/i486/i486_utils.S +++ b/nuttx/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/nuttx/arch/x86/src/i486/up_initialstate.c b/nuttx/arch/x86/src/i486/up_initialstate.c index 6e7417d5c..1a13b8991 100644 --- a/nuttx/arch/x86/src/i486/up_initialstate.c +++ b/nuttx/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/nuttx/arch/x86/src/qemu/qemu_vectors.S b/nuttx/arch/x86/src/qemu/qemu_vectors.S index 6795203e2..55aabaf39 100755 --- a/nuttx/arch/x86/src/qemu/qemu_vectors.S +++ b/nuttx/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/nuttx/configs/qemu-i486/ostest/ld.script b/nuttx/configs/qemu-i486/ostest/ld.script index 612160e41..eb4fcd290 100755 --- a/nuttx/configs/qemu-i486/ostest/ld.script +++ b/nuttx/configs/qemu-i486/ostest/ld.script @@ -33,7 +33,7 @@ * ****************************************************************************/ -OUTPUT_ARCH(elf_i386) +OUTPUT_ARCH(i386) ENTRY(__start) SECTIONS { diff --git a/nuttx/configs/qemu-i486/ostest/setenv.sh b/nuttx/configs/qemu-i486/ostest/setenv.sh index df098332a..b119c7e62 100755 --- a/nuttx/configs/qemu-i486/ostest/setenv.sh +++ b/nuttx/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}" |