diff options
author | Helge Deller <deller@gmx.de> | 2023-11-11 19:48:45 +0100 |
---|---|---|
committer | Helge Deller <deller@gmx.de> | 2023-11-11 19:48:45 +0100 |
commit | f2e4a7716386d83e606b215ef25063ca25c8faf3 (patch) | |
tree | 339bb03515fc996d015903c2ab72f8f5af30c1ed | |
parent | 7a02560dd07f3970afb875fea60608071f83aaac (diff) | |
download | seabios-hppa-f2e4a7716386d83e606b215ef25063ca25c8faf3.zip seabios-hppa-f2e4a7716386d83e606b215ef25063ca25c8faf3.tar.gz seabios-hppa-f2e4a7716386d83e606b215ef25063ca25c8faf3.tar.bz2 |
parisc: Fix powerbutton on 64-bit kernel
As long as this is a 32-bit PDC, we can't access a powerbutton
in the firmware area when running on a 64-bit CPU.
Report that non-supportability when asked by PDC_SOFT_POWER by
a 64-bit kernel.
Qemu may want to use some address in page zero instead.
Signed-off-by: Helge Deller <deller@gmx.de>
-rw-r--r-- | src/parisc/parisc.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/src/parisc/parisc.c b/src/parisc/parisc.c index 653a290..61dd651 100644 --- a/src/parisc/parisc.c +++ b/src/parisc/parisc.c @@ -202,10 +202,16 @@ void __VISIBLE __noreturn hlt(void) while (1); } +static int powerswitch_supported(void) +{ + /* can't reach powerswitch pointer on 64-bit CPU if ptr above 0xf0000000 */ + return cpu_bit_width == 32 || (unsigned long) powersw_ptr < 0xf0000000; +} + static void check_powersw_button(void) { /* halt immediately if power button was pressed. */ - if ((*powersw_ptr & 1) == 0) { + if (powerswitch_supported() && (*powersw_ptr & 1) == 0) { printf("SeaBIOS: Machine powered off via power switch button.\n"); hlt(); } @@ -2026,6 +2032,9 @@ static int pdc_soft_power(unsigned int *arg) unsigned long option = ARG1; unsigned long *result = (unsigned long *)ARG2; + if (!powerswitch_supported()) + return PDC_BAD_PROC; + switch (option) { case PDC_SOFT_POWER_INFO: result[0] = (unsigned long) powersw_ptr; @@ -3076,7 +3085,9 @@ void __VISIBLE start_parisc_firmware(void) memcpy((char*)&PAGE0->pad0, "SeaBIOS", 8); PAGE0->pad0[2] = ((unsigned long long)PORT_QEMU_CFG_CTL) >> 32; /* store as 64bit value */ PAGE0->pad0[3] = PORT_QEMU_CFG_CTL; - *powersw_ptr = 0x01; /* button not pressed, hw controlled. */ + PAGE0->pad0[4] = 0x01; /* reserved for emulated power switch button */ + if (powerswitch_supported()) + *powersw_ptr = 0x01; /* button not pressed, hw controlled. */ /* PAGE0->imm_hpa - is set later (MEMORY_HPA) */ PAGE0->imm_spa_size = ram_size; |