blob: bd9ba84f9b4a261a1bf2cc79906841d2618bf745 [file] [log] [blame]
// Copyright 2021 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT
#include <lib/arch/x86/descriptor.h>
#include <stdint.h>
#include <phys/main.h>
void ArchPanicReset() {
// The zero-limit IDT should ensure that UD2 causes a triple-fault reset.
// But just in case first try the golden oldy i8042 reset pulse.
constexpr arch::GdtRegister64 kEmpty{};
constexpr uint8_t k8042 = 0x64;
constexpr uint8_t kReset = 0xfe;
__asm__ volatile(
R"""(
lidt %[idt_ptr]
outb %[port], %[byte]
0: ud2
jmp 0b
)"""
:
: [idt_ptr] "m"(kEmpty), [port] "a"(k8042), [byte] "i"(kReset));
__builtin_trap();
}