mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 15:53:54 -06:00
target/hppa: Enhancements and fixes
Some enhancements and fixes for the hppa target. The major change is, that this patchset adds a new SeaBIOS-hppa firmware which is built as 32- and 64-bit firmware. The new 64-bit firmware is necessary to fully support 64-bit operating systems (HP-UX, Linux, NetBSD,...). -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQS86RI+GtKfB8BJu973ErUQojoPXwUCZcquAQAKCRD3ErUQojoP X9pjAQCVsWyuYlGCW2paIGVWKV0vsOpwetUrbhRtFUZGqZxb4AD9FbMsXRcCN/oq CotBPY/a8MEzIQcwYl5QbcI5nNW4ygs= =RA0B -----END PGP SIGNATURE----- Merge tag 'hppa64-pull-request' of https://github.com/hdeller/qemu-hppa into staging target/hppa: Enhancements and fixes Some enhancements and fixes for the hppa target. The major change is, that this patchset adds a new SeaBIOS-hppa firmware which is built as 32- and 64-bit firmware. The new 64-bit firmware is necessary to fully support 64-bit operating systems (HP-UX, Linux, NetBSD,...). # -----BEGIN PGP SIGNATURE----- # # iHUEABYKAB0WIQS86RI+GtKfB8BJu973ErUQojoPXwUCZcquAQAKCRD3ErUQojoP # X9pjAQCVsWyuYlGCW2paIGVWKV0vsOpwetUrbhRtFUZGqZxb4AD9FbMsXRcCN/oq # CotBPY/a8MEzIQcwYl5QbcI5nNW4ygs= # =RA0B # -----END PGP SIGNATURE----- # gpg: Signature made Mon 12 Feb 2024 23:47:13 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 'hppa64-pull-request' of https://github.com/hdeller/qemu-hppa: hw/hppa/machine: Load 64-bit firmware on 64-bit machines target/hppa: Update SeaBIOS-hppa to version 16 hw/net/tulip: add chip status register values target/hppa: PDC_BTLB_INFO uses 32-bit ints target/hppa: Allow read-access to PSW with rsm 0,reg instruction lasi: Add reset I/O ports for LASI audio and FDC target/hppa: Implement do_transaction_failed handler for I/O errors lasi: allow access to LAN MAC address registers hw/pci-host/astro: Implement Hard Fail and Soft Fail mode hw/pci-host/astro: Avoid aborting on access failure target/hppa: Add "diag 0x101" for console output support disas/hppa: Add disassembly for qemu specific instructions Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
bc2e8b18fb
16 changed files with 150 additions and 43 deletions
|
@ -13,6 +13,7 @@
|
|||
#include "qemu/error-report.h"
|
||||
#include "sysemu/reset.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
#include "sysemu/qtest.h"
|
||||
#include "sysemu/runstate.h"
|
||||
#include "hw/rtc/mc146818rtc.h"
|
||||
#include "hw/timer/i8254.h"
|
||||
|
@ -333,6 +334,7 @@ static void machine_HP_common_init_tail(MachineState *machine, PCIBus *pci_bus,
|
|||
const char *kernel_filename = machine->kernel_filename;
|
||||
const char *kernel_cmdline = machine->kernel_cmdline;
|
||||
const char *initrd_filename = machine->initrd_filename;
|
||||
const char *firmware = machine->firmware;
|
||||
MachineClass *mc = MACHINE_GET_CLASS(machine);
|
||||
DeviceState *dev;
|
||||
PCIDevice *pci_dev;
|
||||
|
@ -408,31 +410,37 @@ static void machine_HP_common_init_tail(MachineState *machine, PCIBus *pci_bus,
|
|||
|
||||
/* Load firmware. Given that this is not "real" firmware,
|
||||
but one explicitly written for the emulation, we might as
|
||||
well load it directly from an ELF image. */
|
||||
firmware_filename = qemu_find_file(QEMU_FILE_TYPE_BIOS,
|
||||
machine->firmware ?: "hppa-firmware.img");
|
||||
if (firmware_filename == NULL) {
|
||||
error_report("no firmware provided");
|
||||
exit(1);
|
||||
}
|
||||
well load it directly from an ELF image. Load the 64-bit
|
||||
firmware on 64-bit machines by default if not specified
|
||||
on command line. */
|
||||
if (!qtest_enabled()) {
|
||||
if (!firmware) {
|
||||
firmware = lasi_dev ? "hppa-firmware.img" : "hppa-firmware64.img";
|
||||
}
|
||||
firmware_filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, firmware);
|
||||
if (firmware_filename == NULL) {
|
||||
error_report("no firmware provided");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
size = load_elf(firmware_filename, NULL, translate, NULL,
|
||||
&firmware_entry, &firmware_low, &firmware_high, NULL,
|
||||
true, EM_PARISC, 0, 0);
|
||||
size = load_elf(firmware_filename, NULL, translate, NULL,
|
||||
&firmware_entry, &firmware_low, &firmware_high, NULL,
|
||||
true, EM_PARISC, 0, 0);
|
||||
|
||||
if (size < 0) {
|
||||
error_report("could not load firmware '%s'", firmware_filename);
|
||||
exit(1);
|
||||
if (size < 0) {
|
||||
error_report("could not load firmware '%s'", firmware_filename);
|
||||
exit(1);
|
||||
}
|
||||
qemu_log_mask(CPU_LOG_PAGE, "Firmware loaded at 0x%08" PRIx64
|
||||
"-0x%08" PRIx64 ", entry at 0x%08" PRIx64 ".\n",
|
||||
firmware_low, firmware_high, firmware_entry);
|
||||
if (firmware_low < translate(NULL, FIRMWARE_START) ||
|
||||
firmware_high >= translate(NULL, FIRMWARE_END)) {
|
||||
error_report("Firmware overlaps with memory or IO space");
|
||||
exit(1);
|
||||
}
|
||||
g_free(firmware_filename);
|
||||
}
|
||||
qemu_log_mask(CPU_LOG_PAGE, "Firmware loaded at 0x%08" PRIx64
|
||||
"-0x%08" PRIx64 ", entry at 0x%08" PRIx64 ".\n",
|
||||
firmware_low, firmware_high, firmware_entry);
|
||||
if (firmware_low < translate(NULL, FIRMWARE_START) ||
|
||||
firmware_high >= translate(NULL, FIRMWARE_END)) {
|
||||
error_report("Firmware overlaps with memory or IO space");
|
||||
exit(1);
|
||||
}
|
||||
g_free(firmware_filename);
|
||||
|
||||
rom_region = g_new(MemoryRegion, 1);
|
||||
memory_region_init_ram(rom_region, NULL, "firmware",
|
||||
|
|
|
@ -36,9 +36,13 @@ static bool lasi_chip_mem_valid(void *opaque, hwaddr addr,
|
|||
case LASI_IAR:
|
||||
|
||||
case LASI_LPT:
|
||||
case LASI_AUDIO:
|
||||
case LASI_AUDIO + 4:
|
||||
case LASI_UART:
|
||||
case LASI_LAN:
|
||||
case LASI_LAN + 12: /* LASI LAN MAC */
|
||||
case LASI_RTC:
|
||||
case LASI_FDC:
|
||||
|
||||
case LASI_PCR ... LASI_AMR:
|
||||
ret = true;
|
||||
|
@ -78,6 +82,8 @@ static MemTxResult lasi_chip_read_with_attrs(void *opaque, hwaddr addr,
|
|||
case LASI_LPT:
|
||||
case LASI_UART:
|
||||
case LASI_LAN:
|
||||
case LASI_LAN + 12:
|
||||
case LASI_FDC:
|
||||
val = 0;
|
||||
break;
|
||||
case LASI_RTC:
|
||||
|
@ -143,12 +149,19 @@ static MemTxResult lasi_chip_write_with_attrs(void *opaque, hwaddr addr,
|
|||
case LASI_LPT:
|
||||
/* XXX: reset parallel port */
|
||||
break;
|
||||
case LASI_AUDIO:
|
||||
case LASI_AUDIO + 4:
|
||||
/* XXX: reset audio port */
|
||||
break;
|
||||
case LASI_UART:
|
||||
/* XXX: reset serial port */
|
||||
break;
|
||||
case LASI_LAN:
|
||||
/* XXX: reset LAN card */
|
||||
break;
|
||||
case LASI_FDC:
|
||||
/* XXX: reset Floppy controller */
|
||||
break;
|
||||
case LASI_RTC:
|
||||
s->rtc_ref = val - time(NULL);
|
||||
break;
|
||||
|
|
|
@ -421,7 +421,7 @@ static uint16_t tulip_mdi_default[] = {
|
|||
/* MDI Registers 8 - 15 */
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
/* MDI Registers 16 - 31 */
|
||||
0x0003, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0003, 0x0000, 0x0001, 0x0000, 0x3b40, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
};
|
||||
|
||||
|
@ -429,7 +429,7 @@ static uint16_t tulip_mdi_default[] = {
|
|||
static const uint16_t tulip_mdi_mask[] = {
|
||||
0x0000, 0xffff, 0xffff, 0xffff, 0xc01f, 0xffff, 0xffff, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0fff, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
|
||||
0x0fff, 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0xffff,
|
||||
0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
};
|
||||
|
||||
|
|
|
@ -122,10 +122,6 @@ static MemTxResult elroy_chip_read_with_attrs(void *opaque, hwaddr addr,
|
|||
case 0x0800: /* IOSAPIC_REG_SELECT */
|
||||
val = s->iosapic_reg_select;
|
||||
break;
|
||||
case 0x0808:
|
||||
val = UINT64_MAX; /* XXX: tbc. */
|
||||
g_assert_not_reached();
|
||||
break;
|
||||
case 0x0810: /* IOSAPIC_REG_WINDOW */
|
||||
switch (s->iosapic_reg_select) {
|
||||
case 0x01: /* IOSAPIC_REG_VERSION */
|
||||
|
@ -135,15 +131,21 @@ static MemTxResult elroy_chip_read_with_attrs(void *opaque, hwaddr addr,
|
|||
if (s->iosapic_reg_select < ARRAY_SIZE(s->iosapic_reg)) {
|
||||
val = s->iosapic_reg[s->iosapic_reg_select];
|
||||
} else {
|
||||
trace_iosapic_reg_read(s->iosapic_reg_select, size, val);
|
||||
g_assert_not_reached();
|
||||
goto check_hf;
|
||||
}
|
||||
}
|
||||
trace_iosapic_reg_read(s->iosapic_reg_select, size, val);
|
||||
break;
|
||||
default:
|
||||
trace_elroy_read(addr, size, val);
|
||||
g_assert_not_reached();
|
||||
check_hf:
|
||||
if (s->status_control & HF_ENABLE) {
|
||||
val = 0;
|
||||
ret = MEMTX_DECODE_ERROR;
|
||||
} else {
|
||||
/* return -1ULL if HardFail is disabled */
|
||||
val = ~0;
|
||||
ret = MEMTX_OK;
|
||||
}
|
||||
}
|
||||
trace_elroy_read(addr, size, val);
|
||||
|
||||
|
@ -191,7 +193,7 @@ static MemTxResult elroy_chip_write_with_attrs(void *opaque, hwaddr addr,
|
|||
if (s->iosapic_reg_select < ARRAY_SIZE(s->iosapic_reg)) {
|
||||
s->iosapic_reg[s->iosapic_reg_select] = val;
|
||||
} else {
|
||||
g_assert_not_reached();
|
||||
goto check_hf;
|
||||
}
|
||||
break;
|
||||
case 0x0840: /* IOSAPIC_REG_EOI */
|
||||
|
@ -204,7 +206,10 @@ static MemTxResult elroy_chip_write_with_attrs(void *opaque, hwaddr addr,
|
|||
}
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
check_hf:
|
||||
if (s->status_control & HF_ENABLE) {
|
||||
return MEMTX_DECODE_ERROR;
|
||||
}
|
||||
}
|
||||
return MEMTX_OK;
|
||||
}
|
||||
|
@ -594,8 +599,8 @@ static MemTxResult astro_chip_read_with_attrs(void *opaque, hwaddr addr,
|
|||
#undef EMPTY_PORT
|
||||
|
||||
default:
|
||||
trace_astro_chip_read(addr, size, val);
|
||||
g_assert_not_reached();
|
||||
val = 0;
|
||||
ret = MEMTX_DECODE_ERROR;
|
||||
}
|
||||
|
||||
/* for 32-bit accesses mask return value */
|
||||
|
@ -610,6 +615,7 @@ static MemTxResult astro_chip_write_with_attrs(void *opaque, hwaddr addr,
|
|||
uint64_t val, unsigned size,
|
||||
MemTxAttrs attrs)
|
||||
{
|
||||
MemTxResult ret = MEMTX_OK;
|
||||
AstroState *s = opaque;
|
||||
|
||||
trace_astro_chip_write(addr, size, val);
|
||||
|
@ -686,11 +692,9 @@ static MemTxResult astro_chip_write_with_attrs(void *opaque, hwaddr addr,
|
|||
#undef EMPTY_PORT
|
||||
|
||||
default:
|
||||
/* Controlled by astro_chip_mem_valid above. */
|
||||
trace_astro_chip_write(addr, size, val);
|
||||
g_assert_not_reached();
|
||||
ret = MEMTX_DECODE_ERROR;
|
||||
}
|
||||
return MEMTX_OK;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const MemoryRegionOps astro_chip_ops = {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue