summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/powerpc/beatnik/startup
diff options
context:
space:
mode:
authorTill Straumann <strauman@slac.stanford.edu>2009-12-03 16:56:50 +0000
committerTill Straumann <strauman@slac.stanford.edu>2009-12-03 16:56:50 +0000
commitb7a6d23a0d8d855fe92d573658405e1eedc2356b (patch)
tree71efd676a12343e1268e25c9214f44312e8d554e /c/src/lib/libbsp/powerpc/beatnik/startup
downloadrtems-b7a6d23a0d8d855fe92d573658405e1eedc2356b.tar.bz2
- importing 'beatnik' BSP from SLAC repository.
Diffstat (limited to 'c/src/lib/libbsp/powerpc/beatnik/startup')
-rw-r--r--c/src/lib/libbsp/powerpc/beatnik/startup/bspclean.c11
-rw-r--r--c/src/lib/libbsp/powerpc/beatnik/startup/bspstart.c397
-rw-r--r--c/src/lib/libbsp/powerpc/beatnik/startup/i2c_init.c132
-rw-r--r--c/src/lib/libbsp/powerpc/beatnik/startup/linkcmds261
-rw-r--r--c/src/lib/libbsp/powerpc/beatnik/startup/reboot.c16
5 files changed, 817 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/powerpc/beatnik/startup/bspclean.c b/c/src/lib/libbsp/powerpc/beatnik/startup/bspclean.c
new file mode 100644
index 0000000000..746a48fbde
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/beatnik/startup/bspclean.c
@@ -0,0 +1,11 @@
+#include <bsp.h>
+#include <rtems/bspIo.h>
+
+void bsp_cleanup(void)
+{
+ /* We can't go back to MotLoad since we blew it's memory area
+ * and vectors. Just pull the reset line...
+ */
+ printk("bsp_cleanup(): RTEMS terminated -- no way back to MotLoad so I reset the card\n");
+ bsp_reset();
+}
diff --git a/c/src/lib/libbsp/powerpc/beatnik/startup/bspstart.c b/c/src/lib/libbsp/powerpc/beatnik/startup/bspstart.c
new file mode 100644
index 0000000000..d88476a3f1
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/beatnik/startup/bspstart.c
@@ -0,0 +1,397 @@
+/*
+ * This routine starts the application. It includes application,
+ * board, and monitor specific initialization and configuration.
+ * The generic CPU dependent initialization has been performed
+ * before this routine is invoked.
+ *
+ * COPYRIGHT (c) 1989-1998.
+ * 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.OARcorp.com/rtems/license.html.
+ *
+ * Modified to support the MCP750.
+ * Modifications Copyright (C) 1999 Eric Valette. valette@crf.canon.fr
+ *
+ * Modified to support the Synergy VGM & Motorola PowerPC boards.
+ * (C) by Till Straumann, <strauman@slac.stanford.edu>, 2002, 2004, 2005
+ *
+ * Modified to support the mvme5500 BSP
+ * (C) by Kate Feng <feng1@bnl.gov>, 2003, 2004
+ * under the contract DE-AC02-98CH10886 with the Deaprtment of Energy
+ *
+ * T. Straumann: 2005-2007; stolen again for 'beatnik'...
+ */
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+#include <rtems/system.h>
+#include <rtems/libio.h>
+#include <rtems/libcsupport.h>
+#include <rtems/bspIo.h>
+#include <rtems/powerpc/powerpc.h>
+/*#include <bsp/consoleIo.h>*/
+#include <libcpu/spr.h> /* registers.h is included here */
+#include <bsp.h>
+#include <bsp/uart.h>
+#include <bsp/pci.h>
+#include <bsp/gtreg.h>
+#include <bsp/gt_timer.h>
+#include <libcpu/bat.h>
+#include <libcpu/pte121.h>
+#include <libcpu/cpuIdent.h>
+#include <bsp/vectors.h>
+#include <bsp/vpd.h>
+
+/* for RTEMS_VERSION :-( I dont like the preassembled string */
+#include <rtems/sptables.h>
+
+#ifdef __RTEMS_APPLICATION__
+#undef __RTEMS_APPLICATION__
+#endif
+
+#define SHOW_MORE_INIT_SETTINGS
+
+BSP_output_char_function_type BSP_output_char = BSP_output_char_via_serial;
+
+extern char *BSP_build_date;
+extern void bsp_cleanup(void);
+extern Triv121PgTbl BSP_pgtbl_setup(unsigned int *);
+extern void BSP_pgtbl_activate(Triv121PgTbl);
+extern void BSP_motload_pci_fixup(void);
+
+extern unsigned long __rtems_end[];
+
+/* We really shouldn't use these since MMUoff also sets IP;
+ * nevertheless, during early init I don't care for now
+ */
+extern void MMUoff(void);
+extern void MMUon(void);
+
+extern uint32_t probeMemoryEnd(void);
+
+SPR_RW(SPRG0)
+SPR_RW(SPRG1)
+SPR_RO(HID1)
+
+/* Table of PLL multipliers for 7455/7457:
+01000 2 00010 7.5 00000 11.5 00001 17
+10000 3 11000 8 10111 12 00101 18
+10100 4 01100 8.5 11111 12.5 00111 20
+10110 5 01111 9 01011 13 01001 21
+10010 5.5 01110 9.5 11100 13.5 01101 24
+11010 6 10101 10 11001 14 11101 28
+01010 6.5 10001 10.5 00011 15 00110 bypass
+00100 7 10011 11 11011 16 11110 off
+*/
+
+/* Sorted according to CFG bits and multiplied by 2 it looks
+ * like this (note that this is in sequential order, not
+ * tabulated as above)
+ */
+signed char mpc7450PllMultByTwo[32] = {
+23, 34, 15, 30,
+14, 36, 2/*bypass*/, 40,
+4, 42, 13, 26,
+17, 48, 19, 18,
+6, 21, 11, 22,
+8, 20, 10, 24,
+16, 28, 12, 32,
+27, 56, 0/*off*/, 25,
+};
+
+uint32_t bsp_clicks_per_usec = 0;
+
+/*
+ * Total memory using probing.
+ */
+unsigned int BSP_mem_size;
+
+/*
+ * PCI Bus Frequency
+ */
+unsigned int BSP_bus_frequency = 0xdeadbeef;
+/*
+ * processor clock frequency
+ */
+unsigned int BSP_processor_frequency = 0xdeadbeef;
+
+/*
+ * Time base divisior (bus freq / TB clock)
+ */
+unsigned int BSP_time_base_divisor = 4000; /* most 604+ CPUs seem to use this */
+
+/* Board identification string */
+char BSP_productIdent[20] = {0};
+char BSP_serialNumber[20] = {0};
+
+/* VPD appends an extra char -- what for ? */
+char BSP_enetAddr0[7] = {0};
+char BSP_enetAddr1[7] = {0};
+
+/*
+ * The original table from the application and our copy of it with
+ * some changes.
+ */
+
+extern rtems_configuration_table Configuration;
+
+char *rtems_progname;
+
+/*
+ * Use the shared implementations of the following routines
+ */
+
+extern void bsp_pretasking_hook(void);
+
+#define CMDLINE_BUF_SIZE 2048
+
+static char cmdline_buf[CMDLINE_BUF_SIZE];
+char *BSP_commandline_string = cmdline_buf;
+
+/* this routine is called early and must be safe with a not properly
+ * aligned stack
+ */
+char *
+save_boot_params(void *r3, void *r4, void* r5, char *cmdline_start, char *cmdline_end)
+{
+int i=cmdline_end-cmdline_start;
+ if ( i >= CMDLINE_BUF_SIZE )
+ i = CMDLINE_BUF_SIZE-1;
+ else if ( i < 0 )
+ i = 0;
+ memmove(cmdline_buf, cmdline_start, i);
+ cmdline_buf[i]=0;
+ return cmdline_buf;
+}
+
+static BSP_BoardType board_type = Unknown;
+
+BSP_BoardType
+BSP_getBoardType( void )
+{
+ return board_type;
+}
+
+/*
+ * bsp_start
+ *
+ * This routine does the bulk of the system initialization.
+ */
+
+void bsp_start( void )
+{
+ unsigned char *stack;
+ char *chpt;
+ uint32_t intrStackStart;
+ uint32_t intrStackSize;
+
+ Triv121PgTbl pt=0;
+
+ VpdBufRec vpdData [] = {
+ { key: ProductIdent, instance: 0, buf: BSP_productIdent, buflen: sizeof(BSP_productIdent) - 1 },
+ { key: SerialNumber, instance: 0, buf: BSP_serialNumber, buflen: sizeof(BSP_serialNumber) - 1 },
+ { key: CpuClockHz, instance: 0, buf: &BSP_processor_frequency, buflen: sizeof(BSP_processor_frequency) },
+ { key: BusClockHz, instance: 0, buf: &BSP_bus_frequency, buflen: sizeof(BSP_bus_frequency) },
+ { key: EthernetAddr, instance: 0, buf: BSP_enetAddr0, buflen: sizeof(BSP_enetAddr0) },
+ { key: EthernetAddr, instance: 1, buf: BSP_enetAddr1, buflen: sizeof(BSP_enetAddr1) },
+ VPD_END
+ };
+
+ /* T. Straumann: 4/2005
+ *
+ * Need to map the system registers early, so we can printk...
+ * (otherwise we silently die)
+ */
+ /* map the PCI 0, 1 Domain I/O space, GT64260B registers
+ * and the reserved area so that the size is the power of 2.
+ */
+ setdbat(7, BSP_DEV_AND_PCI_IO_BASE, BSP_DEV_AND_PCI_IO_BASE, BSP_DEV_AND_PCI_IO_SIZE, IO_PAGE);
+
+ /* Intersperse messages with actions to help locate problems */
+ printk("-----------------------------------------\n");
+
+ /*
+ * Get CPU identification dynamically. Note that the get_ppc_cpu_type() & friends functions
+ * store the result in global variables so that it can be used latter...
+ * This also verifies that we run on a known CPU.
+ */
+ get_ppc_cpu_type();
+ get_ppc_cpu_revision();
+
+ /* Make sure we detect a known host bridge */
+ BSP_getDiscoveryVersion(/* assert detection */ 1);
+
+ printk("Welcome to %s ($Name$)\n", _RTEMS_version );
+
+ /* Leave all caches as MotLoad left them. Seems to be fine */
+
+ /*
+ * the initial stack has aready been set to this value in start.S
+ * so there is no need to set it in r1 again... It is just for info
+ * so that it can be printed without accessing R1.
+ */
+ asm volatile("mr %0, 1":"=r"(stack));
+
+ /* tag the bottom (T. Straumann 6/36/2001 <strauman@slac.stanford.edu>) */
+
+ *((uint32_t *)stack) = 0;
+
+ /*
+ * Initialize the interrupt related settings
+ * SPRG0 = interrupt nesting level count
+ * SPRG1 = software managed IRQ stack
+ *
+ * This could be done latter (e.g in IRQ_INIT) but it helps to understand
+ * some settings below...
+ */
+ intrStackStart = (uint32_t)__rtems_end;
+ intrStackSize = rtems_configuration_get_interrupt_stack_size();
+
+
+ /*
+ * Initialize default raw exception handlers. See vectors/vectors_init.c
+ */
+ ppc_exc_initialize(
+ PPC_INTERRUPT_DISABLE_MASK_DEFAULT,
+ intrStackStart,
+ intrStackSize
+ );
+
+ printk("CPU: %s\n", get_ppc_cpu_type_name(current_ppc_cpu));
+
+ /*
+ * Initialize RTEMS IRQ system
+ */
+ BSP_rtems_irq_mng_init(0);
+
+ printk("Build Date: %s\n",BSP_build_date);
+
+ BSP_vpdRetrieveFields(vpdData);
+
+ if ( !strncmp(BSP_productIdent,"MVME5500",8) )
+ board_type = MVME5500;
+ else if ( !strncmp(BSP_productIdent,"MVME6100",8) )
+ board_type = MVME6100;
+
+ printk("Board Type: %s (S/N %s)\n",
+ BSP_productIdent[0] ? BSP_productIdent : "n/a",
+ BSP_serialNumber[0] ? BSP_serialNumber : "n/a");
+
+ if ( 0xdeadbeef == BSP_bus_frequency ) {
+ BSP_bus_frequency = 133333333;
+ printk("Bus Clock Freq NOT FOUND in VPD; using %10u Hz\n",
+ BSP_bus_frequency);
+ } else {
+ printk("Bus Clock Freq: %10u Hz\n",
+ BSP_bus_frequency);
+ }
+
+ if ( 0xdeadbeef == BSP_processor_frequency ) {
+ BSP_processor_frequency = BSP_bus_frequency/2;
+ BSP_processor_frequency *= mpc7450PllMultByTwo[ (_read_HID1() >> (31-19)) & 31 ];
+ }
+ printk("CPU Clock Freq: %10u Hz\n", BSP_processor_frequency);
+
+ /* probe real memory size; if it's more than 256M we can't currently access it
+ * since at this point only BAT-0 maps 0..256M
+ */
+ BSP_mem_size = probeMemoryEnd();
+
+ if ( (chpt = strstr(BSP_commandline_string,"MEMSZ=")) ) {
+ char *endp;
+ uint32_t sz;
+ chpt+=6 /* strlen("MEMSZ=") */;
+ sz = strtoul(chpt, &endp, 0);
+ if ( endp != chpt )
+ BSP_mem_size = sz;
+ }
+
+ printk("Memory: %10u bytes\n", BSP_mem_size);
+
+ if ( BSP_mem_size > 0x10000000 ) {
+ uint32_t s;
+ if ( BSP_mem_size > 0x80000000 ) {
+ BSP_mem_size = 0x80000000;
+ printk("Memory clipped to 0x%08x for now, sorry\n", BSP_mem_size);
+ }
+ for ( s = 0x20000000; s < BSP_mem_size ; s<<=1)
+ ;
+ MMUoff();
+ /* since it's currently in use we must first surrender it */
+ setdbat(0, 0, 0, 0, 0);
+ setdbat(0, 0, 0, s, _PAGE_RW);
+ MMUon();
+ }
+
+ printk("-----------------------------------------\n");
+
+ /* Maybe not setup yet because of the warning message */
+
+ /* Allocate and set up the page table mappings
+ * This is only available on >604 CPUs.
+ *
+ * NOTE: This setup routine may modify the available memory
+ * size. It is essential to call it before
+ * calculating the workspace etc.
+ */
+ pt = BSP_pgtbl_setup(&BSP_mem_size);
+ if (!pt)
+ printk("WARNING: unable to setup page tables.\n");
+
+#ifdef SHOW_MORE_INIT_SETTINGS
+ printk("Now BSP_mem_size = 0x%x\n",BSP_mem_size);
+#endif
+
+ /*
+ * Set up our hooks
+ * Make sure libc_init is done before drivers initialized so that
+ * they can use atexit()
+ */
+
+ bsp_clicks_per_usec = BSP_bus_frequency/(BSP_time_base_divisor * 1000);
+
+#ifdef SHOW_MORE_INIT_SETTINGS
+ printk("Configuration.work_space_size = %x\n", Configuration.work_space_size);
+#endif
+
+ /* Activate the page table mappings only after
+ * initializing interrupts because the irq_mng_init()
+ * routine needs to modify the text
+ */
+ if ( pt ) {
+#ifdef SHOW_MORE_INIT_SETTINGS
+ printk("Page table setup finished; will activate it NOW...\n");
+#endif
+ BSP_pgtbl_activate(pt);
+ }
+
+#ifdef SHOW_MORE_INIT_SETTINGS
+ printk("Going to start PCI buses scanning and initialization\n");
+#endif
+ BSP_pci_initialize();
+
+ /* need to tweak the motload setup */
+ BSP_motload_pci_fixup();
+
+ /* map 512M, 256 for PCI 256 for VME */
+ setdbat(5,BSP_PCI_HOSE0_MEM_BASE, BSP_PCI_HOSE0_MEM_BASE, BSP_PCI_HOSE0_MEM_SIZE, IO_PAGE);
+ setdbat(6,BSP_PCI_HOSE1_MEM_BASE, BSP_PCI_HOSE1_MEM_BASE, 0x10000000, IO_PAGE);
+
+#ifdef SHOW_MORE_INIT_SETTINGS
+ printk("Number of PCI buses found is : %d\n", pci_bus_count());
+#endif
+
+ /*
+ * Initialize hardware timer facility (not used by BSP itself)
+ * Needs PCI to identify discovery version...
+ */
+ BSP_timers_initialize();
+
+#ifdef SHOW_MORE_INIT_SETTINGS
+ printk("MSR %x \n", _read_MSR());
+ printk("Exit from bspstart\n");
+#endif
+}
diff --git a/c/src/lib/libbsp/powerpc/beatnik/startup/i2c_init.c b/c/src/lib/libbsp/powerpc/beatnik/startup/i2c_init.c
new file mode 100644
index 0000000000..a91d456cf8
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/beatnik/startup/i2c_init.c
@@ -0,0 +1,132 @@
+/* $Id$ */
+#include <rtems.h>
+#include <bsp.h>
+#include <rtems/libi2c.h>
+#include <libchip/i2c-2b-eeprom.h>
+#include <libchip/i2c-ds1621.h>
+#include <bsp/gti2c_busdrv.h>
+#include <rtems/libio.h>
+
+#include <stdio.h>
+#include <sys/stat.h>
+
+/* Register i2c bus driver & devices */
+
+/*
+ * Authorship
+ * ----------
+ * This software ('beatnik' RTEMS BSP for MVME6100 and MVME5500) was
+ * created by Till Straumann <strauman@slac.stanford.edu>, 2005-2007,
+ * Stanford Linear Accelerator Center, Stanford University.
+ *
+ * Acknowledgement of sponsorship
+ * ------------------------------
+ * The 'beatnik' BSP was produced by
+ * the Stanford Linear Accelerator Center, Stanford University,
+ * under Contract DE-AC03-76SFO0515 with the Department of Energy.
+ *
+ * Government disclaimer of liability
+ * ----------------------------------
+ * Neither the United States nor the United States Department of Energy,
+ * nor any of their employees, makes any warranty, express or implied, or
+ * assumes any legal liability or responsibility for the accuracy,
+ * completeness, or usefulness of any data, apparatus, product, or process
+ * disclosed, or represents that its use would not infringe privately owned
+ * rights.
+ *
+ * Stanford disclaimer of liability
+ * --------------------------------
+ * Stanford University makes no representations or warranties, express or
+ * implied, nor assumes any liability for the use of this software.
+ *
+ * Stanford disclaimer of copyright
+ * --------------------------------
+ * Stanford University, owner of the copyright, hereby disclaims its
+ * copyright and all other rights in this software. Hence, anyone may
+ * freely use it for any purpose without restriction.
+ *
+ * Maintenance of notices
+ * ----------------------
+ * In the interest of clarity regarding the origin and status of this
+ * SLAC software, this and all the preceding Stanford University notices
+ * are to remain affixed to any copy or derivative of this software made
+ * or distributed by the recipient and are to be affixed to any copy of
+ * software made or distributed by the recipient that contains a copy or
+ * derivative of this software.
+ *
+ * ------------------ SLAC Software Notices, Set 4 OTT.002a, 2004 FEB 03
+ */
+
+int
+BSP_i2c_initialize( void )
+{
+int busno;
+ /* Initialize the library */
+ if ( rtems_libi2c_initialize() ) {
+ fprintf(stderr,"Initializing I2C library failed\n");
+ return -1;
+ }
+
+ /* Register our bus driver */
+ if ( (busno=rtems_libi2c_register_bus(
+ BSP_I2C_BUS0_NAME,
+ BSP_I2C_BUS_DESCRIPTOR) ) < 0 ) {
+ perror("Registering gt64260 i2c bus driver");
+ return -1;
+ }
+
+ /* Now register higher level drivers; note that
+ * the i2c address in the manual is actually left-shifted
+ * by one bit, i.e., as it would go on the bus.
+ */
+
+ /* Use read-only driver for VPD */
+ if ( rtems_libi2c_register_drv(
+ BSP_I2C_VPD_EEPROM_NAME,
+ i2c_2b_eeprom_ro_driver_descriptor,
+ busno,
+ BSP_VPD_I2C_ADDR) < 0 ) {
+ perror("Registering i2c VPD eeprom driver failed");
+ return -1;
+ }
+
+ /* Use read-write driver for user eeprom -- you still might
+ * have to disable HW write-protection on your board.
+ */
+ if ( rtems_libi2c_register_drv(
+ BSP_I2C_USR_EEPROM_NAME,
+ i2c_2b_eeprom_driver_descriptor,
+ busno,
+ BSP_USR_I2C_ADDR) < 0 ) {
+ perror("Registering i2c USR eeprom driver failed");
+ return -1;
+ }
+
+ /* The thermostat */
+ if ( rtems_libi2c_register_drv(
+ BSP_I2C_DS1621_NAME,
+ i2c_ds1621_driver_descriptor,
+ busno,
+ BSP_THM_I2C_ADDR) < 0 ) {
+ perror("Registering i2c ds1621 temp sensor. driver failed");
+ return -1;
+ }
+
+ /* Finally, as an example, register raw access to the
+ * ds1621. The driver above just reads the 8 msb of the
+ * temperature but doesn't support anything else. Using
+ * the raw device node you can write/read individual
+ * control bytes yourself and e.g., program the thermostat...
+ */
+
+ if ( mknod(
+ BSP_I2C_DS1621_RAW_DEV_NAME,
+ 0666 | S_IFCHR,
+ rtems_filesystem_make_dev_t(rtems_libi2c_major,
+ RTEMS_LIBI2C_MAKE_MINOR(busno,BSP_THM_I2C_ADDR))) ) {
+ perror("Creating device node for raw ds1621 access failed");
+ return -1;
+ }
+ printf("I2C devices registered\n");
+ return 0;
+}
diff --git a/c/src/lib/libbsp/powerpc/beatnik/startup/linkcmds b/c/src/lib/libbsp/powerpc/beatnik/startup/linkcmds
new file mode 100644
index 0000000000..a186b6dcae
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/beatnik/startup/linkcmds
@@ -0,0 +1,261 @@
+OUTPUT_FORMAT("elf32-powerpc", "elf32-powerpc",
+ "elf32-powerpc")
+OUTPUT_ARCH(powerpc)
+ENTRY(_start)
+/* Do we need any of these for elf?
+ __DYNAMIC = 0; */
+PROVIDE (__stack = 0);
+
+
+MEMORY {
+ BOTTOM : ORIGIN = 0x00, LENGTH = 0x80
+ MAILBOX : ORIGIN = 0x80, LENGTH = 0x80 /* RESERVED */
+ VECTORS : ORIGIN = 0x100 , LENGTH = 0x3000 - 0x100
+ CODE : ORIGIN = 0x3000 , LENGTH = 32M-0x3000
+}
+SECTIONS
+{
+ /* discard the 'shared/vector.S' entry point section */
+ /DISCARD/ :
+ {
+ *(.entry_point_section)
+ }
+
+
+ .vectors :
+ {
+ /* should be the first thing... */
+ *(.ppc_preloader_section)
+
+ /*
+ * This section is used only if NO_DYNAMIC_EXCEPTION_VECTOR_INSTALL
+ * is defined in vectors/vectors.S
+ * *(.vectors)
+ * We actually RELY on dynamic vector installation since we need
+ * this space for the preloader...
+ */
+ } > VECTORS
+
+
+ /* START OF THE LOADED IMAGE (parts moved by the preloader) */
+ .image_start :
+ {
+ __rtems_start = ABSOLUTE(.);
+ } > CODE
+
+ /* Read-only sections, merged into text segment: */
+ .interp : { *(.interp) } > CODE
+ .hash : { *(.hash) } > CODE
+ .dynsym : { *(.dynsym) } > CODE
+ .dynstr : { *(.dynstr) } > CODE
+ .gnu.version : { *(.gnu.version) } > CODE
+ .gnu.version_d : { *(.gnu.version_d) } > CODE
+ .gnu.version_r : { *(.gnu.version_r) } > CODE
+ .rela.text :
+ { *(.rela.text) *(.rela.gnu.linkonce.t*) } > CODE
+ .rela.data :
+ { *(.rela.data) *(.rela.gnu.linkonce.d*) } > CODE
+ .rela.rodata :
+ { *(.rela.rodata) *(.rela.gnu.linkonce.r*) } > CODE
+ .rela.got : { *(.rela.got) } > CODE
+ .rela.got1 : { *(.rela.got1) } > CODE
+ .rela.got2 : { *(.rela.got2) } > CODE
+ .rela.ctors : { *(.rela.ctors) } > CODE
+ .rela.dtors : { *(.rela.dtors) } > CODE
+ .rela.init : { *(.rela.init) } > CODE
+ .rela.fini : { *(.rela.fini) } > CODE
+ .rela.bss : { *(.rela.bss) } > CODE
+ .rela.plt : { *(.rela.plt) } > CODE
+ .rela.sdata : { *(.rela.sdata) } > CODE
+ .rela.sbss : { *(.rela.sbss) } > CODE
+ .rela.sdata2 : { *(.rela.sdata2) } > CODE
+ .rela.sbss2 : { *(.rela.sbss2) } > CODE
+
+ .init : { *(.init) } >CODE
+
+ .text :
+ {
+ *(.text*)
+
+ /*
+ * Special FreeBSD sysctl sections.
+ */
+ . = ALIGN (16);
+ __start_set_sysctl_set = .;
+ *(set_sysctl_*);
+ __stop_set_sysctl_set = ABSOLUTE(.);
+ *(set_domain_*);
+ *(set_pseudo_*);
+
+ /* .gnu.warning sections are handled specially by elf32.em. */
+ *(.gnu.warning)
+ *(.gnu.linkonce.t*)
+ } > CODE
+
+ .fini : { _fini = .; *(.fini) } >CODE
+ .rodata : { *(.rodata*) *(.gnu.linkonce.r*) } > CODE
+ .rodata1 : { *(.rodata1) } > CODE
+_SDA2_BASE_ = __SDATA2_START__ + 0x8000;
+ .sdata2 : { *(.sdata2) *(.gnu.linkonce.s2.*) } > CODE
+ .sbss2 : {
+ PROVIDE (__sbss2_start = .);
+ *(.sbss2*) *(.gnu.linkonce.sb2.*)
+ /* avoid empty sdata2/sbss2 area because __eabi wouldn't set up r2
+ * (IMPORTANT if run-time loading is involved)
+ */
+ . += 1 ;
+ PROVIDE (__sbss2_end = .);
+ } > CODE
+ .eh_frame : { *.(eh_frame) } >CODE
+ _etext = .;
+ PROVIDE (etext = .);
+ /* Adjust the address for the data segment. We want to adjust up to
+ the same address within the page on the next page up. It would
+ be more correct to do this:
+ . = ALIGN(0x40000) + (ALIGN(8) & (0x40000 - 1));
+ The current expression does not correctly handle the case of a
+ text segment ending precisely at the end of a page; it causes the
+ data segment to skip a page. The above expression does not have
+ this problem, but it will currently (2/95) cause BFD to allocate
+ a single segment, combining both text and data, for this case.
+ This will prevent the text segment from being shared among
+ multiple executions of the program; I think that is more
+ important than losing a page of the virtual address space (note
+ that no actual memory is lost; the page which is skipped can not
+ be referenced). */
+ .data ALIGN(0x1000) :
+ {
+ PROVIDE(__DATA_START__ = ABSOLUTE(.) );
+ *(.data)
+ *(.gnu.linkonce.d*)
+ CONSTRUCTORS
+ } > CODE
+ .data1 : { *(.data1) } > CODE
+ PROVIDE (__EXCEPT_START__ = .);
+ .gcc_except_table : { *(.gcc_except_table) } > CODE
+ PROVIDE (__EXCEPT_END__ = .);
+ .got1 : { *(.got1) } > CODE
+ .dynamic : { *(.dynamic) } > CODE
+ /* Put .ctors and .dtors next to the .got2 section, so that the pointers
+ get relocated with -mrelocatable. Also put in the .fixup pointers.
+ The current compiler no longer needs this, but keep it around for 2.7.2 */
+ PROVIDE (_GOT2_START_ = .);
+ .got2 : { *(.got2) } > CODE
+/*
+ PROVIDE (__CTOR_LIST__ = .);
+ .ctors : { *(.ctors) } > CODE
+ PROVIDE (__CTOR_END__ = .);
+*/
+ .ctors :
+ {
+ KEEP(*crtbegin.o(.ctors))
+ KEEP(*(EXCLUDE_FILE(*crtend.o) .ctors))
+ KEEP(*(SORT(.ctors.*)))
+ KEEP(*(.ctors))
+ } > CODE
+ .dtors :
+ {
+ KEEP(*crtbegin.o(.dtors))
+ KEEP(*(EXCLUDE_FILE(*crtend.o) .dtors))
+ KEEP(*(SORT(.dtors.*)))
+ KEEP(*(.dtors))
+ } > CODE
+/*
+ PROVIDE (__DTOR_LIST__ = .);
+ .dtors : { *(.dtors) } > CODE
+ PROVIDE (__DTOR_END__ = .);
+*/
+ PROVIDE (_FIXUP_START_ = .);
+ .fixup : { *(.fixup) } > CODE
+ PROVIDE (_FIXUP_END_ = .);
+ PROVIDE (_GOT2_END_ = .);
+ PROVIDE (_GOT_START_ = .);
+ .got : { *(.got) } > CODE
+ .got.plt : { *(.got.plt) } > CODE
+ PROVIDE (_GOT_END_ = .);
+
+ .jcr : { KEEP (*(.jcr)) } > CODE
+
+ /* We want the small data sections together, so single-instruction offsets
+ can access them all, and initialized data all before uninitialized, so
+ we can shorten the on-disk segment size. */
+_SDA_BASE_ = __SDATA_START__ + 0x8000;
+ .sdata : { *(.sdata*) *(.gnu.linkonce.s.*) } > CODE
+ _edata = .;
+ PROVIDE (edata = .);
+/* END OF THE LOADED IMAGE (parts moved by the preloader) */
+/* BELOW THIS POINT, NO LOADABLE ITEMS MUST APPEAR */
+ .sbss :
+ {
+ PROVIDE (__sbss_start = ABSOLUTE(.));
+ *(.sbss) *(.sbss.*) *(.gnu.linkonce.sb.*)
+ *(.scommon)
+ *(.dynsbss)
+ /* avoid empty sdata/sbss area because __eabi wouldn't set up r13
+ * (IMPORTANT if run-time loading is involved)
+ */
+ . += 1 ;
+ PROVIDE (__sbss_end = ABSOLUTE(.));
+ } > CODE
+ .plt : { *(.plt) } > CODE
+ .bss :
+ {
+ PROVIDE (__bss_start = ABSOLUTE(.));
+ *(.dynbss)
+ *(.bss*) *(.gnu.linkonce.b.*)
+ *(COMMON)
+ . = ALIGN(16);
+ } > CODE
+ /* proper alignment for SYSV stack
+ * (init stack is allocated just after __rtems_end
+ */
+ . = ALIGN(16);
+ _end = . ;
+ __rtems_end = . ;
+ PROVIDE (end = .);
+ /DISCARD/ :
+ {
+ *(.comment)
+ }
+
+
+ /* 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) }
+ .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) }
+ /* These must appear regardless of . */
+}
diff --git a/c/src/lib/libbsp/powerpc/beatnik/startup/reboot.c b/c/src/lib/libbsp/powerpc/beatnik/startup/reboot.c
new file mode 100644
index 0000000000..0e6af195f4
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/beatnik/startup/reboot.c
@@ -0,0 +1,16 @@
+#include <rtems.h>
+#include <bsp.h>
+#include <rtems/bspIo.h>
+#include <libcpu/io.h>
+#include <libcpu/stackTrace.h>
+
+void bsp_reset()
+{
+
+ printk("Printing a stack trace for your convenience :-)\n");
+ CPU_print_stack();
+
+ printk("RTEMS terminated; Rebooting ...\n");
+ /* Mvme5500 board reset : 2004 S. Kate Feng <feng1@bnl.gov> */
+ out_8((volatile unsigned char*) (BSP_MV64x60_DEV1_BASE +2), 0x80);
+}