feat: added shutdown command
This commit is contained in:
@@ -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, ' ');
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
15
kernel/util/power.c
Normal 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
11
kernel/util/power.h
Normal 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
|
||||
Reference in New Issue
Block a user