mirror of
https://github.com/apache/nuttx.git
synced 2026-05-22 05:42:05 +08:00
Add i486 toolchain support
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3349 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
@@ -2159,6 +2159,16 @@ pascal-2.1 2011-xx-xx Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||
|
||||
buildroot-1.10 2011-xx-xx <spudmonkey@racsa.co.cr>
|
||||
|
||||
* Add patch submitted by Dimiter Georgiev to work around problems in building
|
||||
GDB 6.8 with versions of Cygwin > 1.7.
|
||||
* configs/i486-defconfig-4.3.3 - Builds an i486 cross development toolchain
|
||||
using gcc 4.3.3. Why wouldyou want such a thing? On Linux, of course,
|
||||
such a thing is not needed because you can use the installed GCC to build
|
||||
i486 ELF binaries. But that will not work under Cygwin! The Cygwin
|
||||
toolchain (and probably MinGW), build DOS MZ format executables (i.e.,
|
||||
.exe files). That is probably not usable for most NuttX targets.
|
||||
Instead, you should use this i486-elf-gcc to generate true ELF binaries
|
||||
under Cygwin.
|
||||
</pre></ul>
|
||||
|
||||
<table width ="100%">
|
||||
|
||||
@@ -111,34 +111,34 @@ SYMBOL(up_fullcontextrestore):
|
||||
* stack pointer.
|
||||
*/
|
||||
|
||||
movl (REG_SP)(%eax), %esp
|
||||
movl (4*REG_SP)(%eax), %esp
|
||||
|
||||
/* Save the return address, EFLAGS, and the values as well the
|
||||
* values of EBX and EAC on the new stack.
|
||||
*/
|
||||
|
||||
movl (REG_EIP)(%eax), %ebx
|
||||
movl (4*REG_EIP)(%eax), %ebx
|
||||
push %ebx
|
||||
movl (REG_EFLAGS)(%eax), %ebx
|
||||
movl (4*REG_EFLAGS)(%eax), %ebx
|
||||
push %ebx
|
||||
movl (REG_EAX)(%eax), %ebx
|
||||
movl (4*REG_EAX)(%eax), %ebx
|
||||
push %ebx
|
||||
movl (REG_EBX)(%eax), %ebx
|
||||
movl (4*REG_EBX)(%eax), %ebx
|
||||
push %ebx
|
||||
|
||||
/* Now restore the remaining registers */
|
||||
|
||||
movl (REG_EDI)(%ebx), %edi
|
||||
movl (REG_ESI)(%ebx), %esi
|
||||
movl (REG_EBP)(%ebx), %ebp
|
||||
movl (REG_EDX)(%ebx), %edx
|
||||
movl (REG_ECX)(%ebx), %ecx
|
||||
movl (4*REG_EDI)(%ebx), %edi
|
||||
movl (4*REG_ESI)(%ebx), %esi
|
||||
movl (4*REG_EBP)(%ebx), %ebp
|
||||
movl (4*REG_EDX)(%ebx), %edx
|
||||
movl (4*REG_ECX)(%ebx), %ecx
|
||||
|
||||
/* Restore the segment registers */
|
||||
|
||||
mov (REG_DS)(%ebx), %ds
|
||||
mov (REG_CS)(%ebx), %cs
|
||||
mov (REG_SS)(%ebx), %ss
|
||||
mov (4*REG_DS)(%ebx), %ds
|
||||
mov (4*REG_CS)(%ebx), %cs
|
||||
mov (4*REG_SS)(%ebx), %ss
|
||||
|
||||
/* Restore the correct value of EAX, EBX, and the EFLAGS then return */
|
||||
|
||||
|
||||
@@ -121,37 +121,37 @@ SYMBOL(up_saveusercontext):
|
||||
* because it will be the return value from this function.
|
||||
*/
|
||||
|
||||
movl %ebx, (REG_EBX)(%eax)
|
||||
movl %esi, (REG_ESI)(%eax)
|
||||
movl %edi, (REG_EDI)(%eax)
|
||||
movl %ebx, (4*REG_EBX)(%eax)
|
||||
movl %esi, (4*REG_ESI)(%eax)
|
||||
movl %edi, (4*REG_EDI)(%eax)
|
||||
|
||||
/* Save the segment registers */
|
||||
|
||||
mov %ss, (REG_SS)(%eax)
|
||||
mov %cs, (REG_CS)(%eax)
|
||||
mov %ds, (REG_DS)(%eax)
|
||||
mov %ss, (4*REG_SS)(%eax)
|
||||
mov %cs, (4*REG_CS)(%eax)
|
||||
mov %ds, (4*REG_DS)(%eax)
|
||||
|
||||
/* Save the value of SP as will be after we return (don't bother to save
|
||||
* REG_ESP).
|
||||
*/
|
||||
|
||||
leal 4(%esp), %ecx
|
||||
movl %ecx, (REG_SP)(%eax)
|
||||
movl %ecx, (4*REG_SP)(%eax)
|
||||
|
||||
/* Fetch the PC from the stack and save it in the save block */
|
||||
|
||||
movl 0(%esp), %ecx
|
||||
movl %ecx, (REG_EIP)(%eax)
|
||||
movl %ecx, (4*REG_EIP)(%eax)
|
||||
|
||||
/* Save the framepointer */
|
||||
|
||||
movl %ebp, (REG_EBP)(%eax)
|
||||
movl %ebp, (4*REG_EBP)(%eax)
|
||||
|
||||
/* Get and save the interrupt state */
|
||||
|
||||
pushf
|
||||
pop %ecx
|
||||
movl %ecx, (REG_EFLAGS)(%eax)
|
||||
movl %ecx, (4*REG_EFLAGS)(%eax)
|
||||
|
||||
/* And return 0. 'ret' will remove the EIP from the top of the stack. */
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ Contents
|
||||
^^^^^^^^
|
||||
|
||||
* QEMU
|
||||
* Toolchains
|
||||
* Configurations
|
||||
|
||||
QEMU
|
||||
@@ -51,6 +52,57 @@ Cygwin build problems:
|
||||
binaries. I found 0.14.0 here: http://dietpc.org/windows/qemu/, or
|
||||
2. Try building QEMU with MingGW
|
||||
|
||||
Toolchains
|
||||
^^^^^^^^^^
|
||||
|
||||
Two target environments are supported: (1) Linux and (2) Cygwin under Windows.
|
||||
Any GCC toolchain that can produce i486 ELF binaries should work. On Linux,
|
||||
you can probably use the installed system gcc. But that will not work with
|
||||
Cygwin. Why? Because the Cygwin gcc (and probably the MinGW gcc as well) do
|
||||
not produce ELF final binaries but, rather, DOS MZ executables (i.e., .exe
|
||||
files). Those cannot be used with QEMU.
|
||||
|
||||
The file */setenv.sh should be modified to point to the correct path to the
|
||||
GCC toolchain (if different from the default in your PATH variable).
|
||||
|
||||
Cygwin Buildroot Toolchain
|
||||
|
||||
With Cygwin the solution is to build an i486 cross-development toolchain to
|
||||
generate the i486 ELF files needed by QEMU. The NuttX buildroot package will
|
||||
create such a toolchain.
|
||||
|
||||
NOTE: As of this writing, none of the released buildroot packages support the
|
||||
i486 build. This is only available in SVN or in any any 1.10 or later buildroot
|
||||
release.
|
||||
|
||||
Buildroot Instructions
|
||||
|
||||
1. You must have already configured Nuttx in <some-dir>/nuttx.
|
||||
|
||||
cd tools
|
||||
./configure.sh qemu-i486/<sub-dir>
|
||||
|
||||
2. Download the latest buildroot package into <some-dir>
|
||||
|
||||
3. unpack the buildroot tarball. The resulting directory may
|
||||
have versioning information on it like buildroot-x.y.z. If so,
|
||||
rename <some-dir>/buildroot-x.y.z to <some-dir>/buildroot.
|
||||
|
||||
4. cd <some-dir>/buildroot
|
||||
|
||||
5. cp configs/i486-defconfig-4.3.3 .config
|
||||
|
||||
6. make oldconfig
|
||||
|
||||
7. make
|
||||
|
||||
8. Edit setenv.h, if necessary, so that the PATH variable includes
|
||||
the path to the newly built binaries.
|
||||
|
||||
See the file configs/README.txt in the buildroot source tree. That has more
|
||||
detailed PLUS some special instructions that you will need to follow if you
|
||||
run into problems building the toolchain for Cygwin under Windows.
|
||||
|
||||
Configurations
|
||||
^^^^^^^^^^^^^^
|
||||
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
OUTPUT_ARCH(elf_i386)
|
||||
ENTRY(__start)
|
||||
SECTIONS
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user