change log for rtems (2011-07-15)
rtems-vc at rtems.org
rtems-vc at rtems.org
Sat Jul 16 02:10:51 UTC 2011
*strauman*:
2011-07-15 Till Straumann <strauman at slac.stanford.edu>
* shared/irq/init_irq.c, shared/irq/openpic_i8259_irq.c,
shared/pci/detect_raven_bridge.c: conditionally compile
ISA and PCI-interrupt related stuff only if BSP defines
BSP_ISA_IRQ_NUMBER > 0 and/or BSP_PCI_IRQ_NUMBER > 0,
respectively.
M 1.253 c/src/lib/libbsp/powerpc/ChangeLog
M 1.30 c/src/lib/libbsp/powerpc/shared/irq/irq_init.c
M 1.12 c/src/lib/libbsp/powerpc/shared/irq/openpic_i8259_irq.c
M 1.17 c/src/lib/libbsp/powerpc/shared/pci/detect_raven_bridge.c
diff -u rtems/c/src/lib/libbsp/powerpc/ChangeLog:1.252 rtems/c/src/lib/libbsp/powerpc/ChangeLog:1.253
--- rtems/c/src/lib/libbsp/powerpc/ChangeLog:1.252 Sun Jun 19 02:40:37 2011
+++ rtems/c/src/lib/libbsp/powerpc/ChangeLog Fri Jul 15 20:15:05 2011
@@ -1,3 +1,11 @@
+2011-07-15 Till Straumann <strauman at slac.stanford.edu>
+
+ * shared/irq/init_irq.c, shared/irq/openpic_i8259_irq.c,
+ shared/pci/detect_raven_bridge.c: conditionally compile
+ ISA and PCI-interrupt related stuff only if BSP defines
+ BSP_ISA_IRQ_NUMBER > 0 and/or BSP_PCI_IRQ_NUMBER > 0,
+ respectively.
+
2011-06-19 Ralf Corsépius <ralf.corsepius at rtems.org>
* Makefile.am: Remove references to non-existing files.
diff -u rtems/c/src/lib/libbsp/powerpc/shared/irq/irq_init.c:1.29 rtems/c/src/lib/libbsp/powerpc/shared/irq/irq_init.c:1.30
--- rtems/c/src/lib/libbsp/powerpc/shared/irq/irq_init.c:1.29 Wed Apr 28 13:51:58 2010
+++ rtems/c/src/lib/libbsp/powerpc/shared/irq/irq_init.c Fri Jul 15 20:15:05 2011
@@ -22,8 +22,10 @@
#include <libcpu/spr.h>
#include <bsp/pci.h>
#include <bsp/residual.h>
-#include <bsp/openpic.h>
#include <bsp/irq.h>
+#if BSP_PCI_IRQ_NUMBER > 0
+#include <bsp/openpic.h>
+#endif
#include <bsp/irq_supp.h>
#include <bsp.h>
#include <bsp/motorola.h>
@@ -36,7 +38,9 @@
} pci_isa_bridge_device;
pci_isa_bridge_device* via_82c586 = 0;
+#ifndef qemu
static pci_isa_bridge_device bridge;
+#endif
/*
* default methods
@@ -83,16 +87,19 @@
0,0,
255,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+#if BSP_PCI_IRQ_NUMBER > 0
/*
* PCI Interrupts
*/
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, /* for raven prio 0 means unactive... */
+#endif
/*
* Processor exceptions handled as interrupts
*/
0
};
+#if BSP_PCI_IRQ_NUMBER > 0
#if defined(mvme2100)
static unsigned char mvme2100_openpic_initpolarities[16] = {
0, /* Not used - should be disabled */
@@ -156,7 +163,9 @@
1, /* MCP750_INT_PCI_BUS2_INTD */
};
#endif
+#endif
+#if BSP_ISA_IRQ_NUMBER > 0 && !defined(qemu)
void VIA_isa_bridge_interrupts_setup(void)
{
pci_isa_bridge_device pci_dev;
@@ -259,6 +268,7 @@
#endif
}
}
+#endif
/*
* This code assumes the exceptions management setup has already
@@ -268,7 +278,7 @@
*/
void BSP_rtems_irq_mng_init(unsigned cpuId)
{
-#if !defined(mvme2100)
+#if BSP_ISA_IRQ_NUMBER > 0 && !defined(mvme2100)
int known_cpi_isa_bridge = 0;
#endif
int i;
@@ -285,6 +295,7 @@
*/
openpic_init(1, mvme2100_openpic_initpolarities, mvme2100_openpic_initsenses, 16, 16, BSP_bus_frequency);
#else
+#if BSP_PCI_IRQ_NUMBER > 0
#ifdef TRACE_IRQ_INIT
printk("Going to initialize raven interrupt controller (openpic compliant)\n");
#endif
@@ -292,8 +303,13 @@
#ifdef TRACE_IRQ_INIT
printk("Going to initialize the PCI/ISA bridge IRQ related setting (VIA 82C586)\n");
#endif
+#endif
+
+#if BSP_ISA_IRQ_NUMBER > 0
if ( currentBoard == MESQUITE ) {
+#ifndef qemu
VIA_isa_bridge_interrupts_setup();
+#endif
known_cpi_isa_bridge = 1;
}
if ( currentBoard == MVME_2300 ) {
@@ -316,6 +332,8 @@
BSP_i8259s_init();
#endif
+#endif
+
/*
* Initialize RTEMS management interrupt table
*/
diff -u rtems/c/src/lib/libbsp/powerpc/shared/irq/openpic_i8259_irq.c:1.11 rtems/c/src/lib/libbsp/powerpc/shared/irq/openpic_i8259_irq.c:1.12
--- rtems/c/src/lib/libbsp/powerpc/shared/irq/openpic_i8259_irq.c:1.11 Fri Jan 28 14:29:52 2011
+++ rtems/c/src/lib/libbsp/powerpc/shared/irq/openpic_i8259_irq.c Fri Jul 15 20:15:06 2011
@@ -20,15 +20,22 @@
#ifndef BSP_HAS_NO_VME
#include <bsp/VMEConfig.h>
#endif
+#if BSP_PCI_IRQ_NUMBER > 0
#include <bsp/openpic.h>
+#endif
#include <libcpu/io.h>
#include <bsp/vectors.h>
#include <stdlib.h>
#include <rtems/bspIo.h> /* for printk */
+
+#ifndef qemu
#define RAVEN_INTR_ACK_REG 0xfeff0030
+#else
+#define RAVEN_INTR_ACK_REG 0xbffffff0
+#endif
-#ifdef BSP_PCI_ISA_BRIDGE_IRQ
+#if BSP_ISA_IRQ_NUMBER > 0
/*
* pointer to the mask representing the additionnal irq vectors
* that must be disabled when a particular entry is activated.
@@ -47,33 +54,35 @@
static rtems_irq_connect_data* rtems_hdl_tbl;
-#ifdef BSP_PCI_ISA_BRIDGE_IRQ
+#if BSP_ISA_IRQ_NUMBER > 0
/*
* Check if IRQ is an ISA IRQ
*/
static inline int is_isa_irq(const rtems_irq_number irqLine)
{
- return (((int) irqLine <= BSP_ISA_IRQ_MAX_OFFSET) &
+ return (((int) irqLine <= BSP_ISA_IRQ_MAX_OFFSET) &&
((int) irqLine >= BSP_ISA_IRQ_LOWEST_OFFSET)
);
}
#endif
+#if BSP_PCI_IRQ_NUMBER > 0
/*
* Check if IRQ is an OPENPIC IRQ
*/
static inline int is_pci_irq(const rtems_irq_number irqLine)
{
- return (((int) irqLine <= BSP_PCI_IRQ_MAX_OFFSET) &
+ return OpenPIC && (((int) irqLine <= BSP_PCI_IRQ_MAX_OFFSET) &&
((int) irqLine >= BSP_PCI_IRQ_LOWEST_OFFSET)
);
}
+#endif
/*
* ------------------------ RTEMS Irq helper functions ----------------
*/
-#ifdef BSP_PCI_ISA_BRIDGE_IRQ
+#if BSP_ISA_IRQ_NUMBER > 0
/*
* Caution : this function assumes the variable "*config"
* is already set and that the tables it contains are still valid
@@ -103,7 +112,7 @@
void
BSP_enable_irq_at_pic(const rtems_irq_number name)
{
-#ifdef BSP_PCI_ISA_BRIDGE_IRQ
+#if BSP_ISA_IRQ_NUMBER > 0
if (is_isa_irq(name)) {
/*
* Enable interrupt at PIC level
@@ -112,18 +121,20 @@
}
#endif
+#if BSP_PCI_IRQ_NUMBER > 0
if (is_pci_irq(name)) {
/*
* Enable interrupt at OPENPIC level
*/
openpic_enable_irq ((int) name - BSP_PCI_IRQ_LOWEST_OFFSET);
}
+#endif
}
int
BSP_disable_irq_at_pic(const rtems_irq_number name)
{
-#ifdef BSP_PCI_ISA_BRIDGE_IRQ
+#if BSP_ISA_IRQ_NUMBER > 0
if (is_isa_irq(name)) {
/*
* disable interrupt at PIC level
@@ -131,12 +142,14 @@
return BSP_irq_disable_at_i8259s ((int) name - BSP_ISA_IRQ_LOWEST_OFFSET);
}
#endif
+#if BSP_PCI_IRQ_NUMBER > 0
if (is_pci_irq(name)) {
/*
* disable interrupt at OPENPIC level
*/
return openpic_disable_irq ((int) name - BSP_PCI_IRQ_LOWEST_OFFSET);
}
+#endif
return -1;
}
@@ -156,7 +169,7 @@
* set up internal tables used by rtems interrupt prologue
*/
-#ifdef BSP_PCI_ISA_BRIDGE_IRQ
+#if BSP_ISA_IRQ_NUMBER > 0
/*
* start with ISA IRQ
*/
@@ -179,6 +192,9 @@
}
#endif
+#if BSP_PCI_IRQ_NUMBER > 0
+ if ( ! OpenPIC )
+ return 1;
/*
* continue with PCI IRQ
*/
@@ -197,12 +213,11 @@
}
#ifdef BSP_PCI_ISA_BRIDGE_IRQ
- if ( BSP_ISA_IRQ_NUMBER > 0 ) {
- /*
- * Must enable PCI/ISA bridge IRQ
- */
- openpic_enable_irq (0);
- }
+ /*
+ * Must enable PCI/ISA bridge IRQ
+ */
+ openpic_enable_irq (BSP_PCI_ISA_BRIDGE_IRQ);
+#endif
#endif
return 1;
@@ -218,7 +233,7 @@
int C_dispatch_irq_handler (BSP_Exception_frame *frame, unsigned int excNum)
{
register unsigned int irq;
-#ifdef BSP_PCI_ISA_BRIDGE_IRQ
+#if BSP_ISA_IRQ_NUMBER > 0
register unsigned isaIntr; /* boolean */
register unsigned oldMask = 0; /* old isa pic masks */
register unsigned newMask; /* new isa pic masks */
@@ -231,17 +246,39 @@
return 0;
}
- irq = openpic_irq(0);
- if (irq == OPENPIC_VEC_SPURIOUS) {
- ++BSP_spuriousIntr;
- return 0;
- }
- /* some BSPs might want to use a different numbering... */
- irq = irq - OPENPIC_VEC_SOURCE + BSP_PCI_IRQ_LOWEST_OFFSET;
+#if BSP_PCI_IRQ_NUMBER > 0
+ if ( OpenPIC ) {
+ irq = openpic_irq(0);
+ if (irq == OPENPIC_VEC_SPURIOUS) {
+ ++BSP_spuriousIntr;
+ return 0;
+ }
+
+ /* some BSPs might want to use a different numbering... */
+ irq = irq - OPENPIC_VEC_SOURCE + BSP_PCI_IRQ_LOWEST_OFFSET;
+ } else {
+#if BSP_ISA_IRQ_NUMBER > 0
+#ifdef BSP_PCI_ISA_BRIDGE_IRQ
+ irq = BSP_PCI_ISA_BRIDGE_IRQ;
+#else
+#error "Configuration Error -- BSP with ISA + PCI IRQs MUST define BSP_PCI_ISA_BRIDGE_IRQ"
+#endif
+#else
+ rtems_panic("MUST have an OpenPIC if BSP has PCI IRQs but no ISA IRQs");
+#endif
+ }
+#endif
+#if BSP_ISA_IRQ_NUMBER > 0
#ifdef BSP_PCI_ISA_BRIDGE_IRQ
+#if 0 == BSP_PCI_IRQ_NUMBER
+#error "Configuration Error -- BSP w/o PCI IRQs MUST NOT define BSP_PCI_ISA_BRIDGE_IRQ"
+#endif
isaIntr = (irq == BSP_PCI_ISA_BRIDGE_IRQ);
+#else
+ isaIntr = 1;
+#endif
if (isaIntr) {
/*
* Acknowledge and read 8259 vector
@@ -256,14 +293,17 @@
outport_byte(PIC_MASTER_IMR_IO_PORT, i8259s_cache & 0xff);
outport_byte(PIC_SLAVE_IMR_IO_PORT, ((i8259s_cache & 0xff00) >> 8));
BSP_irq_ack_at_i8259s (irq);
- openpic_eoi(0);
+#if BSP_PCI_IRQ_NUMBER > 0
+ if ( OpenPIC )
+ openpic_eoi(0);
+#endif
}
#endif
/* dispatch handlers */
bsp_irq_dispatch_list(rtems_hdl_tbl, irq, default_rtems_entry.hdl);
-#ifdef BSP_PCI_ISA_BRIDGE_IRQ
+#if BSP_ISA_IRQ_NUMBER > 0
if (isaIntr) {
i8259s_cache = oldMask;
outport_byte(PIC_MASTER_IMR_IO_PORT, i8259s_cache & 0xff);
@@ -272,14 +312,18 @@
else
#endif
{
+#if BSP_PCI_IRQ_NUMBER > 0
#ifdef BSP_PCI_VME_DRIVER_DOES_EOI
/* leave it to the VME bridge driver to do EOI, so
* it can re-enable the openpic while handling
* VME interrupts (-> VME priorities in software)
*/
- if (_BSP_vme_bridge_irq != irq)
+ if (_BSP_vme_bridge_irq != irq && OpenPIC)
#endif
openpic_eoi(0);
+#else
+ do {} while (0);
+#endif
}
return 0;
}
diff -u rtems/c/src/lib/libbsp/powerpc/shared/pci/detect_raven_bridge.c:1.16 rtems/c/src/lib/libbsp/powerpc/shared/pci/detect_raven_bridge.c:1.17
--- rtems/c/src/lib/libbsp/powerpc/shared/pci/detect_raven_bridge.c:1.16 Wed Jan 19 10:54:20 2011
+++ rtems/c/src/lib/libbsp/powerpc/shared/pci/detect_raven_bridge.c Fri Jul 15 20:15:06 2011
@@ -10,6 +10,7 @@
#include <bsp/consoleIo.h>
#include <bsp/residual.h>
#include <bsp/openpic.h>
+#include <bsp/irq.h>
#include <rtems/bspIo.h>
#include <libcpu/cpuIdent.h>
@@ -187,9 +188,12 @@
printk("OpenPIC found at %x.\n", OpenPIC);
}
}
+
+#if BSP_PCI_IRQ_NUMBER > 0
if (OpenPIC == (volatile struct OpenPIC *)0) {
BSP_panic("OpenPic Not found\n");
}
+#endif
}
*strauman*:
2011-07-15 Till Straumann <strauman at slac.stanford.edu>
* shared/startup/ppc_idle.c: added an 'idle task' body
which switches the CPU into power-save mode. IIRC, this
cannot be used on real hardware due to errata :-( but
it still saves valuable host-CPU cycles when used by
the qemuprep BSP.
M 1.254 c/src/lib/libbsp/powerpc/ChangeLog
A 1.1 c/src/lib/libbsp/powerpc/shared/startup/ppc_idle.c
diff -u rtems/c/src/lib/libbsp/powerpc/ChangeLog:1.253 rtems/c/src/lib/libbsp/powerpc/ChangeLog:1.254
--- rtems/c/src/lib/libbsp/powerpc/ChangeLog:1.253 Fri Jul 15 20:15:05 2011
+++ rtems/c/src/lib/libbsp/powerpc/ChangeLog Fri Jul 15 20:18:25 2011
@@ -1,5 +1,13 @@
2011-07-15 Till Straumann <strauman at slac.stanford.edu>
+ * shared/startup/ppc_idle.c: added an 'idle task' body
+ which switches the CPU into power-save mode. IIRC, this
+ cannot be used on real hardware due to errata :-( but
+ it still saves valuable host-CPU cycles when used by
+ the qemuprep BSP.
+
+2011-07-15 Till Straumann <strauman at slac.stanford.edu>
+
* shared/irq/init_irq.c, shared/irq/openpic_i8259_irq.c,
shared/pci/detect_raven_bridge.c: conditionally compile
ISA and PCI-interrupt related stuff only if BSP defines
diff -u /dev/null rtems/c/src/lib/libbsp/powerpc/shared/startup/ppc_idle.c:1.1
--- /dev/null Fri Jul 15 21:10:49 2011
+++ rtems/c/src/lib/libbsp/powerpc/shared/startup/ppc_idle.c Fri Jul 15 20:18:25 2011
@@ -0,0 +1,87 @@
+/* $Id$ */
+
+/*
+ * ppc_idle.c
+ *
+ * Authorship
+ * ----------
+ * This software was created by
+ * Till Straumann <strauman at slac.stanford.edu>, 2010,
+ * Stanford Linear Accelerator Center, Stanford University.
+ *
+ * Acknowledgement of sponsorship
+ * ------------------------------
+ * This software 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
+ */
+#include <bsp.h>
+#include <stdint.h>
+
+#ifdef BSP_IDLE_TASK_BODY
+
+/* Provide an idle-task body which switches the
+ * CPU into power-save mode when idle. Any exception
+ * (including an interrupt/external-exception)
+ * wakes it up.
+ *
+ * IIRC - this cannot be used on real hardware due
+ * to errata on many chips which is a real
+ * pity. However, when used under qemu it
+ * saves host-CPU cycles.
+ * While qemu-0.12.4 needed to be patched
+ * (would otherwise hang because an exception
+ * didn't clear MSR_POW) qemu-0.14.1 seems
+ * to work fine.
+ */
+
+#include <rtems/powerpc/registers.h>
+
+void *
+bsp_ppc_idle_task_body(uintptr_t ignored)
+{
+uint32_t msr;
+ _CPU_MSR_GET(msr);
+ msr |= MSR_POW;
+ asm volatile(
+ "1: sync \n"
+ " mtmsr %0 \n"
+ " isync \n"
+ " b 1b \n"
+ ::"r"(msr)
+ );
+ return 0;
+}
+
+#endif
*strauman*:
2011-07-15 Till Straumann <strauman at slac.stanford.edu>
* shared/bootloader/misc.c: Copy residual data
_before_ decompressing the kernel since the firmware
may have stored it in an area that is overwritten
by decompress_kernel().
M 1.255 c/src/lib/libbsp/powerpc/ChangeLog
M 1.13 c/src/lib/libbsp/powerpc/shared/bootloader/misc.c
diff -u rtems/c/src/lib/libbsp/powerpc/ChangeLog:1.254 rtems/c/src/lib/libbsp/powerpc/ChangeLog:1.255
--- rtems/c/src/lib/libbsp/powerpc/ChangeLog:1.254 Fri Jul 15 20:18:25 2011
+++ rtems/c/src/lib/libbsp/powerpc/ChangeLog Fri Jul 15 20:21:36 2011
@@ -1,5 +1,12 @@
2011-07-15 Till Straumann <strauman at slac.stanford.edu>
+ * shared/bootloader/misc.c: Copy residual data
+ _before_ decompressing the kernel since the firmware
+ may have stored it in an area that is overwritten
+ by decompress_kernel().
+
+2011-07-15 Till Straumann <strauman at slac.stanford.edu>
+
* shared/startup/ppc_idle.c: added an 'idle task' body
which switches the CPU into power-save mode. IIRC, this
cannot be used on real hardware due to errata :-( but
diff -u rtems/c/src/lib/libbsp/powerpc/shared/bootloader/misc.c:1.12 rtems/c/src/lib/libbsp/powerpc/shared/bootloader/misc.c:1.13
--- rtems/c/src/lib/libbsp/powerpc/shared/bootloader/misc.c:1.12 Fri Jan 28 14:29:52 2011
+++ rtems/c/src/lib/libbsp/powerpc/shared/bootloader/misc.c Fri Jul 15 20:21:36 2011
@@ -176,15 +176,17 @@
printk("Not enough memory to uncompress the kernel.");
exit();
}
+
+ rescopy=salloc(sizeof(RESIDUAL));
+ /* Let us hope that residual data is aligned on word boundary */
+ *rescopy = *bd->residual;
+ bd->residual = (void *)PAGE_ALIGN(kernel_size);
+
/* Note that this clears the bss as a side effect, so some code
* with ugly special case for SMP could be removed from the kernel!
*/
memset(parea, 0, kernel_size);
printk("\nUncompressing the kernel...\n");
- rescopy=salloc(sizeof(RESIDUAL));
- /* Let us hope that residual data is aligned on word boundary */
- *rescopy = *bd->residual;
- bd->residual = (void *)PAGE_ALIGN(kernel_size);
gunzip(parea, kernel_size, zimage_start, &zimage_size);
@@ -287,13 +289,15 @@
printk("\nModel: %s\nSerial: %s\n"
"Processor/Bus frequencies (Hz): %ld/%ld\n"
"Time Base Divisor: %ld\n"
- "Memory Size: %lx\n",
+ "Memory Size: %lx\n"
+ "Residual: %lx (length %u)\n",
vpd.PrintableModel,
vpd.Serial,
vpd.ProcessorHz,
vpd.ProcessorBusHz,
(vpd.TimeBaseDivisor ? vpd.TimeBaseDivisor : 4000),
- res->TotalMemory);
+ res->TotalMemory,
+ (unsigned long)res, res->ResidualLength);
/* This reconfigures all the PCI subsystem */
pci_init();
*strauman*:
2011-07-15 Till Straumann <strauman at slac.stanford.edu>
* shared/bootloader/mm.c, shared/bootloader/pci.c,
shared/bootloader/qemu_fakeres.c, shared/bootloader/qemu_fakerom.S,
shared/irq/irq.h, shared/motorola/motorola.c, shared/residual/residual.h,
shared/startup/bspstart.c,
Added 'qemuprep' BSP variant.
M 1.256 c/src/lib/libbsp/powerpc/ChangeLog
M 1.8 c/src/lib/libbsp/powerpc/shared/bootloader/mm.c
M 1.18 c/src/lib/libbsp/powerpc/shared/bootloader/pci.c
A 1.1 c/src/lib/libbsp/powerpc/shared/bootloader/qemu_fakeres.c
A 1.1 c/src/lib/libbsp/powerpc/shared/bootloader/qemu_fakerom.S
M 1.17 c/src/lib/libbsp/powerpc/shared/irq/irq.h
M 1.18 c/src/lib/libbsp/powerpc/shared/motorola/motorola.c
M 1.3 c/src/lib/libbsp/powerpc/shared/residual/residual.h
M 1.56 c/src/lib/libbsp/powerpc/shared/startup/bspstart.c
diff -u rtems/c/src/lib/libbsp/powerpc/ChangeLog:1.255 rtems/c/src/lib/libbsp/powerpc/ChangeLog:1.256
--- rtems/c/src/lib/libbsp/powerpc/ChangeLog:1.255 Fri Jul 15 20:21:36 2011
+++ rtems/c/src/lib/libbsp/powerpc/ChangeLog Fri Jul 15 20:29:04 2011
@@ -1,5 +1,13 @@
2011-07-15 Till Straumann <strauman at slac.stanford.edu>
+ * shared/bootloader/mm.c, shared/bootloader/pci.c,
+ shared/bootloader/qemu_fakeres.c, shared/bootloader/qemu_fakerom.S,
+ shared/irq/irq.h, shared/motorola/motorola.c, shared/residual/residual.h,
+ shared/startup/bspstart.c,
+ Added 'qemuprep' BSP variant.
+
+2011-07-15 Till Straumann <strauman at slac.stanford.edu>
+
* shared/bootloader/misc.c: Copy residual data
_before_ decompressing the kernel since the firmware
may have stored it in an area that is overwritten
diff -u rtems/c/src/lib/libbsp/powerpc/shared/bootloader/mm.c:1.7 rtems/c/src/lib/libbsp/powerpc/shared/bootloader/mm.c:1.8
--- rtems/c/src/lib/libbsp/powerpc/shared/bootloader/mm.c:1.7 Fri Jan 28 14:29:52 2011
+++ rtems/c/src/lib/libbsp/powerpc/shared/bootloader/mm.c Fri Jul 15 20:29:05 2011
@@ -474,6 +474,19 @@
register RESIDUAL *res = bd->residual;
u_long minpages = PAGE_ALIGN(image_size)>>PAGE_SHIFT;
+ if ( residual_fw_is_qemu( res ) ) {
+ /* save command-line - QEMU firmware sets R6/R7 to
+ * commandline start/end (NON-PReP STD)
+ */
+ int len = bd->r7 - bd->r6;
+ if ( len > 0 ) {
+ if ( len > sizeof(bd->cmd_line) - 1 )
+ len = sizeof(bd->cmd_line) - 1;
+ codemove(bd->cmd_line, bd->r6, len, bd->cache_lsize);
+ bd->cmd_line[len] = 0;
+ }
+ }
+
/* Fix residual if we are loaded by Motorola NT firmware */
if ( res && res->VitalProductData.FirmwareSupplier == 0x10000 )
fix_residual( res );
diff -u rtems/c/src/lib/libbsp/powerpc/shared/bootloader/pci.c:1.17 rtems/c/src/lib/libbsp/powerpc/shared/bootloader/pci.c:1.18
--- rtems/c/src/lib/libbsp/powerpc/shared/bootloader/pci.c:1.17 Fri Jan 28 14:29:52 2011
+++ rtems/c/src/lib/libbsp/powerpc/shared/bootloader/pci.c Fri Jul 15 20:29:05 2011
@@ -24,6 +24,7 @@
#include <libcpu/page.h>
#include <bsp/consoleIo.h>
#include <string.h>
+#include <bsp.h>
#include <string.h>
@@ -480,6 +481,14 @@
pci_resource *r;
struct pci_dev *dev;
+ u_long bus0_mem_start = BUS0_MEM_START;
+ u_long bus0_mem_end = BUS0_MEM_END;
+
+ if ( residual_fw_is_qemu( bd->residual ) ) {
+ bus0_mem_start += PREP_ISA_MEM_BASE;
+ bus0_mem_end += PREP_ISA_MEM_BASE;
+ }
+
/* FIXME: for now memory is relocated from low, it's better
* to start from higher addresses.
*/
@@ -489,7 +498,7 @@
*/
init_free_area(&pci->io, BUS0_IO_START, BUS0_IO_END, 0xfff, 0);
- init_free_area(&pci->mem, BUS0_MEM_START, BUS0_MEM_END, 0xfffff, 0);
+ init_free_area(&pci->mem, bus0_mem_start, bus0_mem_end, 0xfffff, 0);
/* First reconfigure the I/O space, this will be more
* complex when there is more than 1 bus. And 64 bits
@@ -520,6 +529,14 @@
pci_bootloader_write_config_dword(r->dev,
PCI_BASE_ADDRESS_0+(r->reg<<2),
r->base);
+
+ if ( residual_fw_is_qemu( bd->residual ) && r->dev->sysdata ) {
+ if ( PCI_BASE_ADDRESS_SPACE_IO == (r->type & PCI_BASE_ADDRESS_SPACE) )
+ ((pci_resource*)r->dev->sysdata)->cmd |= PCI_COMMAND_IO;
+ else
+ ((pci_resource*)r->dev->sysdata)->cmd |= PCI_COMMAND_MEMORY;
+ }
+
if ((r->type&
(PCI_BASE_ADDRESS_SPACE|
PCI_BASE_ADDRESS_MEM_TYPE_MASK)) ==
diff -u /dev/null rtems/c/src/lib/libbsp/powerpc/shared/bootloader/qemu_fakeres.c:1.1
--- /dev/null Fri Jul 15 21:10:49 2011
+++ rtems/c/src/lib/libbsp/powerpc/shared/bootloader/qemu_fakeres.c Fri Jul 15 20:29:05 2011
@@ -0,0 +1,226 @@
+#include <bsp/residual.h>
+#include <stdint.h>
+
+/* Magic knowledge - qemu loads image here.
+ * However, we use the value from NVRAM if possible...
+ */
+#define KERNELBASE 0x01000000
+
+/* When starting qemu make sure to give the correct
+ * amount of memory!
+ *
+ * NOTE: Code now supports reading the actual memory
+ * amount from NVRAM. The residual copy in RAM
+ * is fixed-up accordingly.
+ */
+#define MEM_MEGS 32
+
+/* Mock up a minimal/fake residual; just enough to make the
+ * bootloader happy.
+ */
+struct fake_data {
+ unsigned long dat_len;
+ unsigned long res_off;
+ unsigned long cmd_off;
+ unsigned long cmd_len;
+ unsigned long img_adr;
+ RESIDUAL fake_residual;
+ char cmdline[1024];
+} fake_data = {
+dat_len: sizeof(fake_data),
+res_off: (unsigned long) &fake_data.fake_residual
+ -(unsigned long) &fake_data,
+cmd_off: (unsigned long) &fake_data.cmdline
+ -(unsigned long) &fake_data,
+cmd_len: sizeof(fake_data.cmdline),
+img_adr: KERNELBASE,
+fake_residual:
+{
+ ResidualLength: sizeof(RESIDUAL),
+ Version: 0,
+ Revision: 0,
+ EC: 0,
+ VitalProductData: {
+ FirmwareSupplier: QEMU,
+ ProcessorHz: 300000000, /* fantasy */
+ ProcessorBusHz: 100000000, /* qemu timebase clock */
+ TimeBaseDivisor:1*1000,
+ },
+ MaxNumCpus: 1,
+ ActualNumCpus: 1,
+ Cpus: {
+ {
+ CpuType: 0x00040103, /* FIXME: fill from PVR */
+ CpuNumber: 0,
+ CpuState: 0,
+ },
+ },
+ /* Memory */
+ TotalMemory: 1024*1024*MEM_MEGS,
+ GoodMemory: 1024*1024*MEM_MEGS,
+ ActualNumMemSegs: 13,
+ Segs: {
+ { 0x2000, 0xFFF00, 0x00100 },
+ { 0x0020, MEM_MEGS*0x100, 0x80000 - MEM_MEGS*0x100 },
+ { 0x0008, 0x00800, 0x00168 },
+ { 0x0004, 0x00000, 0x00005 },
+ { 0x0001, 0x006F1, 0x0010F },
+ { 0x0002, 0x006AD, 0x00044 },
+ { 0x0010, 0x00005, 0x006A8 },
+ { 0x0010, 0x00968, MEM_MEGS*0x100 - 0x00968 },
+ { 0x0800, 0xC0000, 0x3F000 },
+ { 0x0600, 0xBF800, 0x00800 },
+ { 0x0500, 0x81000, 0x3E800 },
+ { 0x0480, 0x80800, 0x00800 },
+ { 0x0440, 0x80000, 0x00800 }
+ },
+ ActualNumMemories: 0,
+ Memories: {
+ {0},
+ },
+ /* Devices */
+ ActualNumDevices: 1,
+ Devices: {
+ {
+ DeviceId: {
+ BusId: PROCESSORDEVICE,
+ BaseType: BridgeController,
+ SubType: PCIBridge,
+ Interface: PCIBridgeIndirect,
+ },
+ }
+ },
+ DevicePnPHeap: {0}
+},
+/* This is overwritten by command line passed by qemu. */
+cmdline: {
+ '-','-','n','e','2','k','-','i','r','q','=','9',
+ 0,
+}
+};
+
+/* Read one byte from NVRAM */
+static inline uint8_t
+nvram_rd(void)
+{
+uint8_t rval = *(volatile uint8_t*)0x80000077;
+ asm volatile("eieio");
+ return rval;
+}
+
+/* Set NVRAM address pointer */
+static inline void
+nvram_addr(uint16_t addr)
+{
+ *(volatile uint8_t*)0x80000074 = (addr & 0xff);
+ asm volatile("eieio");
+ *(volatile uint8_t*)0x80000075 = ((addr>>8) & 0xff);
+ asm volatile("eieio");
+}
+
+/* Read a 32-bit (big-endian) work from NVRAM */
+uint32_t
+nvram_rdl_be(uint16_t addr)
+{
+int i;
+uint32_t rval = 0;
+ for ( i=0; i<sizeof(rval); i++ ) {
+ nvram_addr( addr + i );
+ rval = (rval<<8) | nvram_rd();
+ }
+ return rval;
+}
+
+
+/* !!! NOTE !!!
+ *
+ * We use a special hack to propagate command-line info to the bootloader.
+ * This is NOT PreP compliant (but who cares).
+ * We set R6 and R7 to point to the start/end of the command line string
+ * and hacked the bootloader so it uses R6/R7 (provided that the firmware
+ * is detected as 'QEMU').
+ *
+ * (see bootloader/mm.c, bootloader/misc.c, bootloader/bootldr.h, -- boot_data.cmd_line[])
+ */
+uint32_t
+res_copy(void)
+{
+struct fake_data *p;
+uint32_t addr, cmdl, l, imga;
+uint32_t mem_sz, pgs;
+int i;
+int have_nvram;
+
+ /* Make sure we have a valid NVRAM -- just check for 'QEMU' at the
+ * beginning
+ */
+ have_nvram = ( (('Q'<<24) | ('E'<<16) | ('M'<< 8) | ('U'<< 0)) == nvram_rdl_be( 0x0000 ) );
+
+ if ( !have_nvram ) {
+ /* reading NVRAM failed - fall back to using the static residual copy;
+ * this means no support for variable memory size or 'true' command line.
+ */
+ return (uint32_t)&fake_data;
+ }
+
+ /* Dilemma - we don't really know where to put the residual copy
+ * (original is in ROM and cannot be modified).
+ * We can't put it at the top of memory since the bootloader starts
+ * allocating memory from there, before saving the residual, that is.
+ * Too close to the final image might not work either because RTEMS
+ * zeroes its BSS *before* making its copies of the residual and commandline.
+ *
+ * For now we hope that appending to the kernel image works (and that
+ * the bootloader puts it somewhere safe).
+ */
+ imga = nvram_rdl_be( 0x0038 );
+ addr = imga + nvram_rdl_be( 0x003c );
+ addr += 0x1f;
+ addr &= ~(0x1f);
+
+ p = (struct fake_data *)addr;
+
+ /* commandline + length from NVRAM */
+ cmdl = nvram_rdl_be( 0x0040 );
+ l = nvram_rdl_be( 0x0044 );
+
+ if ( l > 0 ) {
+ /* have a command-line; copy it into our local buffer */
+ if ( l > sizeof( p->cmdline ) - 1 ) {
+ l = sizeof( p->cmdline ) - 1;
+ }
+ /* original may overlap our buffer; must safely move around */
+ if ( p->cmdline < (char*)cmdl ) {
+ for ( i=0; i<l; i++ ) {
+ p->cmdline[i] = ((char*)cmdl)[i];
+ }
+ } else {
+ for ( i=l-1; i>=0; i-- ) {
+ p->cmdline[i] = ((char*)cmdl)[i];
+ }
+ }
+ }
+ p->cmdline[l] = 0;
+ /* Copy rest of residual */
+ for ( i=0; i<sizeof(p->fake_residual); i++ )
+ ((char*)&p->fake_residual)[i] = ((char*)&fake_data.fake_residual)[i];
+ p->dat_len = fake_data.dat_len;
+ p->res_off = fake_data.res_off;
+ p->cmd_off = fake_data.cmd_off;
+ p->cmd_len = l+1;
+ p->img_adr = imga;
+
+ /* Fix up memory in residual from NVRAM settings */
+
+ mem_sz = nvram_rdl_be( 0x0030 );
+ pgs = mem_sz >> 12;
+
+ p->fake_residual.TotalMemory = mem_sz;
+ p->fake_residual.GoodMemory = mem_sz;
+
+ p->fake_residual.Segs[1].BasePage = pgs;
+ p->fake_residual.Segs[1].PageCount = 0x80000 - pgs;
+ p->fake_residual.Segs[7].PageCount = pgs - 0x00968;
+
+ return (uint32_t)p;
+}
diff -u /dev/null rtems/c/src/lib/libbsp/powerpc/shared/bootloader/qemu_fakerom.S:1.1
--- /dev/null Fri Jul 15 21:10:49 2011
+++ rtems/c/src/lib/libbsp/powerpc/shared/bootloader/qemu_fakerom.S Fri Jul 15 20:29:05 2011
@@ -0,0 +1,198 @@
+/* A fake 'bios' which does nothing but move a kernel image
+ * to RAM address zero and then starts that...
+ */
+#define LD_CACHE_LINE_SIZE 5
+#define INIT_STACK (0x100 - 16) /* 16-byte/svr4 aligned */
+
+/* These offsets must correspond to declaration in qemu_fakeres.c */
+#define DAT_LEN 0
+#define RES_OFF 4
+#define CMD_OFF 8
+#define CMD_LEN 12
+#define IMG_ADR 16
+
+/* Non-volatile registers */
+#define OBASE 30
+#define PCID 25
+#define PCIA 26
+
+#define PCI_MAX_DEV 32
+
+ .global fake_data
+ .global res_set_memsz
+
+ .global _start
+_start:
+ lis 1, INIT_STACK at h
+ ori 1,1,INIT_STACK at l
+ bl pci_irq_set
+ /* copy residual to RAM and fix up;
+ * this routine returns a pointer to
+ * a 'fake_data' struct. If reading
+ * NVRAM failed then the return value
+ * points to a fall-back version in
+ * ROM...
+ */
+ bl res_copy
+ /* fake_data pointer to R29 */
+ mr 29, 3
+
+ /* Load up R3..R5 with PreP mandated
+ * values (R3: residual, R4: kernel image,
+ * R5: OpenFirmware PTR (or NULL).
+ */
+
+ /* load R3 with residual pointer */
+ lwz 3, RES_OFF(29)
+ add 3, 3, 29
+
+ /* load R4 with image address */
+ lwz 4, IMG_ADR(29)
+
+ /* load R5 with zero (OFW = NULL) */
+ li 5, 0
+ /* EXTENSION: R6 = cmdline start */
+ lwz 6, CMD_OFF(29)
+ add 6, 6, 29
+ /* EXTENSION: R7 = cmdline end */
+ lwz 7, CMD_LEN(29)
+ add 7, 7, 6
+
+ /* jump to image address */
+ mtctr 4
+ bctr
+
+ .org 0x100
+ b _start
+
+ .org 0x110
+template:
+ mfsrr0 30
+ mfsrr1 31
+1: b 1b
+template_end:
+
+ .org 0xc00
+ b monitor
+
+
+ .org 0x4000
+codemove: /* src/dst are cache-aligned */
+ addi 5,5,(1<<LD_CACHE_LINE_SIZE)-1
+ srwi 5,5,LD_CACHE_LINE_SIZE
+ addi 3,3,-4
+ addi 4,4,-4
+1:
+ li 0, (1<<LD_CACHE_LINE_SIZE)
+ mtctr 0
+2:
+ lwzu 0, 4(3)
+ stwu 0, 4(4)
+ bdnz 2b
+ dcbf 0,4
+ icbi 0,4
+ addic. 5,5,-1
+ bne 1b
+ blr
+
+cpexc:
+ lis 3,template at h
+ ori 3,3,template at l
+ li 5,template_end-template
+ b codemove
+
+monitor:
+ stwu 1,-16(1)
+ stw OBASE, 8(1)
+ lis OBASE, 0x80000000 at h
+ cmplwi 10,0x63 /* enter_monitor -> RESET */
+ bne 10f
+hwreset:
+ li 3,1
+ stb 3,0x92(OBASE)
+1: b 1b
+10: cmplwi 10,0x1d /* .NETCTRL -> ignore */
+ bne 10f
+ b ret_from_mon
+10: b hwreset /* unknown -> RESET */
+
+ret_from_mon:
+ lwz OBASE,8(1)
+ lwz 1,0(1)
+ rfi
+
+rcb:
+ stwbrx 3, 0, PCIA
+ lbzx 3, 0, PCID
+ blr
+
+wcb:
+ stwbrx 3, 0, PCIA
+ stbx 4, 0, PCID
+ blr
+
+rcd:
+ stwbrx 3, 0, PCIA
+ lwbrx 3, 0, PCID
+ blr
+
+/* fixup pci interrupt line register according to what
+ * qemu does: line = ((pin-1) + slot_no) & 1 ? 11 : 9;
+ */
+pci_irq_set:
+ /* set up stack frame */
+ stwu 1, -32(1)
+ mflr 0
+ stw 0, 32+4(1)
+ /* load counter with # of PCI devs */
+ li 0, PCI_MAX_DEV
+ mtctr 0
+ /* save non-volatile registers we use
+ * in stack frame
+ */
+ stw 20, 8(1)
+ stw PCIA, 12(1)
+ stw PCID, 16(1)
+ /* load non-volatile registers with
+ * intended values.
+ */
+ lis 20, 0x80000000 at h /* key for slot # 0 */
+ lis PCIA, 0x80000cf8 at h /* PCI config space address reg */
+ ori PCIA, PCIA, 0x80000cf8 at l
+ addi PCID, PCIA, 4 /* PCI config space data reg */
+
+ /* loop over all slots and fix up PCI IRQ LINE */
+1:
+ mr 3, 20
+ bl rcd
+ addi 3, 3, 1
+ cmplwi 3, 0 /* slot empty (= -1 + 1 = 0) ? */
+ beq 2f
+ addi 3, 20, 0x3d
+ bl rcb
+ cmplwi 3, 0
+ beq 2f
+ slwi 4, 3, 11
+ addi 3, 20, 0x3c
+ xor 4, 4, 3 /* bit 11 = slot # + irq_num [zero-based] + 1 */
+ andi. 4, 4, 0x0800
+ li 4, 11
+ beq 3f
+ li 4, 9
+3:
+ bl wcb
+2:
+ addi 20, 20, 0x0800 /* next slot */
+ bdnz 1b
+
+ /* restore and return */
+ lwz 20, 32+4(1)
+ mtlr 20
+ lwz PCID, 16(1)
+ lwz PCIA, 12(1)
+ lwz 20, 8(1)
+ lwz 1, 0(1)
+ blr
+
+ .section .romentry, "ax"
+ b _start
diff -u rtems/c/src/lib/libbsp/powerpc/shared/irq/irq.h:1.16 rtems/c/src/lib/libbsp/powerpc/shared/irq/irq.h:1.17
--- rtems/c/src/lib/libbsp/powerpc/shared/irq/irq.h:1.16 Fri Jan 28 14:29:52 2011
+++ rtems/c/src/lib/libbsp/powerpc/shared/irq/irq.h Fri Jul 15 20:29:05 2011
@@ -78,7 +78,11 @@
* PCI IRQ handlers related definitions
* CAUTION : BSP_PCI_IRQ_LOWEST_OFFSET should be equal to OPENPIC_VEC_SOURCE
*/
+#ifndef qemu
#define BSP_PCI_IRQ_NUMBER (16)
+#else
+#define BSP_PCI_IRQ_NUMBER (0)
+#endif
#define BSP_PCI_IRQ_LOWEST_OFFSET (BSP_ISA_IRQ_NUMBER)
#define BSP_PCI_IRQ_MAX_OFFSET (BSP_PCI_IRQ_LOWEST_OFFSET + BSP_PCI_IRQ_NUMBER - 1)
/*
@@ -90,7 +94,12 @@
#define BSP_PROCESSOR_IRQ_MAX_OFFSET (BSP_PROCESSOR_IRQ_LOWEST_OFFSET + BSP_PROCESSOR_IRQ_NUMBER - 1)
/* Misc vectors for OPENPIC irqs (IPI, timers)
*/
+#ifndef qemu
#define BSP_MISC_IRQ_NUMBER (8)
+#else
+#define BSP_MISC_IRQ_NUMBER (0)
+#endif
+
#define BSP_MISC_IRQ_LOWEST_OFFSET (BSP_PROCESSOR_IRQ_MAX_OFFSET + 1)
#define BSP_MISC_IRQ_MAX_OFFSET (BSP_MISC_IRQ_LOWEST_OFFSET + BSP_MISC_IRQ_NUMBER - 1)
/*
@@ -112,7 +121,9 @@
* Some PCI IRQ symbolic name definition
*/
#define BSP_PCI_IRQ0 (BSP_PCI_IRQ_LOWEST_OFFSET)
+#if BSP_PCI_IRQ_NUMBER > 0
#define BSP_PCI_ISA_BRIDGE_IRQ (BSP_PCI_IRQ0)
+#endif
#if defined(mvme2100)
#define BSP_DEC21143_IRQ (BSP_PCI_IRQ_LOWEST_OFFSET + 1)
diff -u rtems/c/src/lib/libbsp/powerpc/shared/motorola/motorola.c:1.17 rtems/c/src/lib/libbsp/powerpc/shared/motorola/motorola.c:1.18
--- rtems/c/src/lib/libbsp/powerpc/shared/motorola/motorola.c:1.17 Fri Jan 28 14:29:52 2011
+++ rtems/c/src/lib/libbsp/powerpc/shared/motorola/motorola.c Fri Jul 15 20:29:05 2011
@@ -67,6 +67,16 @@
#define NULL_PINMAP {-1,{-1,-1,-1,-1}}
#define NULL_INTMAP {-1,-1,-1,{}}
+#ifdef qemu
+static struct _int_map qemu_prep_intmap[] = {
+ { 0, -1, PCI_FIXUP_OPT_OVERRIDE_NAME,
+ { { 1, { 9, -1, -1, -1}},
+ { 2, {11, -1 -1, -1}},
+ NULL_PINMAP }},
+ NULL_INTMAP
+};
+#endif
+
static struct _int_map mcp750_intmap[] = {
{ 0, 16, 0, {{1, {5, 19,-1,-1}}, /* pmc slot */
@@ -304,7 +314,11 @@
{0x050, 0x00, PPC_UNKNOWN, "Omaha (PowerStack II Pro3000)", NULL, NULL},
{0x060, 0x00, PPC_UNKNOWN, "Utah (Powerstack II Pro4000)", NULL, NULL},
{0x0A0, 0x00, PPC_UNKNOWN, "Powerstack (Series EX)", NULL, NULL},
+#ifdef qemu
+ {0x1E0, 0xE0, PPC_UNKNOWN, "QEMU", qemu_prep_intmap, prep_pci_swizzle},
+#else
{0x1E0, 0xE0, PPC_UNKNOWN, "Mesquite cPCI (MCP750)", mcp750_intmap, prep_pci_swizzle},
+#endif
{0x1E0, 0xE1, PPC_UNKNOWN, "Sitka cPCI (MCPN750)", mcp750_intmap, prep_pci_swizzle},
{0x1E0, 0xE2, PPC_UNKNOWN, "Mesquite cPCI (MCP750) w/ HAC", mcp750_intmap, prep_pci_swizzle},
{0x1E0, 0xF6, PPC_UNKNOWN, "MTX Plus", NULL, NULL},
diff -u rtems/c/src/lib/libbsp/powerpc/shared/residual/residual.h:1.2 rtems/c/src/lib/libbsp/powerpc/shared/residual/residual.h:1.3
--- rtems/c/src/lib/libbsp/powerpc/shared/residual/residual.h:1.2 Thu Apr 15 08:26:19 2004
+++ rtems/c/src/lib/libbsp/powerpc/shared/residual/residual.h Fri Jul 15 20:29:05 2011
@@ -63,6 +63,7 @@
MotoFirmware = 0x01, /* 7/18/95 */
FirmWorks = 0x02, /* 10/5/95 */
Bull = 0x03, /* 04/03/96 */
+ QEMU = ('q'<<24) | ('e'<<16) | ('m'<<8) | ('u'<<0),
} FIRMWARE_SUPPLIERS;
typedef enum _ENDIAN_SWITCH_METHODS {
@@ -321,6 +322,12 @@
#define NULL 0
#endif
+static inline int
+residual_fw_is_qemu(RESIDUAL *r)
+{
+ return QEMU == r->VitalProductData.FirmwareSupplier;
+}
+
extern RESIDUAL residualCopy;
extern void print_residual_device_info(void);
diff -u rtems/c/src/lib/libbsp/powerpc/shared/startup/bspstart.c:1.55 rtems/c/src/lib/libbsp/powerpc/shared/startup/bspstart.c:1.56
--- rtems/c/src/lib/libbsp/powerpc/shared/startup/bspstart.c:1.55 Wed Apr 28 13:51:58 2010
+++ rtems/c/src/lib/libbsp/powerpc/shared/startup/bspstart.c Fri Jul 15 20:29:05 2011
@@ -41,7 +41,6 @@
extern void set_L2CR(unsigned);
extern Triv121PgTbl BSP_pgtbl_setup(unsigned int *);
extern void BSP_pgtbl_activate(Triv121PgTbl);
-extern void BSP_vme_config(void);
SPR_RW(SPRG1)
@@ -180,7 +179,11 @@
/*
* Must have acces to open pic PCI ACK registers provided by the RAVEN
*/
+#ifndef qemu
setdbat(3, 0xf0000000, 0xf0000000, 0x10000000, IO_PAGE);
+#else
+ setdbat(3, 0xb0000000, 0xb0000000, 0x10000000, IO_PAGE);
+#endif
#if defined(mvme2100)
/* Need 0xfec00000 mapped for this */
@@ -253,7 +256,6 @@
#ifdef SHOW_MORE_INIT_SETTINGS
printk("Residuals are located at %x\n", (unsigned) &residualCopy);
printk("Additionnal boot options are %s\n", loaderParam);
- printk("Initial system stack at %x\n",stack);
printk("Software IRQ stack starts at %x with size %u\n", intrStackStart, intrStackSize);
printk("-----------------------------------------\n");
#endif
@@ -329,7 +331,13 @@
pt = BSP_pgtbl_setup(&BSP_mem_size);
if (!pt || TRIV121_MAP_SUCCESS != triv121PgTblMap(
- pt, TRIV121_121_VSID, 0xfeff0000, 1,
+ pt, TRIV121_121_VSID,
+#ifndef qemu
+ 0xfeff0000,
+#else
+ 0xbffff000,
+#endif
+ 1,
TRIV121_ATTR_IO_PAGE, TRIV121_PP_RW_PAGE)) {
printk("WARNING: unable to setup page tables VME "
"bridge must share PCI space\n");
*strauman*:
2011-07-15 Till Straumann <strauman at slac.stanford.edu>
* motorola_powerpc/Makefile.am,
motorola_powerpc/configure.ac, motorola_powerpc/preinstall.am,
motorola_powerpc/include/bsp.h, motorola_powerpc/make/custom/qemuprep.cfg,
motorola_powerpc/qemu_fakerom/Makefile.am,
motorola_powerpc/qemu_fakerom/.cvsignore:
Added 'qemuprep' BSP variant.
M 1.163 c/src/lib/libbsp/powerpc/motorola_powerpc/ChangeLog
M 1.61 c/src/lib/libbsp/powerpc/motorola_powerpc/Makefile.am
M 1.39 c/src/lib/libbsp/powerpc/motorola_powerpc/configure.ac
M 1.27 c/src/lib/libbsp/powerpc/motorola_powerpc/include/bsp.h
A 1.1 c/src/lib/libbsp/powerpc/motorola_powerpc/make/custom/qemuprep.cfg
M 1.13 c/src/lib/libbsp/powerpc/motorola_powerpc/preinstall.am
A 1.1 c/src/lib/libbsp/powerpc/motorola_powerpc/qemu_fakerom/.cvsignore
A 1.1 c/src/lib/libbsp/powerpc/motorola_powerpc/qemu_fakerom/Makefile.am
diff -u rtems/c/src/lib/libbsp/powerpc/motorola_powerpc/ChangeLog:1.162 rtems/c/src/lib/libbsp/powerpc/motorola_powerpc/ChangeLog:1.163
--- rtems/c/src/lib/libbsp/powerpc/motorola_powerpc/ChangeLog:1.162 Sat Jun 18 02:26:24 2011
+++ rtems/c/src/lib/libbsp/powerpc/motorola_powerpc/ChangeLog Fri Jul 15 20:29:45 2011
@@ -1,3 +1,12 @@
+2011-07-15 Till Straumann <strauman at slac.stanford.edu>
+
+ * motorola_powerpc/Makefile.am,
+ motorola_powerpc/configure.ac, motorola_powerpc/preinstall.am,
+ motorola_powerpc/include/bsp.h, motorola_powerpc/make/custom/qemuprep.cfg,
+ motorola_powerpc/qemu_fakerom/Makefile.am,
+ motorola_powerpc/qemu_fakerom/.cvsignore:
+ Added 'qemuprep' BSP variant.
+
2011-06-18 Ralf Corsépius <ralf.corsepius at rtems.org>
* Makefile.am: Remove references to non-existing files.
diff -u rtems/c/src/lib/libbsp/powerpc/motorola_powerpc/Makefile.am:1.60 rtems/c/src/lib/libbsp/powerpc/motorola_powerpc/Makefile.am:1.61
--- rtems/c/src/lib/libbsp/powerpc/motorola_powerpc/Makefile.am:1.60 Sat Jun 18 02:26:24 2011
+++ rtems/c/src/lib/libbsp/powerpc/motorola_powerpc/Makefile.am Fri Jul 15 20:29:45 2011
@@ -4,7 +4,11 @@
ACLOCAL_AMFLAGS = -I ../../../../aclocal
-SUBDIRS = . bootloader
+SUBDIRS = .
+SUBDIRS+= bootloader
+if QEMU
+SUBDIRS+= qemu_fakerom
+endif
include $(top_srcdir)/../../../../automake/compile.am
@@ -49,9 +53,12 @@
../../powerpc/shared/startup/zerobss.c \
../../powerpc/shared/startup/pgtbl_setup.c \
../../powerpc/shared/startup/pgtbl_activate.c \
+ ../../powerpc/shared/startup/ppc_idle.c \
../../powerpc/shared/startup/sbrk.c ../../shared/bootcard.c \
../../shared/bspclean.c ../../shared/bsplibc.c ../../shared/bsppost.c \
../../shared/gnatinstallhandler.c
+
+
# tod
libbsp_a_SOURCES += ../../shared/tod.c ../../powerpc/shared/tod/todcfg.c
# pclock
@@ -127,6 +134,18 @@
../../powerpc/shared/vme/vme_universe.c \
../../powerpc/shared/vme/VMEConfig.h
+if QEMU
+if HAS_NETWORKING
+nodist_include_HEADERS += $(srcdir)/../../i386/pc386/include/wd80x3.h
+ne2000_CPPFLAGS = -D__INSIDE_RTEMS_BSD_TCPIP_STACK__
+ne2000_CPPFLAGS += '-Dbsp_cmdline_arg=rtems_bsp_cmdline_get_param_raw'
+noinst_PROGRAMS += ne2000.rel
+ne2000_rel_SOURCES = ../../i386/pc386/ne2000/ne2000.c
+ne2000_rel_CPPFLAGS = $(AM_CPPFLAGS) $(ne2000_CPPFLAGS)
+ne2000_rel_LDFLAGS = $(RTEMS_RELLDFLAGS)
+endif
+endif
+
libbsp_a_LIBADD = \
polledIO.rel \
../../../libcpu/@RTEMS_CPU@/shared/cache.rel \
@@ -139,6 +158,10 @@
../../../libcpu/@RTEMS_CPU@/mpc6xx/mmu.rel \
../../../libcpu/@RTEMS_CPU@/mpc6xx/timer.rel
+if QEMU
+libbsp_a_LIBADD+=ne2000.rel
+endif
+
EXTRA_DIST = BOOTING README.mtx603e README.MVME2100 README.MVME2300 \
README.MVME2400 \
README.OTHERBOARDS
diff -u rtems/c/src/lib/libbsp/powerpc/motorola_powerpc/configure.ac:1.38 rtems/c/src/lib/libbsp/powerpc/motorola_powerpc/configure.ac:1.39
--- rtems/c/src/lib/libbsp/powerpc/motorola_powerpc/configure.ac:1.38 Tue Jun 7 08:33:18 2011
+++ rtems/c/src/lib/libbsp/powerpc/motorola_powerpc/configure.ac Fri Jul 15 20:29:45 2011
@@ -48,12 +48,21 @@
RTEMS_BSPOPTS_HELP([mpc8240],
[Defined for boards with MPC8240 -- undefined for others])
+RTEMS_BSPOPTS_SET([qemu],[qemuprep],[1])
+RTEMS_BSPOPTS_SET([qemu],[*],[])
+RTEMS_BSPOPTS_HELP([qemu],[Defined for QEMU BSP -- undefined for others])
+
RTEMS_BSP_CLEANUP_OPTIONS(0, 0)
# Explicitly list all Makefiles here
-AC_CONFIG_FILES([Makefile
-bootloader/Makefile])
+AC_CONFIG_FILES([Makefile])
+if test xx"${RTEMS_BSP}" = xxqemuprep ; then
+AC_CONFIG_FILES([qemu_fakerom/Makefile])
+fi
+AC_CONFIG_FILES([bootloader/Makefile])
RTEMS_PPC_EXCEPTIONS
+AM_CONDITIONAL([QEMU],[test xx"${RTEMS_BSP}" = xxqemuprep])
+
AC_OUTPUT
diff -u rtems/c/src/lib/libbsp/powerpc/motorola_powerpc/include/bsp.h:1.26 rtems/c/src/lib/libbsp/powerpc/motorola_powerpc/include/bsp.h:1.27
--- rtems/c/src/lib/libbsp/powerpc/motorola_powerpc/include/bsp.h:1.26 Wed May 18 00:26:52 2011
+++ rtems/c/src/lib/libbsp/powerpc/motorola_powerpc/include/bsp.h Fri Jul 15 20:29:45 2011
@@ -19,6 +19,14 @@
#include <libcpu/io.h>
#include <rtems/clockdrv.h>
#include <bsp/vectors.h>
+
+#ifdef qemu
+#include <rtems/bspcmdline.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
/*
* confdefs.h overrides for this BSP:
@@ -86,11 +94,17 @@
#else
#define _IO_BASE PREP_ISA_IO_BASE
#define _ISA_MEM_BASE PREP_ISA_MEM_BASE
+#ifndef qemu
/* address of our ram on the PCI bus */
#define PCI_DRAM_OFFSET PREP_PCI_DRAM_OFFSET
/* offset of pci memory as seen from the CPU */
#define PCI_MEM_BASE PREP_ISA_MEM_BASE
#define PCI_MEM_WIN0 0
+#else
+#define PCI_DRAM_OFFSET 0
+#define PCI_MEM_BASE 0
+#define PCI_MEM_WIN0 PREP_ISA_MEM_BASE
+#endif
#endif
@@ -112,8 +126,10 @@
#define BSP_UART_IOBASE_COM1 ((_IO_BASE)+0x3f8)
#define BSP_UART_IOBASE_COM2 ((_IO_BASE)+0x2f8)
+#if ! defined(qemu)
#define BSP_KBD_IOBASE ((_IO_BASE)+0x60)
#define BSP_VGA_IOBASE ((_IO_BASE)+0x3c0)
+#endif
#if defined(mvme2300)
#define MVME_HAS_DEC21140
@@ -130,6 +146,17 @@
extern int rtems_dec21140_driver_attach();
#endif
+#ifdef qemu
+#define RTEMS_BSP_NETWORK_DRIVER_NAME "ne1"
+#define RTEMS_BSP_NETWORK_DRIVER_ATTACH rtems_ne_driver_attach
+extern int rtems_ne_driver_attach();
+#endif
+
+#ifdef qemu
+#define BSP_IDLE_TASK_BODY bsp_ppc_idle_task_body
+extern void *bsp_ppc_idle_task_body(uintptr_t arg);
+#endif
+
#include <bsp/openpic.h>
/* BSP_PIC_DO_EOI is optionally used by the 'vmeUniverse' driver
* to implement VME IRQ priorities in software.
@@ -208,4 +235,8 @@
#endif
+#ifdef __cplusplus
+};
+#endif
+
#endif
diff -u /dev/null rtems/c/src/lib/libbsp/powerpc/motorola_powerpc/make/custom/qemuprep.cfg:1.1
--- /dev/null Fri Jul 15 21:10:50 2011
+++ rtems/c/src/lib/libbsp/powerpc/motorola_powerpc/make/custom/qemuprep.cfg Fri Jul 15 20:29:45 2011
@@ -0,0 +1,36 @@
+#
+# Config file for the PowerPC 604 based mvme2307
+#
+# $Id$
+#
+
+include $(RTEMS_ROOT)/make/custom/default.cfg
+
+RTEMS_CPU=powerpc
+RTEMS_CPU_MODEL=mpc604
+
+# This contains the compiler options necessary to select the CPU model
+# and (hopefully) optimize for it.
+#
+CPU_CFLAGS = -mcpu=powerpc -mmultiple -mstring -mstrict-align -D__ppc_generic
+
+# optimize flag: typically -O2
+CFLAGS_OPTIMIZE_V = -O2 -g
+
+ifdef PURE_BINARY
+define bsp-post-link
+ $(default-bsp-post-link)
+ $(OBJCOPY) -O binary -R .comment -S $(basename $@).exe $(basename $@)$(DOWNEXT)
+endef
+else
+define bsp-post-link
+ $(default-bsp-post-link)
+ $(OBJCOPY) -O binary -R .comment -S $(basename $@).exe rtems
+ gzip -vf9 rtems
+ $(LD) -o $(basename $@)$(DOWNEXT) $(PROJECT_RELEASE)/lib/bootloader.o \
+ --just-symbols=$(basename $@).exe \
+ -b binary rtems.gz -T $(PROJECT_RELEASE)/lib/ppcboot.lds \
+ -Map $(basename $@).map && chmod 755 $@
+ rm -f rtems.gz
+endef
+endif
diff -u rtems/c/src/lib/libbsp/powerpc/motorola_powerpc/preinstall.am:1.12 rtems/c/src/lib/libbsp/powerpc/motorola_powerpc/preinstall.am:1.13
--- rtems/c/src/lib/libbsp/powerpc/motorola_powerpc/preinstall.am:1.12 Fri Oct 23 02:32:44 2009
+++ rtems/c/src/lib/libbsp/powerpc/motorola_powerpc/preinstall.am Fri Jul 15 20:29:45 2011
@@ -145,3 +145,10 @@
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/VMEDMA.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/VMEDMA.h
+if QEMU
+if HAS_NETWORKING
+$(PROJECT_INCLUDE)/wd80x3.h: $(srcdir)/../../i386/pc386/include/wd80x3.h $(PROJECT_INCLUDE)/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/wd80x3.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/wd80x3.h
+endif
+endif
diff -u /dev/null rtems/c/src/lib/libbsp/powerpc/motorola_powerpc/qemu_fakerom/.cvsignore:1.1
--- /dev/null Fri Jul 15 21:10:50 2011
+++ rtems/c/src/lib/libbsp/powerpc/motorola_powerpc/qemu_fakerom/.cvsignore Fri Jul 15 20:29:45 2011
@@ -0,0 +1 @@
+Makefile.in
diff -u /dev/null rtems/c/src/lib/libbsp/powerpc/motorola_powerpc/qemu_fakerom/Makefile.am:1.1
--- /dev/null Fri Jul 15 21:10:51 2011
+++ rtems/c/src/lib/libbsp/powerpc/motorola_powerpc/qemu_fakerom/Makefile.am Fri Jul 15 20:29:45 2011
@@ -0,0 +1,31 @@
+##
+## $Id$
+##
+
+## NOTE: This Makefile.am does not apply RTEMS's compilation rules.
+ACLOCAL_AMFLAGS = -I ../../../../aclocal
+
+include $(top_srcdir)/../../../../automake/compile.am
+include $(top_srcdir)/../../bsp.am
+
+AUTOMAKE_OPTIONS = no-exeext
+
+project_lib_DATA = qemu_fakerom.$(OBJEXT)
+project_lib_DATA += qemu_fakerom.elf
+project_lib_DATA += qemu_fakerom.bin
+
+
+## IMPORTANT: head.S must be first, T. Straumann 12/17/2001
+qemu_fakerom.$(OBJEXT): ../../../powerpc/shared/bootloader/qemu_fakerom.S
+ $(CPPASCOMPILE) -c -o $@ $^
+
+qemu_fakeres.$(OBJEXT): ../../../powerpc/shared/bootloader/qemu_fakeres.c
+ $(CC) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o $@ $^
+
+qemu_fakerom.elf: qemu_fakerom.$(OBJEXT) qemu_fakeres.$(OBJEXT)
+ $(LD) -o $@ $^ -nostdlib -Ttext 0xfff00000 --section-start=.romentry=0xfffffffc
+
+qemu_fakerom.bin: qemu_fakerom.$(OBJEXT) qemu_fakeres.$(OBJEXT)
+ $(LD) -o $@ $^ --oformat binary -nostdlib -Ttext 0xfff00000 --section-start=.romentry=0xfffffffc
+
+include $(top_srcdir)/../../../../automake/local.am
--
Generated by Deluxe Loginfo [http://www.codewiz.org/projects/index.html#loginfo] 2.122 by Bernardo Innocenti <bernie at develer.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/vc/attachments/20110715/3ff39e0f/attachment.html>
More information about the vc
mailing list