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