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:
patacongo
2011-03-07 02:53:37 +00:00
parent a24491d9a5
commit 3794cea45d
5 changed files with 86 additions and 23 deletions
+10
View File
@@ -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%">
+13 -13
View File
@@ -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 */
+10 -10
View File
@@ -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. */
+52
View File
@@ -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
^^^^^^^^^^^^^^
+1
View File
@@ -33,6 +33,7 @@
*
****************************************************************************/
OUTPUT_ARCH(elf_i386)
ENTRY(__start)
SECTIONS
{