2008-03-22 Joel Sherrill <joel.sherrill@oarcorp.com>

* configure.ac, startup/exit.c: Add BSP_PRESS_KEY_FOR_RESET
	configuration option. When this is set to one, a clean exit of an
	application will result in the BSP resetting the hardware without
	waiting for a human to press a key.
	* start/start.S, startup/linkcmds: Replace the linkcmds with a
	version very closely based upon the default in binutils 2.18 for
	this target.  This eliminated weird failures with C++ dtors even
	in C applications.  We had an extra _ on a symbol used in start.S.
This commit is contained in:
Joel Sherrill
2008-03-22 14:01:49 +00:00
parent 2ebf170e22
commit 3f432fbd01
5 changed files with 241 additions and 144 deletions

View File

@@ -1,3 +1,14 @@
2008-03-22 Joel Sherrill <joel.sherrill@oarcorp.com>
* configure.ac, startup/exit.c: Add BSP_PRESS_KEY_FOR_RESET
configuration option. When this is set to one, a clean exit of an
application will result in the BSP resetting the hardware without
waiting for a human to press a key.
* start/start.S, startup/linkcmds: Replace the linkcmds with a
version very closely based upon the default in binutils 2.18 for
this target. This eliminated weird failures with C++ dtors even
in C applications. We had an extra _ on a symbol used in start.S.
2008-03-12 Joel Sherrill <joel.sherrill@oarcorp.com> 2008-03-12 Joel Sherrill <joel.sherrill@oarcorp.com>
* configure.ac: Fix typo. * configure.ac: Fix typo.

View File

@@ -40,6 +40,13 @@ RTEMS_BSPOPTS_HELP([IDE_USE_SECONDARY_INTERFACE],
- and you have at least one disk attached to this interface - and you have at least one disk attached to this interface
- and you do want to access disks attached to this interface]) - and you do want to access disks attached to this interface])
#define BSP_PRESS_KEY_FOR_RESET 1
RTEMS_BSPOPTS_SET([BSP_PRESS_KEY_FOR_RESET],[*],[1])
RTEMS_BSPOPTS_HELP([BSP_PRESS_KEY_FOR_RESET],
[Determines, whether this BSP will wait for a key to be pressed
before rebooting the PC. This is useful for unattended PC deployments
])
## if this is an i386, does gas have good code16 support? ## if this is an i386, does gas have good code16 support?
RTEMS_I386_GAS_CODE16 RTEMS_I386_GAS_CODE16
AM_CONDITIONAL(RTEMS_GAS_CODE16,[test "$RTEMS_GAS_CODE16" = "yes"]) AM_CONDITIONAL(RTEMS_GAS_CODE16,[test "$RTEMS_GAS_CODE16" = "yes"])

View File

@@ -154,7 +154,7 @@ SYM (_establish_stack):
SYM (zero_bss): SYM (zero_bss):
cld # make direction flag count up cld # make direction flag count up
movl $ SYM (_end), ecx # find end of .bss movl $ SYM (_end), ecx # find end of .bss
movl $ SYM (_bss_start), edi # edi = beginning of .bss movl $ SYM (__bss_start), edi # edi = beginning of .bss
subl edi, ecx # ecx = size of .bss in bytes subl edi, ecx # ecx = size of .bss in bytes
shrl ecx # size of .bss in longs shrl ecx # size of .bss in longs
shrl ecx shrl ecx

View File

@@ -1,34 +1,33 @@
/*-------------------------------------------------------------------------+ /*
| exit.c v1.1 - PC386 BSP - 1997/08/07 * Routines to shutdown and reboot the PC.
+--------------------------------------------------------------------------+ *
| Routines to shutdown and reboot the PC. * (C) Copyright 1997 -
+--------------------------------------------------------------------------+ * - NavIST Group - Real-Time Distributed Systems and Industrial Automation
| (C) Copyright 1997 - * http://pandora.ist.utl.pt
| - NavIST Group - Real-Time Distributed Systems and Industrial Automation * Instituto Superior Tecnico * Lisboa * PORTUGAL
| *
| http://pandora.ist.utl.pt * Disclaimer:
| *
| Instituto Superior Tecnico * Lisboa * PORTUGAL * This file is provided "AS IS" without warranty of any kind, either
+--------------------------------------------------------------------------+ * expressed or implied.
| Disclaimer: *
| *
| This file is provided "AS IS" without warranty of any kind, either * This code is based on:
| expressed or implied. * exit.c,v 1.2 1995/12/19 20:07:36 joel Exp - go32 BSP
+--------------------------------------------------------------------------+ * With the following copyright notice:
| This code is based on: * **************************************************************************
| exit.c,v 1.2 1995/12/19 20:07:36 joel Exp - go32 BSP * * COPYRIGHT (c) 1989-1999.
| With the following copyright notice: * * On-Line Applications Research Corporation (OAR).
| ************************************************************************** * *
| * COPYRIGHT (c) 1989-1999. * * The license and distribution terms for this file may be
| * On-Line Applications Research Corporation (OAR). * * found in found in the file LICENSE in this distribution or at
| * * * http://www.rtems.com/license/LICENSE.
| * The license and distribution terms for this file may be * **************************************************************************
| * found in found in the file LICENSE in this distribution or at *
| * http://www.rtems.com/license/LICENSE. * Joel: It has been modified many times since submission.
| ************************************************************************** *
| * $Id$
| $Id$ */
+--------------------------------------------------------------------------*/
#include <stdio.h> #include <stdio.h>
#include <bsp.h> #include <bsp.h>
@@ -37,15 +36,22 @@
void bsp_cleanup(void) void bsp_cleanup(void)
{ {
unsigned char ch;
static char line[]="EXECUTIVE SHUTDOWN! Any key to reboot...";
/* /*
* AT this point, the console driver is disconnected => we must * At this point, the console driver is disconnected => we must
* use polled output/input. This is exactly what printk * use polled output/input. This is exactly what printk
* does. * does.
*/ */
printk("\n"); printk( "\nEXECUTIVE SHUTDOWN! " );
printk(line);
#if (BSP_PRESS_KEY_FOR_RESET)
{
unsigned char ch;
printk( "Any key to reboot..." );
ch = BSP_poll_char(); ch = BSP_poll_char();
}
#else
printk( "resetting system\n" );
#endif
rtemsReboot(); rtemsReboot();
} }

View File

@@ -1,54 +1,72 @@
/*-------------------------------------------------------------------------+ /*
| linkcmds v1.1 - PC386 BSP - 1997/08/07 * Copy of default "default linker script, for normal executables"
+--------------------------------------------------------------------------+ * provided with binutils 2.18 with minor modifications for use
| This file contains directives for the GNU linker which are specific to the * as pc386 linkcmds. These changes include:
| PC386 bsp. *
+--------------------------------------------------------------------------+ * + sections commented out marked with "XXX commented out --joel"
| (C) Copyright 1997 - * + addition of m_hdr section
| - NavIST Group - Real-Time Distributed Systems and Industrial Automation * + addition of FreeBSD sysctl sections
| *
| http://pandora.ist.utl.pt * $Id$
| */
| Instituto Superior Tecnico * Lisboa * PORTUGAL
+--------------------------------------------------------------------------+
| Disclaimer:
|
| This file is provided "AS IS" without warranty of any kind, either
| expressed or implied.
+--------------------------------------------------------------------------+
| This code is based on:
| linkcmds,v 1.3 1995/12/19 20:06:58 joel Exp - FORCE CPU386 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 found in the file LICENSE in this distribution or at
| * http://www.rtems.com/license/LICENSE.
| **************************************************************************
|
| $Id$
+--------------------------------------------------------------------------*/
/*
* XXX commented out --joel
OUTPUT_FORMAT("elf32-i386", "elf32-i386",
"elf32-i386")
OUTPUT_ARCH(i386)
ENTRY(_start)
*/
SECTIONS SECTIONS
{ {
/* .m_hdr : /* Read-only sections, merged into text segment: */
{ /*
. = ALIGN(4); * XXX commented out --joel
*(.m_hdr) 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 : .text :
{ {
_text_start = . ;
. = ALIGN(4);
*(.m_hdr) *(.m_hdr)
*(.text) *(.text .stub .text.* .gnu.linkonce.t.*)
*(.text.*) KEEP (*(.text.*personality*))
. = ALIGN (16); /* .gnu.warning sections are handled specially by elf32.em. */
*(.gnu.warning)
/* /*
* Special FreeBSD sysctl sections. * Special FreeBSD sysctl sections.
*/ */
@@ -59,56 +77,113 @@ SECTIONS
*(set_domain_*); *(set_domain_*);
*(set_pseudo_*); *(set_pseudo_*);
*(.eh_frame) } =0x90909090
. = ALIGN (16);
*(.gnu.linkonce.t*) .init :
/*
* C++ constructors
*/
__CTOR_LIST__ = .;
LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2)
*(.ctors)
LONG(0)
__CTOR_END__ = .;
__DTOR_LIST__ = .;
LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2)
*(.dtors)
LONG(0)
__DTOR_END__ = .;
_rodata_start = . ;
*(.rodata*)
*(.gnu.linkonce.r*)
_erodata = ALIGN( 0x10 ) ;
*(.jcr)
_etext = ALIGN( 0x10 ) ;
}
.init : { *(.init) } = 0x9090
.fini : { *(.fini) } = 0x9090
.data ADDR( .fini ) + SIZEOF( .fini ):
{ {
_data_start = . ; KEEP (*(.init))
*(.data) } =0x90909090
*(.data.*) .fini :
*(.gnu.linkonce.d*)
*(.gcc_except_table*)
_edata = ALIGN( 0x10 ) ;
}
.bss ADDR( .data ) + SIZEOF( .data ):
{ {
_bss_start = . ; KEEP (*(.fini))
*(.bss) } =0x90909090
*(.bss.*) PROVIDE (__etext = .);
PROVIDE (_etext = .);
PROVIDE (etext = .);
.rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
.rodata1 : { *(.rodata1) }
.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) }
_edata = .; PROVIDE (edata = .);
__bss_start = .;
.bss :
{
*(.dynbss)
*(.bss .bss.* .gnu.linkonce.b.*)
*(COMMON) *(COMMON)
_end = . ; /* Align here to ensure that the .bss section occupies space up to
__end = . ; _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 = .);
. = DATA_SEGMENT_END (.);
/* Stabs debugging sections. */ /* Stabs debugging sections. */
.stab 0 : { *(.stab) } .stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) } .stabstr 0 : { *(.stabstr) }
@@ -117,36 +192,34 @@ SECTIONS
.stab.index 0 : { *(.stab.index) } .stab.index 0 : { *(.stab.index) }
.stab.indexstr 0 : { *(.stab.indexstr) } .stab.indexstr 0 : { *(.stab.indexstr) }
.comment 0 : { *(.comment) } .comment 0 : { *(.comment) }
/* DWARF debug sections. /* DWARF debug sections.
Symbols in the DWARF debugging sections are relative to the beginning Symbols in the DWARF debugging sections are relative to the beginning
of the section so we begin them at 0. */ of the section so we begin them at 0. */
/* DWARF 1 */ /* DWARF 1 */
.debug 0 : { *(.debug) } .debug 0 : { *(.debug) }
.line 0 : { *(.line) } .line 0 : { *(.line) }
/* GNU DWARF 1 extensions */ /* GNU DWARF 1 extensions */
.debug_srcinfo 0 : { *(.debug_srcinfo) } .debug_srcinfo 0 : { *(.debug_srcinfo) }
.debug_sfnames 0 : { *(.debug_sfnames) } .debug_sfnames 0 : { *(.debug_sfnames) }
/* DWARF 1.1 and DWARF 2 */ /* DWARF 1.1 and DWARF 2 */
.debug_aranges 0 : { *(.debug_aranges) } .debug_aranges 0 : { *(.debug_aranges) }
.debug_pubnames 0 : { *(.debug_pubnames) } .debug_pubnames 0 : { *(.debug_pubnames) }
/* DWARF 2 */ /* DWARF 2 */
.debug_info 0 : { *(.debug_info) } .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
.debug_abbrev 0 : { *(.debug_abbrev) } .debug_abbrev 0 : { *(.debug_abbrev) }
.debug_line 0 : { *(.debug_line) } .debug_line 0 : { *(.debug_line) }
.debug_frame 0 : { *(.debug_frame) } .debug_frame 0 : { *(.debug_frame) }
.debug_str 0 : { *(.debug_str) } .debug_str 0 : { *(.debug_str) }
.debug_loc 0 : { *(.debug_loc) } .debug_loc 0 : { *(.debug_loc) }
.debug_macinfo 0 : { *(.debug_macinfo) } .debug_macinfo 0 : { *(.debug_macinfo) }
/* SGI/MIPS DWARF 2 extensions */ /* SGI/MIPS DWARF 2 extensions */
.debug_weaknames 0 : { *(.debug_weaknames) } .debug_weaknames 0 : { *(.debug_weaknames) }
.debug_funcnames 0 : { *(.debug_funcnames) } .debug_funcnames 0 : { *(.debug_funcnames) }
.debug_typenames 0 : { *(.debug_typenames) } .debug_typenames 0 : { *(.debug_typenames) }
.debug_varnames 0 : { *(.debug_varnames) } .debug_varnames 0 : { *(.debug_varnames) }
/* These must appear regardless of . */ /* DWARF 3 */
.debug_pubtypes 0 : { *(.debug_pubtypes) }
.debug_ranges 0 : { *(.debug_ranges) }
.gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) }
} }