void grub_halt (void) { grub_machine_fini (GRUB_LOADER_FLAG_NORETURN); #if !defined(__ia64__) && !defined(__arm__) && !defined(__aarch64__) grub_acpi_halt (); #endif efi_call_4 (grub_efi_system_table->runtime_services->reset_system, GRUB_EFI_RESET_SHUTDOWN, GRUB_EFI_SUCCESS, 0, NULL); while (1); }
/* * Halt the system, using APM if possible. If NO_APM is true, don't use * APM even if it is available. */ void grub_halt (int no_apm) { struct grub_bios_int_registers regs; grub_acpi_halt (); if (no_apm) stop (); /* detect APM */ regs.eax = 0x5300; regs.ebx = 0; regs.flags = GRUB_CPU_INT_FLAGS_DEFAULT; grub_bios_interrupt (0x15, ®s); if (regs.flags & GRUB_CPU_INT_FLAGS_CARRY) stop (); /* disconnect APM first */ regs.eax = 0x5304; regs.ebx = 0; regs.flags = GRUB_CPU_INT_FLAGS_DEFAULT; grub_bios_interrupt (0x15, ®s); /* connect APM */ regs.eax = 0x5301; regs.ebx = 0; regs.flags = GRUB_CPU_INT_FLAGS_DEFAULT; grub_bios_interrupt (0x15, ®s); if (regs.flags & GRUB_CPU_INT_FLAGS_CARRY) stop (); /* set APM protocol level - 1.1 or bust. (this covers APM 1.2 also) */ regs.eax = 0x530E; regs.ebx = 0; regs.ecx = 0x0101; regs.flags = GRUB_CPU_INT_FLAGS_DEFAULT; grub_bios_interrupt (0x15, ®s); if (regs.flags & GRUB_CPU_INT_FLAGS_CARRY) stop (); /* set the power state to off */ regs.eax = 0x5307; regs.ebx = 1; regs.ecx = 3; regs.flags = GRUB_CPU_INT_FLAGS_DEFAULT; grub_bios_interrupt (0x15, ®s); /* shouldn't reach here */ stop (); }
/* * Halt the system or reboot. */ void halt_all_cpus(boolean_t reboot) { if (reboot) { #ifdef MACH_HYP hyp_reboot(); #endif /* MACH_HYP */ kdreboot(); } else { rebootflag = TRUE; #ifdef MACH_HYP hyp_halt(); #endif /* MACH_HYP */ grub_acpi_halt(); printf("In tight loop: hit ctl-alt-del to reboot\n"); (void) spl0(); } while (TRUE) machine_idle (cpu_number ()); }