]> git.proxmox.com Git - mirror_qemu.git/commitdiff
Merge tag 'hppa-fixes-8.2-pull-request' of https://github.com/hdeller/qemu-hppa into...
authorPeter Maydell <peter.maydell@linaro.org>
Tue, 16 Jan 2024 14:24:42 +0000 (14:24 +0000)
committerPeter Maydell <peter.maydell@linaro.org>
Tue, 16 Jan 2024 14:24:42 +0000 (14:24 +0000)
target/hppa qemu v8.2 regression fixes

There were some regressions introduced with Qemu v8.2 on the hppa/hppa64
target, e.g.:

- 32-bit HP-UX crashes on B160L (32-bit) machine
- NetBSD boot failure due to power button in page zero
- NetBSD FPU detection failure
- OpenBSD 7.4 boot failure

This patch series fixes those known regressions and additionally:

- allows usage of the max. 3840MB of memory (instead of 3GB),
- adds support for the qemu --nodefaults option (to debug other devices)

This patch set will not fix those known (non-regression) bugs:
- HP-UX and NetBSD still fail to boot on the new 64-bit C3700 machine
- Linux kernel will still fail to boot on C3700 as long as kernel modules are used.

Changes v2->v3:
- Added comment about Figures H-10 and H-11 in the parisc2.0 spec
  in patch which calculate PDC address translation if PSW.W=0
- Introduce and use hppa_set_ior_and_isr()
- Use drive_get_max_bus(IF_SCSI), nd_table[] and serial_hd() to check
  if default devices should be created
- Added Tested-by and Reviewed-by tags

Changes v1->v2:
- fix OpenBSD boot with SeaBIOS v15 instead of v14
- commit message enhancements suggested by BALATON Zoltan
- use uint64_t for ram_max in patch #1

# -----BEGIN PGP SIGNATURE-----
#
# iHUEABYKAB0WIQS86RI+GtKfB8BJu973ErUQojoPXwUCZaImPQAKCRD3ErUQojoP
# X2C5AP9fbIkCni45JU6KC6OmFsCbAReRQCPwLO+MzR8/us2ywgD+PsGxSBk8ASxM
# nqtv3J9JC3i+XSnbtwLV+qChnO+IXwc=
# =FAMY
# -----END PGP SIGNATURE-----
# gpg: Signature made Sat 13 Jan 2024 05:57:17 GMT
# gpg:                using EDDSA key BCE9123E1AD29F07C049BBDEF712B510A23A0F5F
# gpg: Good signature from "Helge Deller <deller@gmx.de>" [unknown]
# gpg:                 aka "Helge Deller <deller@kernel.org>" [unknown]
# gpg: WARNING: This key is not certified with a trusted signature!
# gpg:          There is no indication that the signature belongs to the owner.
# Primary key fingerprint: 4544 8228 2CD9 10DB EF3D  25F8 3E5F 3D04 A7A2 4603
#      Subkey fingerprint: BCE9 123E 1AD2 9F07 C049  BBDE F712 B510 A23A 0F5F

* tag 'hppa-fixes-8.2-pull-request' of https://github.com/hdeller/qemu-hppa:
  target/hppa: Update SeaBIOS-hppa to version 15
  target/hppa: Fix IOR and ISR on error in probe
  target/hppa: Fix IOR and ISR on unaligned access trap
  target/hppa: Export function hppa_set_ior_and_isr()
  target/hppa: Avoid accessing %gr0 when raising exception
  hw/hppa: Move software power button address back into PDC
  target/hppa: Fix PDC address translation on PA2.0 with PSW.W=0
  hw/pci-host/astro: Add missing astro & elroy registers for NetBSD
  hw/hppa/machine: Disable default devices with --nodefaults option
  hw/hppa/machine: Allow up to 3840 MB total memory

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
1  2 
hw/pci-host/astro.c
target/hppa/cpu.c
target/hppa/cpu.h

diff --combined hw/pci-host/astro.c
index f4de70475c4f8b7e4cbe9ef47ec2bf77637b136a,cb2c8a828def3184b91f43c25d60abd2bf350713..37d271118ca224f27aeb006f9b326be08ecbe730
@@@ -166,6 -166,8 +166,8 @@@ static MemTxResult elroy_chip_write_wit
      trace_elroy_write(addr, size, val);
  
      switch ((addr >> 3) << 3) {
+     case 0x000: /* PCI_ID & PCI_COMMAND_STATUS_REG */
+         break;
      case 0x080:
          put_val_in_int64(&s->arb_mask, addr, size, val);
          break;
      case 0x200 ... 0x250 - 1:   /* LMMIO, GMMIO, WLMMIO, WGMMIO, ... */
          put_val_in_arrary(s->mmio_base, 0x200, addr, size, val);
          break;
+     case 0x300: /* ibase */
+     case 0x308: /* imask */
+         break;
      case 0x0680:
          put_val_in_int64(&s->error_config, addr, size, val);
          break;
@@@ -459,7 -464,7 +464,7 @@@ static const VMStateDescription vmstate
      .name = "Elroy",
      .version_id = 1,
      .minimum_version_id = 1,
 -    .fields = (VMStateField[]) {
 +    .fields = (const VMStateField[]) {
          VMSTATE_UINT64(hpa, ElroyState),
          VMSTATE_UINT32(pci_bus_num, ElroyState),
          VMSTATE_UINT64(config_address, ElroyState),
@@@ -538,6 -543,9 +543,9 @@@ static MemTxResult astro_chip_read_with
      case 0x0030:        /* HP-UX 10.20 and 11.11 reads it. No idea. */
          val = -1;
          break;
+     case 0x0078:        /* NetBSD reads 0x78 ? */
+         val = -1;
+         break;
      case 0x0300 ... 0x03d8:     /* LMMIO_DIRECT0_BASE... */
          index = (addr - 0x300) / 8;
          val = s->ioc_ranges[index];
@@@ -624,31 -632,43 +632,43 @@@ static MemTxResult astro_chip_write_wit
      case 0x10220:
      case 0x10230:        /* HP-UX 11.11 reads it. No idea. */
          break;
-     case 0x22108:        /* IOC STATUS_CONTROL */
-         put_val_in_int64(&s->ioc_status_ctrl, addr, size, val);
-         break;
      case 0x20200 ... 0x20240 - 1: /* IOC Rope0_Control ... */
          put_val_in_arrary(s->ioc_rope_control, 0x20200, addr, size, val);
          break;
      case 0x20040:        /* IOC Rope config */
+     case 0x22040:
          put_val_in_int64(&s->ioc_rope_config, addr, size, val);
          break;
      case 0x20300:
+     case 0x22300:
          put_val_in_int64(&s->tlb_ibase, addr, size, val);
          break;
      case 0x20308:
+     case 0x22308:
          put_val_in_int64(&s->tlb_imask, addr, size, val);
          break;
      case 0x20310:
+     case 0x22310:
          put_val_in_int64(&s->tlb_pcom, addr, size, val);
          /* TODO: flush iommu */
          break;
      case 0x20318:
+     case 0x22318:
          put_val_in_int64(&s->tlb_tcnfg, addr, size, val);
          break;
      case 0x20320:
+     case 0x22320:
          put_val_in_int64(&s->tlb_pdir_base, addr, size, val);
          break;
+     case 0x22000:       /* func_id */
+         break;
+     case 0x22008:       /* func_class */
+         break;
+     case 0x22050:       /* rope_debug */
+         break;
+     case 0x22108:        /* IOC STATUS_CONTROL */
+         put_val_in_int64(&s->ioc_status_ctrl, addr, size, val);
+         break;
      /*
       * empty placeholders for non-existent elroys, e.g.
       * func_class, pci config & data
@@@ -691,7 -711,7 +711,7 @@@ static const VMStateDescription vmstate
      .name = "Astro",
      .version_id = 1,
      .minimum_version_id = 1,
 -    .fields = (VMStateField[]) {
 +    .fields = (const VMStateField[]) {
          VMSTATE_UINT64(ioc_ctrl, AstroState),
          VMSTATE_UINT64(ioc_status_ctrl, AstroState),
          VMSTATE_UINT64_ARRAY(ioc_ranges, AstroState, (0x03d8 - 0x300) / 8),
diff --combined target/hppa/cpu.c
index e1f252cc45386c9d22c38c58f5f6646078008b11,fda32d7f590d1e9814df6c8aa1acb5de573f3ed6..14e17fa9aab36f81891fb774f6d823cce8024fbd
@@@ -110,11 -110,7 +110,7 @@@ void hppa_cpu_do_unaligned_access(CPUSt
      CPUHPPAState *env = &cpu->env;
  
      cs->exception_index = EXCP_UNALIGN;
-     if (env->psw & PSW_Q) {
-         /* ??? Needs tweaking for hppa64.  */
-         env->cr[CR_IOR] = addr;
-         env->cr[CR_ISR] = addr >> 32;
-     }
+     hppa_set_ior_and_isr(env, addr, MMU_IDX_MMU_DISABLED(mmu_idx));
  
      cpu_loop_exit_restore(cs, retaddr);
  }
@@@ -160,8 -156,38 +156,8 @@@ static void hppa_cpu_initfn(Object *obj
  static ObjectClass *hppa_cpu_class_by_name(const char *cpu_model)
  {
      g_autofree char *typename = g_strconcat(cpu_model, "-cpu", NULL);
 -    ObjectClass *oc = object_class_by_name(typename);
  
 -    if (oc &&
 -        !object_class_is_abstract(oc) &&
 -        object_class_dynamic_cast(oc, TYPE_HPPA_CPU)) {
 -        return oc;
 -    }
 -    return NULL;
 -}
 -
 -static void hppa_cpu_list_entry(gpointer data, gpointer user_data)
 -{
 -    ObjectClass *oc = data;
 -    CPUClass *cc = CPU_CLASS(oc);
 -    const char *tname = object_class_get_name(oc);
 -    g_autofree char *name = g_strndup(tname, strchr(tname, '-') - tname);
 -
 -    if (cc->deprecation_note) {
 -        qemu_printf("  %s (deprecated)\n", name);
 -    } else {
 -        qemu_printf("  %s\n", name);
 -    }
 -}
 -
 -void hppa_cpu_list(void)
 -{
 -    GSList *list;
 -
 -    list = object_class_get_list_sorted(TYPE_HPPA_CPU, false);
 -    qemu_printf("Available CPUs:\n");
 -    g_slist_foreach(list, hppa_cpu_list_entry, NULL);
 -    g_slist_free(list);
 +    return object_class_by_name(typename);
  }
  
  #ifndef CONFIG_USER_ONLY
diff --combined target/hppa/cpu.h
index fd659ca88b9a465e27aace57454d15ef209a1ab2,9556e95fab474ec07994883927d3405dfbcc40da..6a153405d27b968ef3359d8321c598a37538d6fb
@@@ -385,6 -385,7 +385,7 @@@ void hppa_cpu_dump_state(CPUState *cs, 
  #ifndef CONFIG_USER_ONLY
  void hppa_ptlbe(CPUHPPAState *env);
  hwaddr hppa_cpu_get_phys_page_debug(CPUState *cs, vaddr addr);
+ void hppa_set_ior_and_isr(CPUHPPAState *env, vaddr addr, bool mmu_disabled);
  bool hppa_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
                         MMUAccessType access_type, int mmu_idx,
                         bool probe, uintptr_t retaddr);
@@@ -402,4 -403,7 +403,4 @@@ G_NORETURN void hppa_dynamic_excp(CPUHP
  
  #define CPU_RESOLVING_TYPE TYPE_HPPA_CPU
  
 -#define cpu_list hppa_cpu_list
 -void hppa_cpu_list(void);
 -
  #endif /* HPPA_CPU_H */