feat: added shutdown command
This commit is contained in:
@@ -19,6 +19,7 @@
|
|||||||
#include <libc/readline.h>
|
#include <libc/readline.h>
|
||||||
#include <libc/libc.h>
|
#include <libc/libc.h>
|
||||||
#include <attributes.h>
|
#include <attributes.h>
|
||||||
|
#include <util/power.h>
|
||||||
|
|
||||||
#define BOOTLOADER_NAME_MAX_LENGTH 64
|
#define BOOTLOADER_NAME_MAX_LENGTH 64
|
||||||
#define CMDLINE_MAX_LENGTH 256
|
#define CMDLINE_MAX_LENGTH 256
|
||||||
@@ -39,16 +40,23 @@ void ide(const char *arg);
|
|||||||
|
|
||||||
void echo(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[] = {
|
cmd_handler cmd_handlers[] = {
|
||||||
{"help\0", help},
|
{"help\0", help},
|
||||||
{"echo\0", echo},
|
{"echo\0", echo},
|
||||||
{"print\0", print},
|
{"print\0", print},
|
||||||
{"ide\0", ide},
|
{"ide\0", ide},
|
||||||
|
{"shutdown", shutdown},
|
||||||
{NULL, NULL},
|
{NULL, NULL},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void shutdown(const char *args) {
|
||||||
|
power_shutdown();
|
||||||
|
}
|
||||||
|
|
||||||
void print_bootinfo() {
|
void print_bootinfo() {
|
||||||
printf("Bootloader name: %s\n"
|
printf("Bootloader name: %s\n"
|
||||||
"cmdline: %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) {
|
while (true) {
|
||||||
char *msg = readline(NULL);
|
char *msg = readline(NULL);
|
||||||
char *args = strchr(msg, ' ');
|
char *args = strchr(msg, ' ');
|
||||||
|
|||||||
@@ -6,6 +6,17 @@
|
|||||||
#define PORT_PIC_SLAVE_COMMAND 0xA0
|
#define PORT_PIC_SLAVE_COMMAND 0xA0
|
||||||
#define PORT_PIC_SLAVE_DATA 0xA1
|
#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
|
//http://www.osdever.net/FreeVGA/vga/crtcreg.htm#0A
|
||||||
#define PORT_REG_SCREEN_CTRL 0x3d4
|
#define PORT_REG_SCREEN_CTRL 0x3d4
|
||||||
#define PORT_REG_SCREEN_CTRL_CURSOR_H 0x0E
|
#define PORT_REG_SCREEN_CTRL_CURSOR_H 0x0E
|
||||||
@@ -29,16 +40,14 @@
|
|||||||
#define PORT_SERIAL_MODEM_STATUS 6
|
#define PORT_SERIAL_MODEM_STATUS 6
|
||||||
#define PORT_SERIAL_SCRATCH 6
|
#define PORT_SERIAL_SCRATCH 6
|
||||||
|
|
||||||
// https://wiki.osdev.org/PIT
|
#define PORT_ACPI 0xB004
|
||||||
#define PORT_PIT_COMMAND 0x43
|
#define PORT_ACPI_SHUTDOWN 0x2000
|
||||||
#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_QEMU_COMMAND 0x604
|
||||||
#define PORT_PS2_DATA 0x60
|
#define PORT_QEMU_COMMAND_SHUTDOWN 0x2000
|
||||||
#define PORT_PS2_STATUS 0x64
|
|
||||||
#define PORT_PS2_COMMAND 0x64
|
#define PORT_VBOX 0x4004
|
||||||
|
#define PORT_VBOX_SHUTDOWN 0x3400
|
||||||
|
|
||||||
// https://wiki.osdev.org/PCI
|
// https://wiki.osdev.org/PCI
|
||||||
#define PORT_PCI_CONFIG_ADDRESS (0xCF8)
|
#define PORT_PCI_CONFIG_ADDRESS (0xCF8)
|
||||||
|
|||||||
@@ -3,8 +3,9 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include <libk/kprint.h>
|
||||||
|
#include <attributes.h>
|
||||||
#include "libk.h"
|
#include "libk.h"
|
||||||
#include "kprint.h"
|
|
||||||
|
|
||||||
bool k_addr_in_kspace(void* addr) {
|
bool k_addr_in_kspace(void* addr) {
|
||||||
return addr > kernel_start && addr < kernel_end;
|
return addr > kernel_start && addr < kernel_end;
|
||||||
@@ -14,15 +15,16 @@ void k_wait_for_interrupt() {
|
|||||||
__asm__ __volatile__("hlt;");
|
__asm__ __volatile__("hlt;");
|
||||||
}
|
}
|
||||||
|
|
||||||
void k_panics(const char *msg) {
|
void noreturn k_panics(const char *msg) {
|
||||||
|
// todo this is not printed
|
||||||
kprint(msg);
|
kprint(msg);
|
||||||
kprint("PANIC!");
|
k_panic();
|
||||||
__asm__ __volatile__("cli;"
|
|
||||||
"hlt;");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void k_panic() {
|
void noreturn k_panic() {
|
||||||
kprint("PANIC!");
|
kprint("PANIC!");
|
||||||
|
while (true) {
|
||||||
__asm__ __volatile__("cli;"
|
__asm__ __volatile__("cli;"
|
||||||
"hlt;");
|
"hlt;");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
#ifndef NEW_KERNEL_LIBK_H
|
#ifndef NEW_KERNEL_LIBK_H
|
||||||
#define NEW_KERNEL_LIBK_H
|
#define NEW_KERNEL_LIBK_H
|
||||||
|
#include <attributes.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
extern void* _kernel_start;
|
extern void* _kernel_start;
|
||||||
@@ -15,8 +16,8 @@ bool k_addr_in_kspace(void *addr);
|
|||||||
|
|
||||||
void k_wait_for_interrupt();
|
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
|
#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