pdc update und boot disc rewrite
diff --git a/src/parisc/hppa.h b/src/parisc/hppa.h
index e83ebb8..c710a88 100644
--- a/src/parisc/hppa.h
+++ b/src/parisc/hppa.h
@@ -14,7 +14,7 @@
 #include "byteorder.h" // le16_to_cpu
 
 /* Pointer to zero-page of PA-RISC */
-#define PAGE0 ((volatile struct zeropage *) 0UL)
+#define PAGE0 ((struct zeropage *) 0UL)
 
 #define   PSW_I   0x00000001
 
diff --git a/src/parisc/hppa_hardware.h b/src/parisc/hppa_hardware.h
index 3d67fbc..2f1c5cd 100644
--- a/src/parisc/hppa_hardware.h
+++ b/src/parisc/hppa_hardware.h
@@ -28,10 +28,6 @@
 #define CPU_HPA         0xfffb0000
 #define MEMORY_HPA      0xfffff000
 
-#define PCI_HPA         DINO_HPA        /* PCI bus */
-
-#define SCSI_HPA        0xf1040000      /* emulated SCSI, needs to be in f region */
-
 /* offsets to DINO HPA: */
 #define DINO_PCI_ADDR           0x064
 #define DINO_CONFIG_DATA        0x068
@@ -56,6 +52,7 @@
 
 /* ASTRO Memory and I/O regions */
 #define ASTRO_BASE_HPA            0xfffed00000
+#define ELROY0_BASE_HPA           0xfffed30000
 
 #define LMMIO_DIST_BASE_ADDR      0xf4000000UL
 #define LMMIO_DIST_BASE_SIZE       0x4000000UL
diff --git a/src/parisc/parisc.c b/src/parisc/parisc.c
index 1b03a02..c3c4253 100644
--- a/src/parisc/parisc.c
+++ b/src/parisc/parisc.c
@@ -48,7 +48,7 @@
 u8 *StackPos;
 u8 __VISIBLE parisc_stack[32*1024] __aligned(64);
 
-volatile int num_online_cpus;
+int num_online_cpus;
 int __VISIBLE toc_lock = 1;
 union {
 	struct pdc_toc_pim_11 pim11;
@@ -129,9 +129,14 @@
 char qemu_machine[16] = "B160L";
 char cpu_bit_width;
 char has_astro;
+unsigned long pci_hpa;          /* HPA of Dino or Elroy0 */
+#if 0
 unsigned long hppa_port_pci_cmd  = (PCI_HPA + DINO_PCI_ADDR);
 unsigned long hppa_port_pci_data = (PCI_HPA + DINO_CONFIG_DATA);
-
+#else
+unsigned long hppa_port_pci_cmd;
+unsigned long hppa_port_pci_data;
+#endif
 
 /* Want PDC boot menu? Enable via qemu "-boot menu=on" option. */
 unsigned int show_boot_menu;
@@ -340,7 +345,6 @@
     DO(DINO_SCSI_HPA)
     DO(CPU_HPA)
     DO(MEMORY_HPA)
-    DO(SCSI_HPA)
     DO(LASI_HPA)
     DO(LASI_UART_HPA)
     DO(LASI_SCSI_HPA)
@@ -512,6 +516,13 @@
                 "SERIAL_1.9600.8.none" : "SERIAL_2.9600.8.none";
 }
 
+static void print_mod_path(struct pdc_module_path *p)
+{
+    dprintf(1, "PATH %d/%d/%d/%d/%d/%d/%d:%d.%d.%d ", p->path.bc[0], p->path.bc[1],
+            p->path.bc[2],p->path.bc[3],p->path.bc[4],p->path.bc[5],
+            p->path.mod, p->layers[0], p->layers[1], p->layers[2]);
+}
+
 void make_module_path_from_pcidev(struct pci_device *pci,
             struct pdc_module_path *p)
 {
@@ -546,11 +557,11 @@
     p->sversion_model = 0;
     p->sversion_opt = 0;
     p->rev = 0x0099;
-    p->features = 0x0001;
     p->length = 1;
 
     switch (pci->class) {
     case PCI_CLASS_STORAGE_SCSI:
+        p->features = 0x0001;
         p->type = 0x0084;
         break;
     case PCI_CLASS_COMMUNICATION_SERIAL:
@@ -596,9 +607,9 @@
         offs = elroy_offset(pci->bdf);
         BUG_ON(offs == -1UL);
         pfa = (unsigned long) elroy_port(0, offs);
-        pfa += pci->bdf << 8;
-        pfa |= SCSI_HPA;
-        dprintf(1, "PCI device #%d %pP bdf 0x%x at pfa 0x%lx\n", curr_pci_devices, pci, pci->bdf, pfa);
+        // pfa += pci->bdf << 8;
+        // pfa |= SCSI_HPA;
+        pfa = pci_hpa;       /* Elroy0 or Dino */
 
         pdev->hpa       = pfa;
         pdev->iodc      = &hppa_pci_iodc[curr_pci_devices];
@@ -610,6 +621,9 @@
         make_iodc_from_pcidev(pci, pdev->iodc);
         make_modinfo_from_pcidev(pci, pdev->mod_info, pfa);
         make_module_path_from_pcidev(pci, pdev->mod_path);
+        dprintf(1, "PCI device #%d %pP bdf 0x%x at pfa 0x%lx  ", curr_pci_devices, pci, pci->bdf, pfa);
+        print_mod_path(pdev->mod_path);
+        dprintf(1, "\n");
 
         curr_pci_devices++;
         BUG_ON(curr_pci_devices >= MAX_PCI_DEVICES);
@@ -637,13 +651,6 @@
     return NULL;
 }
 
-static void print_mod_path(struct pdc_module_path *p)
-{
-    dprintf(1, "PATH %d/%d/%d/%d/%d/%d/%d:%d.%d.%d ", p->path.bc[0], p->path.bc[1],
-            p->path.bc[2],p->path.bc[3],p->path.bc[4],p->path.bc[5],
-            p->path.mod, p->layers[0], p->layers[1], p->layers[2]);
-}
-
 static unsigned long keep_list[20] = { PARISC_KEEP_LIST };
 
 static void remove_from_keep_list(unsigned long hpa)
@@ -775,35 +782,37 @@
     int i;
 
     if (path->path.mod != search->path.mod)
-        return -1;
+        return 0;
 
     for(i = 0; i < ARRAY_SIZE(path->path.bc); i++) {
         if (path->path.bc[i] != search->path.bc[i])
-            return -1;
+            return 0;
     }
 
     if (check_layers) {
         for(i = 0; i < ARRAY_SIZE(path->layers); i++) {
             if (path->layers[i] != search->layers[i])
-                return -1;
+                return 0;
         }
     }
-    return 0;
+    return 1;
 }
 
-static hppa_device_t *find_hppa_device_by_path(struct pdc_module_path *search,
-                                        unsigned long *index, int check_layers)
+static hppa_device_t *find_hppa_device_by_path(unsigned long hpa,
+                            struct pdc_module_path *search,
+                            unsigned long *index, int check_layers)
 {
     hppa_device_t *dev;
     int i, nr = 0;
 
     for (i = 0; i < (MAX_DEVICES-1); i++) {
         dev = parisc_devices + i;
-        if (!dev->hpa)
+        if (dev->hpa != hpa)
             continue;
 
-        if (!compare_module_path(dev->mod_path, search, check_layers)) {
-            *index = nr;
+        if (compare_module_path(dev->mod_path, search, check_layers)) {
+            if (index)
+                *index = nr;
             return dev;
         }
         nr++;
@@ -812,8 +821,9 @@
     /* search PCI devices */
     for (i = 0; i < curr_pci_devices; i++) {
         dev = hppa_pci_devices + i;
-        if (!compare_module_path(dev->mod_path, search, check_layers)) {
-            *index = nr;
+        if (compare_module_path(dev->mod_path, search, check_layers)) {
+            if (index)
+                *index = nr;
             return dev;
         }
         nr++;
@@ -883,13 +893,24 @@
         dprintf(0, "%c", c);
         return;
     }
-    hppa_device_t *dev = find_hpa_device(addr);
+    if (0) {
+        dprintf(1,"parisc_serial_out  search hpa %x   ", PAGE0->mem_cons.hpa);
+        print_mod_path(&PAGE0->mem_cons.dp);
+        dprintf(1,"  \n");
+    }
+    hppa_device_t *dev;
+    dev = find_hppa_device_by_path(addr, &PAGE0->mem_cons.dp, NULL, 0);
+    if (0) {
+        dprintf(1,"parisc_serial_out  hpa %x\n", PAGE0->mem_cons.hpa);
+        print_mod_path(dev->mod_path);
+    }
+    if (!dev) hlt();
     BUG_ON(!dev);
     if (dev->pci_addr)
         addr = dev->pci_addr;
     else
         addr += 0x800;  /* add offset for serial port on GSC */
-//  dprintf(1,"parisc_serial_out  addr %x\n", addr);
+//  dprintf(1,"  addr %x\n", addr);
 
     if (c == '\n')
         parisc_serial_out('\r');
@@ -955,12 +976,16 @@
     unsigned long hpa = ARG0;
     unsigned long option = ARG1;
     unsigned long *result = (unsigned long *)ARG4;
-    hppa_device_t *dev;
+    hppa_device_t *dev = NULL;
     int ret, len;
     char *c;
     struct disk_op_s disk_op;
 
-    dev = find_hpa_device(hpa);
+    if (option == ENTRY_IO_COUT || option == ENTRY_IO_CIN)
+        dev = find_hppa_device_by_path(hpa, &PAGE0->mem_cons.dp, NULL, 0);
+    else if (option == ENTRY_IO_BOOTIN || option == ENTRY_IO_BBLOCK_IN)
+        dev = find_hppa_device_by_path(hpa, &PAGE0->mem_cons.dp, NULL, 0);
+        
     if (!dev) {
         // BUG_ON(1);
         return PDC_INVALID_ARG;
@@ -1096,13 +1121,14 @@
 int __VISIBLE parisc_iodc_ENTRY_SPA(unsigned int *arg FUNC_MANY_ARGS)
 {
     iodc_log_call(arg, __FUNCTION__);
+    BUG_ON(1);
     return PDC_BAD_OPTION;
 }
 
 int __VISIBLE parisc_iodc_ENTRY_CONFIG(unsigned int *arg FUNC_MANY_ARGS)
 {
     iodc_log_call(arg, __FUNCTION__);
-    // BUG_ON(1);
+    BUG_ON(1);
     return PDC_BAD_OPTION;
 }
 
@@ -1808,7 +1834,7 @@
 
         case PDC_TRANSLATE_PATH:
             mod_path = (struct pdc_module_path *)ARG3;
-            hppa_device_t *dev = find_hppa_device_by_path(mod_path, &hpa_index, 1);
+            hppa_device_t *dev = find_hppa_device_by_path(0, mod_path, &hpa_index, 1); // XXX
             if (0) {
                 dprintf(1, "PDC_TRANSLATE_PATH dev=%p hpa=%lx ", dev, dev ? dev->hpa:0UL);
                 print_mod_path(mod_path);
@@ -1852,15 +1878,15 @@
 {
     unsigned long option = ARG1;
     struct pdc_memory_map *memmap = (struct pdc_memory_map *) ARG2;
-    struct device_path *dp = (struct device_path *) ARG3;
+    struct pdc_module_path *dp = (struct pdc_module_path *) ARG3;
     hppa_device_t *dev;
     unsigned long index;
 
     switch (option) {
         case PDC_MEM_MAP_HPA:
 // NEEDS FIXING !!
-            dprintf(0, "\nSeaBIOS: PDC_MEM_MAP_HPA  bus = %d,  mod = %d\n", dp->bc[4], dp->mod);
-            dev = find_hppa_device_by_path((struct pdc_module_path *) dp, &index, 0);
+            dprintf(0, "\nSeaBIOS: PDC_MEM_MAP_HPA  bus = %d,  mod = %d\n", dp->path.bc[4], dp->path.mod);
+            dev = find_hppa_device_by_path(memmap->hpa, (struct pdc_module_path *) dp, &index, 0); // ??
             if (!dev)
                 return PDC_NE_MOD;
             memcpy(memmap, dev->mod_info, sizeof(*memmap));
@@ -1979,11 +2005,11 @@
             memcpy((void *)ARG4, irt_table, irt_table_entries * 16);
             return PDC_OK;
         case PDC_PCI_PCI_PATH_TO_PCI_HPA:
-            // BUG_ON(1);
-            result[0] = has_astro ? 0xfed00000 : PCI_HPA;
-            return has_astro ? PDC_OK : PDC_BAD_OPTION;
+            BUG_ON(1);
+            result[0] = pci_hpa;
+            return PDC_OK;
         case PDC_PCI_PCI_HPA_TO_PCI_PATH:
-            // BUG_ON(1);
+            BUG_ON(1);
             break;
     }
     return PDC_BAD_OPTION;
@@ -2521,7 +2547,7 @@
 };
 
 static struct pz_device mem_boot_boot = {
-    .dp.flags = PF_AUTOBOOT,
+    .dp.path.flags = PF_AUTOBOOT,
     .hpa = DINO_SCSI_HPA,  // will be overwritten
     .iodc_io = (unsigned long) &iodc_entry,
     .cl_class = CL_RANDOM,
@@ -2566,8 +2592,14 @@
     while (pdev->pci != pci)
         pdev++;
     pdev->pci_addr = pmem;
-    mem_cons_boot.hpa = pdev->hpa;
-    mem_kbd_boot.hpa = pdev->hpa;
+    mem_cons_boot.hpa = pdev->hpa; // HELGE
+    mem_cons_boot.dp  = *pdev->mod_path;
+  dprintf(1,"SET hpa %lx   ", pdev->hpa);
+    print_mod_path(&mem_cons_boot.dp);
+  dprintf(1,"  \n");
+
+    mem_kbd_boot.hpa  = pdev->hpa;
+    mem_kbd_boot.dp   = *pdev->mod_path;
 }
 
 /* find SCSI PCI card (to be used as boot device) */
@@ -2592,40 +2624,30 @@
         pdev++;
     pdev->pci_addr = pmem;
     mem_boot_boot.hpa = pdev->hpa;
+    mem_boot_boot.dp  = *pdev->mod_path;
     dprintf(1, "PCI: Enabling BOOT DEVICE HPA %x\n", mem_boot_boot.hpa);
 }
 
 
 /* Prepare boot paths in PAGE0 and stable memory */
-static void prepare_boot_path(volatile struct pz_device *dest,
+static void prepare_boot_path(struct pz_device *dest,
         const struct pz_device *source,
         unsigned int stable_offset)
 {
-    hppa_device_t *dev;
-    unsigned long hpa;
-    struct pdc_module_path *mod_path;
+    const struct pdc_module_path *mod_path;
 
-    hpa = source->hpa;
-    dev = find_hpa_device(hpa);
-    BUG_ON(!dev);
-
-    if (DEV_is_storage_device(dev))
-        mod_path = &mod_path_emulated_drives;
-    else if (dev)
-        mod_path = dev->mod_path;
-    else {
-        BUG_ON(1);
-    }
+    // if (DEV_is_storage_device(dev)) mod_path = &mod_path_emulated_drives; else if (dev)
+    mod_path = &source->dp;
 
     /* copy device path to entry in PAGE0 */
     memcpy((void*)dest, source, sizeof(*source));
-    memcpy((void*)&dest->dp, mod_path, sizeof(struct device_path));
+    // memcpy((void*)&dest->dp, mod_path, sizeof(struct pdc_module_path));
 
     /* copy device path to stable storage */
     memcpy(&stable_storage[stable_offset], mod_path, sizeof(*mod_path));
 
     BUG_ON(sizeof(*mod_path) != 0x20);
-    BUG_ON(sizeof(struct device_path) != 0x20);
+    BUG_ON(sizeof(struct pdc_module_path) != 0x20);
 }
 
 static int artist_present(void)
@@ -2699,13 +2721,19 @@
 
     /* which machine shall we emulate? */
     str = romfile_loadfile("/etc/hppa/machine", NULL);
-    if (!str)
-	str = "B160L";
+    if (!str) {
+        str = "B160L";
+        current_machine = &machine_B160L;
+        pci_hpa = DINO_HPA;
+        hppa_port_pci_cmd  = pci_hpa + DINO_PCI_ADDR;
+        hppa_port_pci_data = pci_hpa + DINO_CONFIG_DATA;
+    }
     if (strcmp(str, "C3700") == 0) {
-        current_machine = &machine_C3700;
         has_astro = 1;
-        hppa_port_pci_cmd  = 0xfed30000 + 0x040;
-        hppa_port_pci_data = 0xfed30000 + 0x048;
+        current_machine = &machine_C3700;
+        pci_hpa = (unsigned long) ELROY0_BASE_HPA;
+        hppa_port_pci_cmd  = pci_hpa + 0x040;
+        hppa_port_pci_data = pci_hpa + 0x048;
         /* no serial port for now, will find later */
         mem_cons_boot.hpa = 0;
         mem_kbd_boot.hpa = 0;
@@ -2850,6 +2878,7 @@
 	else
             pdc_console = CONSOLE_SERIAL;
     }
+dprintf(1, "WECHSEL 111\n");
     if (pdc_console == CONSOLE_GRAPHICS) {
         prepare_boot_path(&(PAGE0->mem_cons), &mem_cons_sti_boot, 0x60);
         prepare_boot_path(&(PAGE0->mem_kbd),  &mem_kbd_sti_boot, 0xa0);
@@ -2857,6 +2886,7 @@
         prepare_boot_path(&(PAGE0->mem_cons), &mem_cons_boot, 0x60);
         prepare_boot_path(&(PAGE0->mem_kbd),  &mem_kbd_boot, 0xa0);
     }
+dprintf(1, "WECHSEL 222\n");
 
     PAGE0->vec_rendz = 0; /* No rendezvous yet. Add MEM_RENDEZ_HI later */
 
@@ -2909,6 +2939,35 @@
 
     prepare_boot_path(&(PAGE0->mem_boot), &mem_boot_boot, 0x0);
 
+#if 0
+HELGE     HPA  f4008000
+48 86 a9 54    2f 94 fe 03    c0 a8 14 33    c0 a8 14 42     f4 00 80 00   00 00 00 00    00 01 90 00   00 00   10 02 
+struct pz_device {
+        // struct  pdc_module_path path; /* see above */
+        unsigned char flags;    /* flags see above! */          00
+        unsigned char bc[6];    /* bus converter routing info */ ff ff ff 0a 00 0c
+        unsigned char mod;                                              00
+        unsigned int  layers[6];/* device-specific layer-info */        00 01 00 00    d0 29 10 bf 
+
+        /* struct       iomod *hpa; */
+        unsigned int hpa;       /* HPA base address */    
+        /* char *spa; */
+        unsigned int spa;       /* SPA base address */   
+        /* int  (*iodc_io)(struct iomod*, ...); */
+        unsigned int iodc_io;   /* device entry point */ 
+        short   pad;            /* reserved */
+        unsigned short cl_class;/* see below */
+} __attribute__((aligned(8))) ;
+
+#define CL_NULL         0       /* invalid */
+#define CL_RANDOM       1       /* random access (as disk) */
+#define CL_SEQU         2       /* sequential access (as tape) */
+#define CL_DUPLEX       7       /* full-duplex point-to-point (RS-232, Net) */
+#define CL_KEYBD        8       /* half-duplex console (HIL Keyboard) */
+#define CL_DISPL        9       /* half-duplex console (display) */
+#define CL_FC           10      /* FiberChannel access media */
+#endif
+
     // copy primary boot path to alt boot path
     memcpy(&stable_storage[0x80], &stable_storage[0], 0x20);
     if (parisc_boot_cdrom) {
diff --git a/src/parisc/pdc.h b/src/parisc/pdc.h
index 9c0b8f7..b152534 100644
--- a/src/parisc/pdc.h
+++ b/src/parisc/pdc.h
@@ -366,20 +366,25 @@
 
 #if !defined(__ASSEMBLY__)
 
-/* flags of the device_path */
+/* flags for hardware_path */
 #define	PF_AUTOBOOT	0x80
 #define	PF_AUTOSEARCH	0x40
 #define	PF_TIMER	0x0F
 
-struct device_path {		/* page 1-69 */
-	unsigned char flags;	/* flags see above! */
-	unsigned char bc[6];	/* bus converter routing info */
-	unsigned char mod;
-	unsigned int  layers[6];/* device-specific layer-info */
-} __attribute__((aligned(8))) ;
+struct hardware_path {
+	unsigned char flags;	/* see bit definitions below */
+	signed   char bc[6];	/* Bus Converter routing info to a specific */
+				/* I/O adaptor (< 0 means none, > 63 resvd) */
+	signed   char mod;	/* fixed field of specified module */
+};
+
+struct pdc_module_path {	/* page 1-69 */
+	struct hardware_path path;
+	unsigned int layers[6]; /* device-specific info (ctlr #, unit # ...) */
+} __attribute__((aligned(8)));
 
 struct pz_device {
-	struct	device_path dp;	/* see above */
+	struct pdc_module_path dp;	/* see above */
 	/* struct	iomod *hpa; */
 	unsigned int hpa;	/* HPA base address */
 	/* char	*spa; */
@@ -620,21 +625,6 @@
 	int mode;
 };
 
-struct hardware_path {
-	char  flags;	/* see bit definitions below */
-	char  bc[6];	/* Bus Converter routing info to a specific */
-			/* I/O adaptor (< 0 means none, > 63 resvd) */
-	char  mod;	/* fixed field of specified module */
-};
-
-/*
- * Device path specifications used by PDC.
- */
-struct pdc_module_path {
-	struct hardware_path path;
-	unsigned int layers[6]; /* device-specific info (ctlr #, unit # ...) */
-};
-
 /* Only used on some pre-PA2.0 boxes */
 struct pdc_memory_map {		/* PDC_MEMORY_MAP */
 	unsigned long hpa;	/* mod's register set address */
diff --git a/src/parisc/timer.c b/src/parisc/timer.c
index ea8214f..9605f91 100644
--- a/src/parisc/timer.c
+++ b/src/parisc/timer.c
@@ -9,8 +9,6 @@
 #include "util.h" // timer_setup
 #include "parisc/pdc.h"
 
-#define PAGE0 ((volatile struct zeropage *) 0UL)
-
 // Setup internal timers.
 void
 timer_setup(void)