-
Pekka Enberg authored
Signed-off-by:
Pekka Enberg <penberg@cloudius-systems.com>
Pekka Enberg authoredSigned-off-by:
Pekka Enberg <penberg@cloudius-systems.com>
pvpanic.cc 1.19 KiB
/*
* Copyright (C) 2013 Nodalink, SARL.
*
* This work is open source software, licensed under the terms of the
* BSD license as described in the LICENSE file in the top-level directory.
*/
extern "C" {
#include "acpi.h"
}
#include "msr.hh"
#include <osv/debug.hh>
#include "drivers/acpi.hh"
#include "drivers/pvpanic.hh"
namespace panic {
namespace pvpanic {
static u32 port;
void probe_and_setup()
{
ACPI_BUFFER results;
ACPI_OBJECT obj;
ACPI_STATUS status;
results.Length = sizeof(obj);
results.Pointer = &obj;
status = AcpiEvaluateObject(nullptr,
(ACPI_STRING) "\\_SB.PCI0.ISA.PEVT.PEST",
nullptr,
&results);
if (status == AE_NOT_FOUND) {
return;
}
if (ACPI_FAILURE(status)) {
debug("pvpanic:AcpiEvaluateObject() failed: %s\n",
AcpiFormatException(status));
return;
}
if (obj.Integer.Type != ACPI_TYPE_INTEGER) {
return;
}
// No need to free memory: See 8.10 page 206 of ACPICA documentation
port = obj.Integer.Value;
}
void panicked()
{
if (port) {
processor::outb(1, port);
}
}
}}