Skip to content

Commit

Permalink
hw/hppa: Move software power button address back into PDC
Browse files Browse the repository at this point in the history
The various operating systems (e.g. Linux, NetBSD) have issues
mapping the power button when it's stored in page zero.
NetBSD even crashes, because it fails to map that page and then
accesses unmapped memory.

Since we now have a consistent memory mapping of PDC in 32-bit
and 64-bit address space (the lower 32-bits of the address are in
sync) the power button can be moved back to PDC space.

This patch fixes the power button on Linux, NetBSD and HP-UX.

Signed-off-by: Helge Deller <deller@gmx.de>
  • Loading branch information
hdeller committed Jan 7, 2024
1 parent cecf7f8 commit b2d2390
Showing 1 changed file with 5 additions and 4 deletions.
9 changes: 5 additions & 4 deletions hw/hppa/machine.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,15 @@

#define MIN_SEABIOS_HPPA_VERSION 12 /* require at least this fw version */

/* Power button address at &PAGE0->pad[4] */
#define HPA_POWER_BUTTON (0x40 + 4 * sizeof(uint32_t))
#define HPA_POWER_BUTTON (FIRMWARE_END - 0x10)
static hwaddr soft_power_reg;

#define enable_lasi_lan() 0

static DeviceState *lasi_dev;

static void hppa_powerdown_req(Notifier *n, void *opaque)
{
hwaddr soft_power_reg = HPA_POWER_BUTTON;
uint32_t val;

val = ldl_be_phys(&address_space_memory, soft_power_reg);
Expand Down Expand Up @@ -221,7 +220,7 @@ static FWCfgState *create_fw_cfg(MachineState *ms, PCIBus *pci_bus,
fw_cfg_add_file(fw_cfg, "/etc/hppa/machine",
g_memdup(mc->name, len), len);

val = cpu_to_le64(HPA_POWER_BUTTON);
val = cpu_to_le64(soft_power_reg);
fw_cfg_add_file(fw_cfg, "/etc/hppa/power-button-addr",
g_memdup(&val, sizeof(val)), sizeof(val));

Expand Down Expand Up @@ -295,6 +294,8 @@ static TranslateFn *machine_HP_common_init_cpus(MachineState *machine)
ram_max = 0xf0000000; /* 3.75 GB (32-bit CPU) */
}

soft_power_reg = translate(NULL, HPA_POWER_BUTTON);

for (unsigned int i = 0; i < smp_cpus; i++) {
g_autofree char *name = g_strdup_printf("cpu%u-io-eir", i);

Expand Down

0 comments on commit b2d2390

Please sign in to comment.