feat: added shutdown command

This commit is contained in:
2021-03-03 22:12:37 +01:00
parent c9102fbc65
commit 300e80c2e8
6 changed files with 71 additions and 25 deletions

View File

@@ -19,6 +19,7 @@
#include <libc/readline.h>
#include <libc/libc.h>
#include <attributes.h>
#include <util/power.h>
#define BOOTLOADER_NAME_MAX_LENGTH 64
#define CMDLINE_MAX_LENGTH 256
@@ -39,16 +40,23 @@ void ide(const char *arg);
void echo(const char *arg);
void help(const char *arg);
void help(const char *args);
void shutdown(const char *args);
cmd_handler cmd_handlers[] = {
{"help\0", help},
{"echo\0", echo},
{"print\0", print},
{"ide\0", ide},
{"help\0", help},
{"echo\0", echo},
{"print\0", print},
{"ide\0", ide},
{"shutdown", shutdown},
{NULL, NULL},
};
void shutdown(const char *args) {
power_shutdown();
}
void print_bootinfo() {
printf("Bootloader name: %s\n"
"cmdline: %s\n",
@@ -124,7 +132,7 @@ void store_bootloader_info(multiboot_info_t *multiboot_info) {
}
}
void noreturn main_loop(void* data) {
void noreturn main_loop(void *data) {
while (true) {
char *msg = readline(NULL);
char *args = strchr(msg, ' ');

View File

@@ -6,6 +6,17 @@
#define PORT_PIC_SLAVE_COMMAND 0xA0
#define PORT_PIC_SLAVE_DATA 0xA1
// https://wiki.osdev.org/PIT
#define PORT_PIT_COMMAND 0x43
#define PORT_PIT_DATA_0 0x40
#define PORT_PIT_DATA_1 0x41
#define PORT_PIT_DATA_3 0x42
// https://wiki.osdev.org/%228042%22_PS/2_Controller
#define PORT_PS2_DATA 0x60
#define PORT_PS2_STATUS 0x64
#define PORT_PS2_COMMAND 0x64
//http://www.osdever.net/FreeVGA/vga/crtcreg.htm#0A
#define PORT_REG_SCREEN_CTRL 0x3d4
#define PORT_REG_SCREEN_CTRL_CURSOR_H 0x0E
@@ -29,16 +40,14 @@
#define PORT_SERIAL_MODEM_STATUS 6
#define PORT_SERIAL_SCRATCH 6
// https://wiki.osdev.org/PIT
#define PORT_PIT_COMMAND 0x43
#define PORT_PIT_DATA_0 0x40
#define PORT_PIT_DATA_1 0x41
#define PORT_PIT_DATA_3 0x42
#define PORT_ACPI 0xB004
#define PORT_ACPI_SHUTDOWN 0x2000
// https://wiki.osdev.org/%228042%22_PS/2_Controller
#define PORT_PS2_DATA 0x60
#define PORT_PS2_STATUS 0x64
#define PORT_PS2_COMMAND 0x64
#define PORT_QEMU_COMMAND 0x604
#define PORT_QEMU_COMMAND_SHUTDOWN 0x2000
#define PORT_VBOX 0x4004
#define PORT_VBOX_SHUTDOWN 0x3400
// https://wiki.osdev.org/PCI
#define PORT_PCI_CONFIG_ADDRESS (0xCF8)

View File

@@ -3,8 +3,9 @@
//
#include <stdbool.h>
#include <libk/kprint.h>
#include <attributes.h>
#include "libk.h"
#include "kprint.h"
bool k_addr_in_kspace(void* addr) {
return addr > kernel_start && addr < kernel_end;
@@ -14,15 +15,16 @@ void k_wait_for_interrupt() {
__asm__ __volatile__("hlt;");
}
void k_panics(const char *msg) {
void noreturn k_panics(const char *msg) {
// todo this is not printed
kprint(msg);
kprint("PANIC!");
__asm__ __volatile__("cli;"
"hlt;");
k_panic();
}
void k_panic() {
void noreturn k_panic() {
kprint("PANIC!");
__asm__ __volatile__("cli;"
"hlt;");
while (true) {
__asm__ __volatile__("cli;"
"hlt;");
}
}

View File

@@ -4,6 +4,7 @@
#ifndef NEW_KERNEL_LIBK_H
#define NEW_KERNEL_LIBK_H
#include <attributes.h>
#include <stdbool.h>
extern void* _kernel_start;
@@ -15,8 +16,8 @@ bool k_addr_in_kspace(void *addr);
void k_wait_for_interrupt();
void k_panics(const char *msg);
void noreturn k_panics(const char *msg);
void k_panic();
void noreturn k_panic();
#endif //NEW_KERNEL_LIBK_H

15
kernel/util/power.c Normal file
View File

@@ -0,0 +1,15 @@
//
// Created by rick on 03-03-21.
//
#include <drivers/ports.h>
#include <attributes.h>
#include <libk/libk.h>
#include "power.h"
void noreturn power_shutdown() {
port_word_out(PORT_ACPI, PORT_ACPI_SHUTDOWN);
port_word_out(PORT_QEMU_COMMAND, PORT_QEMU_COMMAND_SHUTDOWN);
port_word_out(PORT_VBOX, PORT_VBOX_SHUTDOWN);
k_panics("Failed to shut down!\n");
}

11
kernel/util/power.h Normal file
View File

@@ -0,0 +1,11 @@
//
// Created by rick on 03-03-21.
//
#ifndef NEW_KERNEL_POWER_H
#define NEW_KERNEL_POWER_H
#include <attributes.h>
void noreturn power_shutdown();
#endif //NEW_KERNEL_POWER_H