aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHelge Deller <deller@gmx.de>2023-11-11 19:48:45 +0100
committerHelge Deller <deller@gmx.de>2023-11-11 19:48:45 +0100
commitf2e4a7716386d83e606b215ef25063ca25c8faf3 (patch)
tree339bb03515fc996d015903c2ab72f8f5af30c1ed
parent7a02560dd07f3970afb875fea60608071f83aaac (diff)
downloadseabios-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.c15
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;