summaryrefslogtreecommitdiffstats
path: root/bsps/i386
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2018-04-20 10:35:35 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2018-04-20 13:52:14 +0200
commit99648958668d3a33ee57974479b36201fe303f34 (patch)
tree6f27ea790e2823c6156e71219a4f54680263fac6 /bsps/i386
parentbsps: Move start files to bsps (diff)
downloadrtems-99648958668d3a33ee57974479b36201fe303f34.tar.bz2
bsps: Move startup files to bsps
Adjust build support files to new directory layout. This patch is a part of the BSP source reorganization. Update #3285.
Diffstat (limited to 'bsps/i386')
-rw-r--r--bsps/i386/pc386/start/bsp_fatal_halt.c24
-rw-r--r--bsps/i386/pc386/start/bsp_specs9
-rw-r--r--bsps/i386/pc386/start/bspcmdline.c60
-rw-r--r--bsps/i386/pc386/start/bspgetworkarea.c135
-rw-r--r--bsps/i386/pc386/start/bspidle.S19
-rw-r--r--bsps/i386/pc386/start/bspreset.c18
-rw-r--r--bsps/i386/pc386/start/bspstart.c141
-rw-r--r--bsps/i386/pc386/start/ldsegs.S238
-rw-r--r--bsps/i386/pc386/start/linkcmds253
9 files changed, 897 insertions, 0 deletions
diff --git a/bsps/i386/pc386/start/bsp_fatal_halt.c b/bsps/i386/pc386/start/bsp_fatal_halt.c
new file mode 100644
index 0000000000..07bbd793e0
--- /dev/null
+++ b/bsps/i386/pc386/start/bsp_fatal_halt.c
@@ -0,0 +1,24 @@
+/**
+ * COPYRIGHT (c) 2016.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#include <bsp.h>
+
+void _CPU_Fatal_halt(uint32_t source, uint32_t error)
+{
+ __asm__ volatile (
+ "cli\n\t"
+ "movl %0,%%eax\n\t"
+ "hlt\n\t"
+ : "=r" ((error))
+ : "0" ((error))
+ );
+ #ifdef __GNUC__
+ __builtin_unreachable();
+ #endif
+}
diff --git a/bsps/i386/pc386/start/bsp_specs b/bsps/i386/pc386/start/bsp_specs
new file mode 100644
index 0000000000..87638cc027
--- /dev/null
+++ b/bsps/i386/pc386/start/bsp_specs
@@ -0,0 +1,9 @@
+%rename endfile old_endfile
+%rename startfile old_startfile
+
+*startfile:
+%{!qrtems: %(old_startfile)} \
+%{!nostdlib: %{qrtems: crti.o%s crtbegin.o%s}}
+
+*endfile:
+%{!qrtems: %(old_endfile)} %{qrtems: crtend.o%s crtn.o%s}
diff --git a/bsps/i386/pc386/start/bspcmdline.c b/bsps/i386/pc386/start/bspcmdline.c
new file mode 100644
index 0000000000..d617863198
--- /dev/null
+++ b/bsps/i386/pc386/start/bspcmdline.c
@@ -0,0 +1,60 @@
+/*-------------------------------------------------------------------------+
+| This file contains the PC386 BSP startup package. It includes application,
+| board, and monitor specific initialization and configuration. The generic CPU
+| dependent initialization has been performed before this routine is invoked.
++--------------------------------------------------------------------------+
+| (C) Copyright 2009 RTEMS Project
+| Chris Johns (chrisj@rtems.org)
++--------------------------------------------------------------------------+
+| Disclaimer:
+|
+| This file is provided "AS IS" without warranty of any kind, either
+| expressed or implied.
++--------------------------------------------------------------------------+
+| This code is based on:
+| common sense
+| With the following copyright notice:
+| **************************************************************************
+| * COPYRIGHT (c) 1989-2008.
+| * On-Line Applications Research Corporation (OAR).
+| *
+| * The license and distribution terms for this file may be
+| * found in the file LICENSE in this distribution or at
+| * http://www.rtems.org/license/LICENSE.
+| **************************************************************************
++--------------------------------------------------------------------------*/
+
+#include <bsp.h>
+#include <rtems/pci.h>
+#include <libcpu/cpuModel.h>
+
+/*
+ * External data
+ */
+extern uint32_t _boot_multiboot_flags;
+extern uint32_t _boot_multiboot_memory[2];
+extern const char _boot_multiboot_cmdline[256];
+
+/*-------------------------------------------------------------------------+
+| Function: bsp_cmdline
+| Description: Call when you want the command line.
+| Global Variables: The multiboot values copied from the loader.
+| Arguments: None.
+| Returns: The whole command line.
++--------------------------------------------------------------------------*/
+const char* bsp_cmdline( void )
+{
+ return _boot_multiboot_cmdline;
+}
+
+/*-------------------------------------------------------------------------+
+| Function: bsp_cmdline_arg
+| Description: Call to search for an argument.
+| Global Variables: The multiboot values copied from the loader.
+| Arguments: The option start.
+| Returns: The option if found or nothing.
++--------------------------------------------------------------------------*/
+const char* bsp_cmdline_arg( const char* arg )
+{
+ return strstr (bsp_cmdline (), arg);
+}
diff --git a/bsps/i386/pc386/start/bspgetworkarea.c b/bsps/i386/pc386/start/bspgetworkarea.c
new file mode 100644
index 0000000000..21cb472607
--- /dev/null
+++ b/bsps/i386/pc386/start/bspgetworkarea.c
@@ -0,0 +1,135 @@
+/*
+ * This routine is an implementation of the bsp_work_area_initialize()
+ * that can be used by all m68k BSPs following linkcmds conventions
+ * regarding heap, stack, and workspace allocation.
+ *
+ * COPYRIGHT (c) 1989-2008.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+/* #define BSP_GET_WORK_AREA_DEBUG */
+#include <bsp.h>
+#include <bsp/bootcard.h>
+
+#ifdef BSP_GET_WORK_AREA_DEBUG
+ #include <rtems/bspIo.h>
+#endif
+
+/*
+ * These are provided by the linkcmds.
+ */
+extern char WorkAreaBase[];
+extern char HeapSize[];
+extern char RamSize[];
+
+/* rudimentary multiboot info */
+struct multiboot_info {
+ uint32_t flags; /* start.S only raises flags for items actually */
+ /* saved; this allows us to check for the size */
+ /* of the data structure. */
+ uint32_t mem_lower; /* avail kB in lower memory */
+ uint32_t mem_upper; /* avail kB in lower memory */
+ /* ... (unimplemented) */
+};
+
+extern struct multiboot_info _boot_multiboot_info;
+
+/*
+ * This is the first address of the memory we can use for the RTEMS
+ * Work Area.
+ */
+static uintptr_t rtemsWorkAreaStart;
+
+/*
+ * Board's memory size easily be overridden by application.
+ */
+uint32_t bsp_mem_size = 0;
+
+/* Size of stack used during initialization. Defined in 'start.s'. */
+extern uint32_t _stack_size;
+
+static void bsp_size_memory(void)
+{
+ uintptr_t topAddr;
+
+ /* Set the value of start of free memory. */
+ rtemsWorkAreaStart = (uint32_t)WorkAreaBase + _stack_size;
+
+ /* Align the RTEMS Work Area at beginning of free memory. */
+ if (rtemsWorkAreaStart & (CPU_ALIGNMENT - 1)) /* not aligned => align it */
+ rtemsWorkAreaStart = (rtemsWorkAreaStart+CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1);
+
+ /* The memory detection algorithm is very crude; try
+ * to use multiboot info, if possible (set from start.S)
+ */
+ if ( ((uintptr_t)RamSize == (uintptr_t) 0xFFFFFFFF) &&
+ (_boot_multiboot_info.flags & 1) &&
+ _boot_multiboot_info.mem_upper ) {
+ topAddr = _boot_multiboot_info.mem_upper * 1024;
+ #ifdef BSP_GET_WORK_AREA_DEBUG
+ printk( "Multiboot info says we have 0x%08x\n", topAddr );
+ #endif
+ } else if ( (uintptr_t) RamSize == (uintptr_t) 0xFFFFFFFF ) {
+ uintptr_t lowest;
+ uint32_t val;
+ int i;
+
+ /*
+ * We have to dynamically size memory. Memory size can be anything
+ * between no less than 2M and 2048M. If we can write a value to
+ * an address and read the same value back, then the memory is there.
+ *
+ * WARNING: This can detect memory which should be reserved for
+ * graphics controllers which share the CPU's RAM.
+ */
+
+ /* find the lowest 1M boundary to probe */
+ lowest = ((rtemsWorkAreaStart + (1<<20)) >> 20) + 1;
+ if ( lowest < 2 )
+ lowest = 2;
+
+ for (i=2048; i>=lowest; i--) {
+ topAddr = i*1024*1024 - 4;
+ *(volatile uint32_t*)topAddr = topAddr;
+ }
+
+ for(i=lowest; i<=2048; i++) {
+ topAddr = i*1024*1024 - 4;
+ val = *(volatile uint32_t*)topAddr;
+ if (val != topAddr) {
+ break;
+ }
+ }
+
+ topAddr = (i-1)*1024*1024;
+ #ifdef BSP_GET_WORK_AREA_DEBUG
+ printk( "Dynamically sized to 0x%08x\n", topAddr );
+ #endif
+ } else {
+ topAddr = (uintptr_t) RamSize;
+ #ifdef BSP_GET_WORK_AREA_DEBUG
+ printk( "hardcoded to 0x%08x\n", topAddr );
+ #endif
+ }
+
+ bsp_mem_size = topAddr;
+}
+
+void bsp_work_area_initialize(void)
+{
+ void *area_start;
+ uintptr_t area_size;
+
+ /*
+ * We need to determine how much memory there is in the system.
+ */
+ bsp_size_memory();
+
+ area_start = (void *) rtemsWorkAreaStart;
+ area_size = (uintptr_t) bsp_mem_size - (uintptr_t) rtemsWorkAreaStart;
+ bsp_work_area_initialize_default( area_start, area_size );
+}
diff --git a/bsps/i386/pc386/start/bspidle.S b/bsps/i386/pc386/start/bspidle.S
new file mode 100644
index 0000000000..740671afc1
--- /dev/null
+++ b/bsps/i386/pc386/start/bspidle.S
@@ -0,0 +1,19 @@
+/*
+ * Idle Thread Body
+ *
+ * COPYRIGHT (c) 2016.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#include <rtems/asm.h>
+
+.p2align 4
+
+PUBLIC(bsp_idle_thread)
+SYM(bsp_idle_thread):
+hltloop: hlt
+ jmp hltloop
diff --git a/bsps/i386/pc386/start/bspreset.c b/bsps/i386/pc386/start/bspreset.c
new file mode 100644
index 0000000000..0fbcd0f201
--- /dev/null
+++ b/bsps/i386/pc386/start/bspreset.c
@@ -0,0 +1,18 @@
+/*
+ * COPYRIGHT (c) 1989-2017.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include <bsp/bootcard.h>
+
+void bsp_reset(void)
+{
+ /* shutdown and reboot */
+ outport_byte(0x64, 0xFE); /* use keyboard controller */
+}
diff --git a/bsps/i386/pc386/start/bspstart.c b/bsps/i386/pc386/start/bspstart.c
new file mode 100644
index 0000000000..db1ca90cf4
--- /dev/null
+++ b/bsps/i386/pc386/start/bspstart.c
@@ -0,0 +1,141 @@
+/**
+ * @file
+ *
+ * This file contains the PC386 BSP startup package. It includes application,
+ * board, and monitor specific initialization and configuration.
+ */
+
+/*
+ * This file was initially written by Joel Sherrill as part of the go32 BSP.
+ * It was subsequently adapted as part of the pc386 BSP by developers from
+ * the NavIST Group in 1997.
+ *
+ * Copyright (c) 2016.
+ * Chris Johns <chrisj@rtems.org>
+ *
+ * COPYRIGHT (c) 1989-2008, 2016.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ *
+ * (C) Copyright 1997 -
+ * - NavIST Group - Real-Time Distributed Systems and Industrial Automation
+ * Instituto Superior Tecnico * Lisboa * PORTUGAL (http://pandora.ist.utl.pt)
+ *
+ * NavISY Disclaimer:
+ * This file is provided "AS IS" without warranty of any kind, either
+ * expressed or implied.
+ */
+
+#include <bsp.h>
+#include <bsp/bspimpl.h>
+#include <bsp/irq.h>
+#include <rtems/pci.h>
+#include <libcpu/cpuModel.h>
+
+/*
+ * PCI Bus Configuration
+ */
+rtems_pci_config_t BSP_pci_configuration = {
+ (volatile unsigned char*)0,
+ (volatile unsigned char*)0,
+ NULL
+};
+
+/*
+ * Helper to initialize the PCI Bus
+ */
+static void bsp_pci_initialize_helper(void)
+{
+ const pci_config_access_functions *pci_accessors;
+
+ pci_accessors = pci_bios_initialize();
+ if (pci_accessors != NULL) {
+ printk("PCI bus: using PCI BIOS interface\n");
+ BSP_pci_configuration.pci_functions = pci_accessors;
+ return;
+ }
+
+ pci_accessors = pci_io_initialize();
+ if (pci_accessors != NULL) {
+ printk("PCI bus: using PCI I/O interface\n");
+ BSP_pci_configuration.pci_functions = pci_accessors;
+ return;
+ }
+
+ printk("PCI bus: could not initialize PCI BIOS interface\n");
+}
+
+/*-------------------------------------------------------------------------+
+| Function: bsp_start
+| Description: Called before main is invoked.
+| Global Variables: None.
+| Arguments: None.
+| Returns: Nothing.
++--------------------------------------------------------------------------*/
+static void bsp_start_default( void )
+{
+ /*
+ * Turn off watchdog
+ */
+ /*
+ * Calibrate variable for 1ms-loop (see timer.c)
+ */
+ Calibrate_loop_1ms();
+
+ /*
+ * Init rtems interrupt management
+ */
+ rtems_irq_mngt_init();
+
+ /*
+ * Init rtems exceptions management
+ */
+ rtems_exception_init_mngt();
+
+ /*
+ * init PCI Bios interface...
+ */
+ bsp_pci_initialize_helper();
+
+ /*
+ * Probe for legacy UARTs.
+ */
+ legacy_uart_probe();
+
+ /*
+ * Probe for UARTs on PCI.
+ */
+ pci_uart_probe();
+
+ /*
+ * Parse the GDB arguments and flag a serial port as not valid. This stops
+ * the console from claming the port.
+ */
+#if BSP_GDB_STUB
+ pc386_parse_gdb_arguments();
+#endif
+
+ /*
+ * Figure out where printk() and console IO is to be directed. Do this after
+ * the legacy and PCI bus probes so we have a chance for those devices to be
+ * added to the set in the console driver. In general, do it as early as
+ * possible so printk() has a chance to work early on devices found via PCI
+ * probe.
+ */
+ pc386_parse_console_arguments();
+
+ Clock_driver_install_handler();
+
+#if BSP_ENABLE_IDE
+ bsp_ide_cmdline_init();
+#endif
+} /* bsp_start_default */
+
+/*
+ * By making this a weak alias for bsp_start_default, a brave soul
+ * can override the actual bsp_start routine used.
+ */
+void bsp_start (void) __attribute__ ((weak, alias("bsp_start_default")));
diff --git a/bsps/i386/pc386/start/ldsegs.S b/bsps/i386/pc386/start/ldsegs.S
new file mode 100644
index 0000000000..b56bf836f0
--- /dev/null
+++ b/bsps/i386/pc386/start/ldsegs.S
@@ -0,0 +1,238 @@
+/*-------------------------------------------------------------------------+
+| ldsegs.s v1.1 - PC386 BSP - 1997/08/07
++--------------------------------------------------------------------------+
+| This file assists the board independent startup code by loading the proper
+| segment register values. The values loaded are board dependent. In addition
+| it contains code to enable the A20 line and to reprogram the PIC to relocate
+| the IRQ interrupt vectors to 0x20 -> 0x2f.
+| NOTE: No stack has been established when this routine is invoked.
+| It returns by jumping back to bspentry.
++--------------------------------------------------------------------------+
+| (C) Copyright 1997 -
+| - NavIST Group - Real-Time Distributed Systems and Industrial Automation
+|
+| http://pandora.ist.utl.pt
+|
+| Instituto Superior Tecnico * Lisboa * PORTUGAL
++--------------------------------------------------------------------------+
+| Disclaimer:
+|
+| This file is provided "AS IS" without warranty of any kind, either
+| expressed or implied.
++--------------------------------------------------------------------------+
+| This code is base on:
+| ldsegs.s,v 1.4 1996/04/20 16:48:30 joel Exp - go32 BSP
+| With the following copyright notice:
+| **************************************************************************
+| * COPYRIGHT (c) 1989-1999.
+| * On-Line Applications Research Corporation (OAR).
+| *
+| * The license and distribution terms for this file may be
+| * found in the file LICENSE in this distribution or at
+| * http://www.rtems.org/license/LICENSE.
+| **************************************************************************
++--------------------------------------------------------------------------*/
+
+#include <rtems/asm.h>
+#include <bsp/tblsizes.h> /* contains sizes of GDT and IDT */
+#include <bspopts.h>
+
+/*----------------------------------------------------------------------------+
+| CODE section
++----------------------------------------------------------------------------*/
+EXTERN (rtems_i8259_masks)
+
+BEGIN_CODE
+
+ EXTERN (_establish_stack)
+ EXTERN (Timer_exit)
+ EXTERN (clockOff)
+
+/*----------------------------------------------------------------------------+
+| pc386_delay
++------------------------------------------------------------------------------
+| Delay is needed after doing I/O.
+|
+| The outb version is OK on most machines BUT the loop version ...
+|
+| will delay for 1us on 1Gz machine, it will take a little bit
+| longer on slower machines, however, it does not matter because we
+| are going to call this function only a few times
+
++----------------------------------------------------------------------------*/
+#define DELAY_USE_OUTB
+
+ .p2align 4
+ .globl _pc386_delay
+ .globl pc386_delay
+pc386_delay:
+_pc386_delay:
+#ifdef DELAY_USE_OUTB
+ outb al, $0x80 # about 1uS delay on most machines
+#else
+ movl $0x200, eax
+pc386_delay1:
+ dec eax
+ jnz pc386_delay1
+#endif
+ ret
+
+/*-------------------------------------------------------------------------+
+| Function: _load_segments
+| Description: Current environment is standard PC booted by grub.
+| So, there is no value in saving current GDT and IDT
+| settings we have to set it up ourseves. (Naturally
+| it will be not so in case we are booted by some
+| boot monitor, however, then it will be different
+| BSP). After that we have to load board segment registers
+| with apropriate values + reprogram PIC.
+| Global Variables: None.
+| Arguments: None.
+| Returns: Nothing.
++--------------------------------------------------------------------------*/
+ .p2align 4
+
+ PUBLIC (_load_segments)
+SYM (_load_segments):
+
+ lgdt SYM(gdtdesc)
+ lidt SYM(IDT_Descriptor)
+
+ /* Load CS, flush prefetched queue */
+ ljmp $0x8, $next_step
+
+next_step:
+ /* Load segment registers */
+ movw $0x10, ax
+ movw ax, ss
+ movw ax, ds
+ movw ax, es
+ movw ax, fs
+ movw ax, gs
+
+/*---------------------------------------------------------------------+
+| Now we have to reprogram the interrupts :-(. We put them right after
+| the intel-reserved hardware interrupts, at int 0x20-0x2F. There they
+| won't mess up anything. Sadly IBM really messed this up with the
+| original PC, and they haven't been able to rectify it afterwards. Thus
+| the bios puts interrupts at 0x08-0x0f, which is used for the internal
+| hardware interrupts as well. We just have to reprogram the 8259's, and
+| it isn't fun.
++---------------------------------------------------------------------*/
+
+ movb $0x11, al /* initialization sequence */
+ outb al, $0x20 /* send it to 8259A-1 */
+ call SYM(pc386_delay)
+ outb al, $0xA0 /* and to 8259A-2 */
+ call SYM(pc386_delay)
+
+ movb $0x20, al /* start of hardware int's (0x20) */
+ outb al, $0x21
+ call SYM(pc386_delay)
+ movb $0x28, al /* start of hardware int's 2 (0x28) */
+ outb al, $0xA1
+ call SYM(pc386_delay)
+
+ movb $0x04, al /* 8259-1 is master */
+ outb al, $0x21
+ call SYM(pc386_delay)
+ movb $0x02, al /* 8259-2 is slave */
+ outb al, $0xA1
+ call SYM(pc386_delay)
+
+ movb $0x01, al /* 8086 mode for both */
+ outb al, $0x21
+ call SYM(pc386_delay)
+ outb al, $0xA1
+ call SYM(pc386_delay)
+
+ /*
+ * The IMR values must correspond to the initial value of i8259s_cache.
+ */
+ movb $0xFF, al /* mask off all interrupts for now */
+ outb al, $0xA1
+ call SYM(pc386_delay)
+ movb $0xFB, al /* mask all irq's but irq2 which */
+ outb al, $0x21 /* is cascaded */
+ call SYM(pc386_delay)
+ jmp SYM (_establish_stack) # return to the bsp entry code
+
+/*-------------------------------------------------------------------------+
+| Function: _default_int_handler
+| Description: default interrupt handler
+| Global Variables: None.
+| Arguments: None.
+| Returns: Nothing.
++--------------------------------------------------------------------------*/
+ .p2align 4
+
+/*---------------------------------------------------------------------------+
+| GDT itself
++--------------------------------------------------------------------------*/
+#if GDT_SIZE < NUM_SYSTEM_GDT_DESCRIPTORS
+#error "GDT_SIZE must be at least NUM_SYSTEM_GDT_DESCRIPTORS"
+#endif
+
+BEGIN_DATA
+ .p2align 4
+
+ PUBLIC (_Global_descriptor_table)
+SYM (_Global_descriptor_table):
+
+ /* NULL segment */
+ .word 0, 0
+ .byte 0, 0, 0, 0
+
+ /* code segment */
+ .word 0xffff, 0
+ .byte 0, 0x9e, 0xcf, 0
+
+ /* data segment */
+ .word 0xffff, 0
+ .byte 0, 0x92, 0xcf, 0
+
+ /* gs segment */
+ .word 0xffff, 0
+ .byte 0, 0x92, 0xcf, 0
+
+ /* allocated space for user segments */
+ .rept (GDT_SIZE - NUM_SYSTEM_GDT_DESCRIPTORS)
+ .word 0,0,0,0
+ .endr
+
+/*---------------------------------------------------------------------------+
+| Descriptor of GDT
++--------------------------------------------------------------------------*/
+ PUBLIC(gdtdesc)
+SYM(gdtdesc):
+ .word (GDT_SIZE*8 - 1)
+ .long SYM (_Global_descriptor_table)
+
+/*---------------------------------------------------------------------------+
+| IDT itself
++---------------------------------------------------------------------------*/
+ .p2align 4
+
+ PUBLIC(Interrupt_descriptor_table)
+SYM(Interrupt_descriptor_table):
+ .rept IDT_SIZE
+ .word 0,0,0,0
+ .endr
+
+/*---------------------------------------------------------------------------+
+| Descriptor of IDT
++--------------------------------------------------------------------------*/
+
+ .p2align 4
+ PUBLIC(IDT_Descriptor)
+SYM(IDT_Descriptor):
+ .word (IDT_SIZE*8 - 1)
+ .long SYM (Interrupt_descriptor_table)
+
+END_DATA
+
+ .section .m_hdr
+ .long 0x1BADB002
+ .long 0
+ .long 0xE4524FFE
+END
diff --git a/bsps/i386/pc386/start/linkcmds b/bsps/i386/pc386/start/linkcmds
new file mode 100644
index 0000000000..5fc3444c9e
--- /dev/null
+++ b/bsps/i386/pc386/start/linkcmds
@@ -0,0 +1,253 @@
+/*
+ * Copy of default "default linker script, for normal executables"
+ * provided with binutils 2.18 with minor modifications for use
+ * as pc386 linkcmds. These changes include:
+ *
+ * + sections commented out marked with "XXX commented out --joel"
+ * + addition of m_hdr section
+ * + addition of FreeBSD sysctl sections
+ */
+
+/*
+ * XXX commented out --joel
+OUTPUT_FORMAT("elf32-i386", "elf32-i386",
+ "elf32-i386")
+OUTPUT_ARCH(i386)
+*/
+STARTUP(start.o)
+ENTRY(start)
+HeapSize = DEFINED(HeapSize) ? HeapSize :
+ DEFINED(_HeapSize) ? _HeapSize : 0x0;
+RamSize = DEFINED(RamSize) ? RamSize :
+ DEFINED(_RamSize) ? _RamSize : 0xFFFFFFFF;
+
+SECTIONS
+{
+ /* Read-only sections, merged into text segment: */
+/*
+ * XXX commented out --joel
+ PROVIDE (__executable_start = 0x08048000); . = 0x08048000 + SIZEOF_HEADERS;
+*/
+ .interp : { *(.interp) }
+ .note.gnu.build-id : { *(.note.gnu.build-id) }
+ .hash : { *(.hash) }
+ .gnu.hash : { *(.gnu.hash) }
+ .dynsym : { *(.dynsym) }
+ .dynstr : { *(.dynstr) }
+ .gnu.version : { *(.gnu.version) }
+ .gnu.version_d : { *(.gnu.version_d) }
+ .gnu.version_r : { *(.gnu.version_r) }
+ .rel.init : { *(.rel.init) }
+ .rela.init : { *(.rela.init) }
+ .rel.text : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) }
+ .rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) }
+ .rel.fini : { *(.rel.fini) }
+ .rela.fini : { *(.rela.fini) }
+ .rel.rodata : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) }
+ .rela.rodata : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) }
+ .rel.data.rel.ro : { *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*) }
+ .rela.data.rel.ro : { *(.rela.data.rel.ro* .rela.gnu.linkonce.d.rel.ro.*) }
+ .rel.data : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) }
+ .rela.data : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) }
+ .rel.tdata : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) }
+ .rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) }
+ .rel.tbss : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) }
+ .rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) }
+ .rel.ctors : { *(.rel.ctors) }
+ .rela.ctors : { *(.rela.ctors) }
+ .rel.dtors : { *(.rel.dtors) }
+ .rela.dtors : { *(.rela.dtors) }
+ .rel.got : { *(.rel.got) }
+ .rela.got : { *(.rela.got) }
+ .rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) }
+ .rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) }
+ .rel.plt : { *(.rel.plt) }
+ .rela.plt : { *(.rela.plt) }
+ .plt : { *(.plt) }
+ .text :
+ {
+ *(.m_hdr)
+ *(.text .stub .text.* .gnu.linkonce.t.*)
+ KEEP (*(.text.*personality*))
+ /* .gnu.warning sections are handled specially by elf32.em. */
+ *(.gnu.warning)
+
+ } =0x90909090
+
+ .rtemsroset : {
+ /* for pre rtems-libbsd FreeBSD code */
+ __start_set_sysctl_set = .;
+ *(set_sysctl_*);
+ __stop_set_sysctl_set = .;
+ *(set_domain_*);
+ *(set_pseudo_*);
+
+ KEEP (*(SORT(.rtemsroset.*)))
+ } =0x90909090
+
+ .init :
+ {
+ KEEP (*(.init))
+ } =0x90909090
+ .fini :
+ {
+ KEEP (*(.fini))
+ } =0x90909090
+ PROVIDE (__etext = .);
+ PROVIDE (_etext = .);
+ PROVIDE (etext = .);
+ .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
+ .rodata1 : { *(.rodata1) }
+ .tdata : {
+ _TLS_Data_begin = .;
+ *(.tdata .tdata.* .gnu.linkonce.td.*)
+ _TLS_Data_end = .;
+ }
+ .tbss : {
+ _TLS_BSS_begin = .;
+ *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon)
+ _TLS_BSS_end = .;
+ }
+ _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
+ _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
+ _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
+ _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
+ _TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
+ _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
+ .eh_frame_hdr : { *(.eh_frame_hdr) }
+ .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) }
+ .gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) }
+ /* Adjust the address for the data segment. We want to adjust up to
+ the same address within the page on the next page up. */
+ . = ALIGN (CONSTANT (MAXPAGESIZE)) - ((CONSTANT (MAXPAGESIZE) - .) & (CONSTANT (MAXPAGESIZE) - 1)); . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE));
+ /* Exception handling */
+ .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) }
+ .gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) }
+ /* Thread Local Storage sections */
+ .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) }
+ .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) }
+ .preinit_array :
+ {
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP (*(.preinit_array))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+ }
+ .init_array :
+ {
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP (*(SORT(.init_array.*)))
+ KEEP (*(.init_array))
+ PROVIDE_HIDDEN (__init_array_end = .);
+ }
+ .fini_array :
+ {
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP (*(.fini_array))
+ KEEP (*(SORT(.fini_array.*)))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+ }
+ .ctors :
+ {
+ /* gcc uses crtbegin.o to find the start of
+ the constructors, so we make sure it is
+ first. Because this is a wildcard, it
+ doesn't matter if the user does not
+ actually link against crtbegin.o; the
+ linker won't look for a file to match a
+ wildcard. The wildcard also means that it
+ doesn't matter which directory crtbegin.o
+ is in. */
+ KEEP (*crtbegin.o(.ctors))
+ KEEP (*crtbegin?.o(.ctors))
+ /* We don't want to include the .ctor section from
+ the crtend.o file until after the sorted ctors.
+ The .ctor section from the crtend file contains the
+ end of ctors marker and it must be last */
+ KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))
+ KEEP (*(SORT(.ctors.*)))
+ KEEP (*(.ctors))
+ }
+ .dtors :
+ {
+ KEEP (*crtbegin.o(.dtors))
+ KEEP (*crtbegin?.o(.dtors))
+ KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))
+ KEEP (*(SORT(.dtors.*)))
+ KEEP (*(.dtors))
+ }
+ .jcr : { KEEP (*(.jcr)) }
+ .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*) }
+ .dynamic : { *(.dynamic) }
+ .got : { *(.got) }
+ . = DATA_SEGMENT_RELRO_END (12, .);
+ .got.plt : { *(.got.plt) }
+ .data :
+ {
+ *(.data .data.* .gnu.linkonce.d.*)
+ KEEP (*(.gnu.linkonce.d.*personality*))
+ SORT(CONSTRUCTORS)
+ }
+ .data1 : { *(.data1) }
+ .rtemsrwset : { KEEP (*(SORT(.rtemsrwset.*))) }
+ _edata = .; PROVIDE (edata = .);
+ __bss_start = .;
+ .bss :
+ {
+ *(.dynbss)
+ *(.bss .bss.* .gnu.linkonce.b.*)
+ *(COMMON)
+ /* Align here to ensure that the .bss section occupies space up to
+ _end. Align after .bss to ensure correct alignment even if the
+ .bss section disappears because there are no input sections.
+ FIXME: Why do we need it? When there is no .bss section, we don't
+ pad the .data section. */
+ . = ALIGN(. != 0 ? 32 / 8 : 1);
+ }
+ . = ALIGN(32 / 8);
+ . = ALIGN(32 / 8);
+ _end = .; PROVIDE (end = .);
+ . = ALIGN(0x10);
+ WorkAreaBase = .;
+ . = DATA_SEGMENT_END (.);
+
+ /* Stabs debugging sections. */
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ /* DWARF debug sections.
+ Symbols in the DWARF debugging sections are relative to the beginning
+ of the section so we begin them at 0. */
+ /* DWARF 1 */
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ /* GNU DWARF 1 extensions */
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ /* DWARF 1.1 and DWARF 2 */
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ /* DWARF 2 */
+ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ /* SGI/MIPS DWARF 2 extensions */
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+ /* DWARF 3 */
+ .debug_pubtypes 0 : { *(.debug_pubtypes) }
+ .debug_ranges 0 : { *(.debug_ranges) }
+ /* DWARF extension */
+ .debug_macro 0 : { *(.debug_macro) }
+ .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
+ /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) }
+}