feat: cleanup init code, small other refactors
This commit is contained in:
@@ -5,10 +5,6 @@
|
|||||||
#ifndef NEW_KERNEL_ACPI_H
|
#ifndef NEW_KERNEL_ACPI_H
|
||||||
#define NEW_KERNEL_ACPI_H
|
#define NEW_KERNEL_ACPI_H
|
||||||
|
|
||||||
void acpi_parse();
|
|
||||||
|
|
||||||
void acpi_init();
|
|
||||||
|
|
||||||
void* acpi_find_table_by_name(const char* name, int skip);
|
void* acpi_find_table_by_name(const char* name, int skip);
|
||||||
|
|
||||||
#endif //NEW_KERNEL_ACPI_H
|
#endif //NEW_KERNEL_ACPI_H
|
||||||
|
|||||||
@@ -9,6 +9,4 @@
|
|||||||
|
|
||||||
void store_bootloader_info(multiboot_info_t *multiboot_info);
|
void store_bootloader_info(multiboot_info_t *multiboot_info);
|
||||||
|
|
||||||
void main_loop(void *data);
|
|
||||||
|
|
||||||
#endif //NEW_KERNEL_COMMAND_H
|
#endif //NEW_KERNEL_COMMAND_H
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
int pit_init(uint32_t freq);
|
int pit_int_frequency(uint32_t freq);
|
||||||
|
|
||||||
void print_current_tick();
|
void print_current_tick();
|
||||||
|
|
||||||
|
|||||||
@@ -19,8 +19,6 @@ typedef struct KeyEvent_t {
|
|||||||
|
|
||||||
char getc();
|
char getc();
|
||||||
|
|
||||||
void init_keyboard();
|
|
||||||
|
|
||||||
//const char *key_code_to_string(KeyCode key);
|
//const char *key_code_to_string(KeyCode key);
|
||||||
|
|
||||||
KeyEvent *get_next_event();
|
KeyEvent *get_next_event();
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by rick on 28-01-21.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef NEW_KERNEL_SERIAL_H
|
|
||||||
#define NEW_KERNEL_SERIAL_H
|
|
||||||
|
|
||||||
int serial_init();
|
|
||||||
|
|
||||||
void serial_kprint(const char *msg);
|
|
||||||
|
|
||||||
#endif //NEW_KERNEL_SERIAL_H
|
|
||||||
@@ -27,8 +27,4 @@
|
|||||||
#define VGA_COL_MAX 80
|
#define VGA_COL_MAX 80
|
||||||
#define VGA_ROW_MAX 25
|
#define VGA_ROW_MAX 25
|
||||||
|
|
||||||
void vga_clear_screen();
|
|
||||||
|
|
||||||
void vga_kprint(const char *msg);
|
|
||||||
|
|
||||||
#endif //MY_KERNEL_VGASCREEN_H
|
#endif //MY_KERNEL_VGASCREEN_H
|
||||||
|
|||||||
@@ -17,6 +17,4 @@ void kprint(const char *msg);
|
|||||||
|
|
||||||
void kprint_sync(const char *msg);
|
void kprint_sync(const char *msg);
|
||||||
|
|
||||||
void kprint_init();
|
void kprint_init();
|
||||||
|
|
||||||
void kprint_start_task();
|
|
||||||
@@ -8,13 +8,23 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <myke/driver.h>
|
#include <myke/driver.h>
|
||||||
|
|
||||||
|
enum init_stage {
|
||||||
|
INIT_STAGE_EARLY_BOOT_0, // id mapped, high memory, no malloc
|
||||||
|
INIT_STAGE_EARLY_BOOT_1, // memory available, no tasking
|
||||||
|
INIT_STAGE_LATE_BOOT, // time source, memory, most basic hardware available
|
||||||
|
INIT_STAGE_PRE_TASKING, // just before tasking is ready
|
||||||
|
INIT_STAGE_AFTER_BOOT_PRE_INIT, // tasking just started
|
||||||
|
// todo define later stages
|
||||||
|
};
|
||||||
|
|
||||||
struct init {
|
struct init {
|
||||||
const char *name;
|
const char *name;
|
||||||
|
enum init_stage stage;
|
||||||
void (*init)();
|
void (*init)();
|
||||||
};
|
};
|
||||||
|
|
||||||
#define INIT_FUNCTION(order) GENERIC_DRIVER(init, order)
|
#define INIT_FUNCTION(order) GENERIC_DRIVER(init, order)
|
||||||
|
|
||||||
void init_execute_all();
|
void init_execute_all(enum init_stage stage);
|
||||||
|
|
||||||
#endif //NEW_KERNEL_INIT_H
|
#endif //NEW_KERNEL_INIT_H
|
||||||
|
|||||||
@@ -66,8 +66,6 @@ uint8_t block_dev_register(block_device_t *device);
|
|||||||
|
|
||||||
void block_dev_free(block_device_t *device);
|
void block_dev_free(block_device_t *device);
|
||||||
|
|
||||||
void block_dev_start_task();
|
|
||||||
|
|
||||||
void block_dev_print_info();
|
void block_dev_print_info();
|
||||||
|
|
||||||
bool block_dev_mount(char *identifier, char *driver);
|
bool block_dev_mount(char *identifier, char *driver);
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
#include <myke/acpi/structures.h>
|
#include <myke/acpi/structures.h>
|
||||||
#include <myke/cpu/lapic.h>
|
#include <myke/cpu/lapic.h>
|
||||||
#include <myke/libk/libk.h>
|
#include <myke/libk/libk.h>
|
||||||
|
#include <myke/util/init.h>
|
||||||
|
|
||||||
void acpi_handle_facp(const struct acpi_sdt_header *addr);
|
void acpi_handle_facp(const struct acpi_sdt_header *addr);
|
||||||
|
|
||||||
@@ -272,5 +273,12 @@ void acpi_parse() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void acpi_init() {
|
void acpi_init() {
|
||||||
|
acpi_parse();
|
||||||
lai_create_namespace();
|
lai_create_namespace();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
INIT_FUNCTION(100) = {
|
||||||
|
.name = "acpi",
|
||||||
|
.stage = INIT_STAGE_EARLY_BOOT_1,
|
||||||
|
.init = acpi_init,
|
||||||
|
};
|
||||||
@@ -25,6 +25,7 @@
|
|||||||
#include <myke/debug/debug.h>
|
#include <myke/debug/debug.h>
|
||||||
#include <myke/util/slingurl.h>
|
#include <myke/util/slingurl.h>
|
||||||
#include <myke/libk/syscall.h>
|
#include <myke/libk/syscall.h>
|
||||||
|
#include <myke/util/init.h>
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -223,3 +224,15 @@ void att_noreturn main_loop(void *data) {
|
|||||||
free(msg);
|
free(msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef K_SHELL
|
||||||
|
void main_loop_start() {
|
||||||
|
task_spawn(main_loop, NULL, "main");
|
||||||
|
}
|
||||||
|
|
||||||
|
INIT_FUNCTION(100) = {
|
||||||
|
.name = "main-task",
|
||||||
|
.stage = INIT_STAGE_PRE_TASKING,
|
||||||
|
.init = main_loop_start,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
@@ -78,7 +78,7 @@ void print_current_tick() {
|
|||||||
kprint("\n");
|
kprint("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
int pit_init(uint32_t freq) {
|
int pit_int_frequency(uint32_t freq) {
|
||||||
register_interrupt_handler(IRQ0, pit_callback);
|
register_interrupt_handler(IRQ0, pit_callback);
|
||||||
|
|
||||||
uint32_t divisor = PIT_FREQUENCY / freq;
|
uint32_t divisor = PIT_FREQUENCY / freq;
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
#include <myke/libc/ringqueue.h>
|
#include <myke/libc/ringqueue.h>
|
||||||
#include <myke/libk/libk.h>
|
#include <myke/libk/libk.h>
|
||||||
#include <myke/libk/syscall.h>
|
#include <myke/libk/syscall.h>
|
||||||
|
#include <myke/util/init.h>
|
||||||
|
|
||||||
|
|
||||||
const char scancode_map_lowercase[] = {
|
const char scancode_map_lowercase[] = {
|
||||||
@@ -131,7 +132,7 @@ static void keyboard_callback(isr_registers_t *regs) {
|
|||||||
publish_key_event(scancode);
|
publish_key_event(scancode);
|
||||||
}
|
}
|
||||||
|
|
||||||
void init_keyboard() {
|
void keyboard_init() {
|
||||||
register_interrupt_handler(IRQ1, keyboard_callback);
|
register_interrupt_handler(IRQ1, keyboard_callback);
|
||||||
keyboard_state.shift = 0;
|
keyboard_state.shift = 0;
|
||||||
keyboard_state.ctrl = 0;
|
keyboard_state.ctrl = 0;
|
||||||
@@ -139,3 +140,9 @@ void init_keyboard() {
|
|||||||
keyboard_state.extended = 0;
|
keyboard_state.extended = 0;
|
||||||
keyboard_event_buffer = create_buffer(256, sizeof(KeyEvent));
|
keyboard_event_buffer = create_buffer(256, sizeof(KeyEvent));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
INIT_FUNCTION(100) = {
|
||||||
|
.name = "keyboard",
|
||||||
|
.stage = INIT_STAGE_LATE_BOOT,
|
||||||
|
.init = keyboard_init,
|
||||||
|
};
|
||||||
@@ -2,9 +2,10 @@
|
|||||||
// Created by rick on 28-01-21.
|
// Created by rick on 28-01-21.
|
||||||
//
|
//
|
||||||
|
|
||||||
#include <myke/drivers/serial.h>
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <myke/drivers/ports.h>
|
#include <myke/drivers/ports.h>
|
||||||
|
#include <myke/libk/kprint.h>
|
||||||
|
#include <myke/util/init.h>
|
||||||
|
|
||||||
#define SERIAL_INTERRUPT_DATA_AVAILABLE (1 << 0)
|
#define SERIAL_INTERRUPT_DATA_AVAILABLE (1 << 0)
|
||||||
#define SERIAL_INTERRUPT_TRANSMITTER_EMPTY (1 << 1)
|
#define SERIAL_INTERRUPT_TRANSMITTER_EMPTY (1 << 1)
|
||||||
@@ -51,7 +52,7 @@
|
|||||||
#define MODEM_CONTROL_LOOPBACK_MODE (1 << 4)
|
#define MODEM_CONTROL_LOOPBACK_MODE (1 << 4)
|
||||||
#define MODEM_CONTROL_AUTOFLOW_CONTROL_ENABLED (1 << 5)
|
#define MODEM_CONTROL_AUTOFLOW_CONTROL_ENABLED (1 << 5)
|
||||||
|
|
||||||
int serial_init() {
|
int serial_init_hw() {
|
||||||
port_byte_out(PORT_SERIAL_0 + PORT_SERIAL_INTERRUPT, 0); // Disable all interrupts
|
port_byte_out(PORT_SERIAL_0 + PORT_SERIAL_INTERRUPT, 0); // Disable all interrupts
|
||||||
port_byte_out(PORT_SERIAL_0 + PORT_SERIAL_LINE_CONTROL,
|
port_byte_out(PORT_SERIAL_0 + PORT_SERIAL_LINE_CONTROL,
|
||||||
LINE_CONTROL_DIVISOR); // Enable DLAB (set baud rate divisor)
|
LINE_CONTROL_DIVISOR); // Enable DLAB (set baud rate divisor)
|
||||||
@@ -114,4 +115,17 @@ void serial_kprint(const char *msg) {
|
|||||||
write_serial(c);
|
write_serial(c);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void serial_init() {
|
||||||
|
if (serial_init_hw() != 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
kprint_register(serial_kprint);
|
||||||
|
}
|
||||||
|
|
||||||
|
INIT_FUNCTION(100) = {
|
||||||
|
.name = "serial",
|
||||||
|
.stage = INIT_STAGE_EARLY_BOOT_0,
|
||||||
|
.init = serial_init,
|
||||||
|
};
|
||||||
|
|||||||
@@ -3,9 +3,11 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <myke/drivers/vgascreen.h>
|
|
||||||
|
|
||||||
#include <myke/drivers/ports.h>
|
#include <myke/drivers/ports.h>
|
||||||
|
#include <myke/drivers/vgascreen.h>
|
||||||
|
#include <myke/libk/kprint.h>
|
||||||
|
#include <myke/util/init.h>
|
||||||
|
|
||||||
char *_vga_character_memory = (char *) VGA_CHARACTER_MEMORY_LOCATION;
|
char *_vga_character_memory = (char *) VGA_CHARACTER_MEMORY_LOCATION;
|
||||||
|
|
||||||
@@ -136,3 +138,14 @@ int get_offset_row(int offset) {
|
|||||||
int get_offset_col(int offset) {
|
int get_offset_col(int offset) {
|
||||||
return (offset - (get_offset_row(offset) * 2 * VGA_COL_MAX)) / 2;
|
return (offset - (get_offset_row(offset) * 2 * VGA_COL_MAX)) / 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void vga_init() {
|
||||||
|
vga_clear_screen();
|
||||||
|
kprint_register(vga_kprint);
|
||||||
|
}
|
||||||
|
|
||||||
|
INIT_FUNCTION(100) = {
|
||||||
|
.name = "vga",
|
||||||
|
.stage = INIT_STAGE_EARLY_BOOT_0,
|
||||||
|
.init = vga_init,
|
||||||
|
};
|
||||||
@@ -4,18 +4,12 @@
|
|||||||
|
|
||||||
#define DEBUG_INIT
|
#define DEBUG_INIT
|
||||||
|
|
||||||
#include <myke/acpi/acpi.h>
|
|
||||||
#include <myke/command.h>
|
#include <myke/command.h>
|
||||||
#include <myke/cpu/cpuidx.h>
|
|
||||||
#include <myke/cpu/gdt.h>
|
#include <myke/cpu/gdt.h>
|
||||||
#include <myke/cpu/isr.h>
|
#include <myke/cpu/isr.h>
|
||||||
#include <myke/cpu/pit.h>
|
#include <myke/cpu/pit.h>
|
||||||
#include <myke/debug/debug.h>
|
#include <myke/debug/debug.h>
|
||||||
#include <myke/drivers/keyboard.h>
|
|
||||||
#include <myke/drivers/pci/pci.h>
|
#include <myke/drivers/pci/pci.h>
|
||||||
#include <myke/drivers/serial.h>
|
|
||||||
#include <myke/drivers/vgascreen.h>
|
|
||||||
#include <myke/vfs/blockdev.h>
|
|
||||||
#include <myke/libk/kprint.h>
|
#include <myke/libk/kprint.h>
|
||||||
#include <myke/libk/libk.h>
|
#include <myke/libk/libk.h>
|
||||||
#include <myke/libk/syscall.h>
|
#include <myke/libk/syscall.h>
|
||||||
@@ -44,11 +38,8 @@ void init_pci_system() {
|
|||||||
void att_noreturn att_used kmain(multiboot_info_t *multiboot_info, uint32_t mb_name) {
|
void att_noreturn att_used kmain(multiboot_info_t *multiboot_info, uint32_t mb_name) {
|
||||||
// early init
|
// early init
|
||||||
isr_install();
|
isr_install();
|
||||||
vga_clear_screen();
|
// initialize early modules (kprint etc.)
|
||||||
vga_clear_screen(' ', VGA_WHITE | (VGA_GRAY << VGA_SHIFT_BG));
|
init_execute_all(INIT_STAGE_EARLY_BOOT_0);
|
||||||
kprint_register(vga_kprint);
|
|
||||||
serial_init();
|
|
||||||
kprint_register(serial_kprint);
|
|
||||||
|
|
||||||
// parse multiboot
|
// parse multiboot
|
||||||
if (mb_name != MULTIBOOT_BOOTLOADER_MAGIC) {
|
if (mb_name != MULTIBOOT_BOOTLOADER_MAGIC) {
|
||||||
@@ -59,41 +50,33 @@ void att_noreturn att_used kmain(multiboot_info_t *multiboot_info, uint32_t mb_n
|
|||||||
|
|
||||||
// initialize memory management
|
// initialize memory management
|
||||||
init_mmap(multiboot_info);
|
init_mmap(multiboot_info);
|
||||||
|
// safe multiboot info for later use
|
||||||
|
debug_store_info(multiboot_info);
|
||||||
|
|
||||||
gdt_init();
|
gdt_init();
|
||||||
|
|
||||||
// initialize kprint functionality
|
// initialize kprint functionality
|
||||||
kprint_init();
|
kprint_init();
|
||||||
|
// initialize early driver code (ACPI, etc.)
|
||||||
// todo earlier in boot
|
init_execute_all(INIT_STAGE_EARLY_BOOT_1);
|
||||||
acpi_parse();
|
|
||||||
acpi_init();
|
|
||||||
|
|
||||||
debug_store_info(multiboot_info);
|
|
||||||
|
|
||||||
// identify cpu
|
|
||||||
cpuidx_print_info();
|
|
||||||
|
|
||||||
// enable interrupts
|
// enable interrupts
|
||||||
__asm__ __volatile__("sti");
|
__asm__ __volatile__("sti");
|
||||||
// start the timer
|
// start the timer
|
||||||
pit_init(1000);
|
pit_int_frequency(1000);
|
||||||
// initialize devices
|
|
||||||
init_keyboard();
|
// initialize drivers that are not discovered in any other way
|
||||||
|
init_execute_all(INIT_STAGE_LATE_BOOT);
|
||||||
|
|
||||||
|
// init PCI
|
||||||
init_pci_system();
|
init_pci_system();
|
||||||
|
|
||||||
printf("Booted successfully v%d.%d.%d\n", version_major, version_minor, version_patch);
|
printf("Booted successfully v%d.%d.%d\n", version_major, version_minor, version_patch);
|
||||||
|
|
||||||
// initializing modules
|
|
||||||
init_execute_all();
|
|
||||||
|
|
||||||
// initialize tasking
|
// initialize tasking
|
||||||
task_init();
|
task_init();
|
||||||
kprint_start_task();
|
// let other system provide tasks (command, kprint, blockdev)
|
||||||
block_dev_start_task();
|
init_execute_all(INIT_STAGE_PRE_TASKING);
|
||||||
#ifdef K_SHELL
|
|
||||||
task_spawn(main_loop, NULL, "main");
|
|
||||||
#endif
|
|
||||||
// switch to tasking
|
// switch to tasking
|
||||||
syscall_start_scheduler();
|
syscall_start_scheduler();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,12 +9,13 @@
|
|||||||
#include <myke/libk/kprint.h>
|
#include <myke/libk/kprint.h>
|
||||||
#include <myke/tasks/task.h>
|
#include <myke/tasks/task.h>
|
||||||
#include <myke/util/stream.h>
|
#include <myke/util/stream.h>
|
||||||
|
#include <myke/util/init.h>
|
||||||
|
|
||||||
#define MAX_HANDLERS 8
|
#define MAX_HANDLERS 8
|
||||||
#define STREAM_SIZE (32*1024)
|
#define STREAM_SIZE (32*1024)
|
||||||
#define PRINT_BUFFER_SIZE 64
|
#define PRINT_BUFFER_SIZE 64
|
||||||
|
|
||||||
stream_t *kprint_stream;
|
stream_t *kprint_stream = NULL;
|
||||||
|
|
||||||
kprint_handler handlers[MAX_HANDLERS] = {0};
|
kprint_handler handlers[MAX_HANDLERS] = {0};
|
||||||
|
|
||||||
@@ -29,7 +30,11 @@ void kprint_register(kprint_handler handler) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void kprint(const char *msg) {
|
void kprint(const char *msg) {
|
||||||
stream_write(kprint_stream, (const uint8_t *) msg, strlen(msg));
|
if (kprint_stream == NULL) {
|
||||||
|
kprint_sync(msg);
|
||||||
|
} else {
|
||||||
|
stream_write(kprint_stream, (const uint8_t *) msg, strlen(msg));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void kprint_internal(const char *msg) {
|
void kprint_internal(const char *msg) {
|
||||||
@@ -65,4 +70,10 @@ void att_noreturn kprint_task(void *_) {
|
|||||||
|
|
||||||
void kprint_start_task() {
|
void kprint_start_task() {
|
||||||
task_spawn(kprint_task, NULL, "kprint");
|
task_spawn(kprint_task, NULL, "kprint");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
INIT_FUNCTION(100) = {
|
||||||
|
.name = "kprint-task",
|
||||||
|
.stage = INIT_STAGE_PRE_TASKING,
|
||||||
|
.init = kprint_start_task,
|
||||||
|
};
|
||||||
|
|||||||
@@ -725,7 +725,7 @@ void free(void *ptr) {
|
|||||||
|
|
||||||
|
|
||||||
void *calloc(size_t nobj, size_t size) {
|
void *calloc(size_t nobj, size_t size) {
|
||||||
int real_size;
|
size_t real_size;
|
||||||
void *p;
|
void *p;
|
||||||
|
|
||||||
real_size = nobj * size;
|
real_size = nobj * size;
|
||||||
|
|||||||
@@ -10,9 +10,12 @@ extern struct init __stop_init[];
|
|||||||
#define NUM_DRIVERS ((size_t)(__stop_init - __start_init))
|
#define NUM_DRIVERS ((size_t)(__stop_init - __start_init))
|
||||||
#define DRIVER(i) ((__start_init) + (i))
|
#define DRIVER(i) ((__start_init) + (i))
|
||||||
|
|
||||||
void init_execute_all() {
|
void init_execute_all(enum init_stage stage) {
|
||||||
for (size_t i = 0; i < NUM_DRIVERS; ++i) {
|
for (size_t i = 0; i < NUM_DRIVERS; ++i) {
|
||||||
printf("init %s\n", DRIVER(i)->name);
|
if (DRIVER(i)->stage != stage) continue;
|
||||||
|
if (stage > INIT_STAGE_EARLY_BOOT_0) {
|
||||||
|
printf("init %s\n", DRIVER(i)->name);
|
||||||
|
}
|
||||||
DRIVER(i)->init();
|
DRIVER(i)->init();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -11,6 +11,7 @@
|
|||||||
#include <myke/libk/libk.h>
|
#include <myke/libk/libk.h>
|
||||||
#include <myke/tasks/locking.h>
|
#include <myke/tasks/locking.h>
|
||||||
#include <myke/tasks/task.h>
|
#include <myke/tasks/task.h>
|
||||||
|
#include <myke/util/init.h>
|
||||||
|
|
||||||
#define MAX_BLOCK_DEVS 64
|
#define MAX_BLOCK_DEVS 64
|
||||||
|
|
||||||
@@ -142,4 +143,10 @@ void block_dev_print_info() {
|
|||||||
block_devices[i].identifier,
|
block_devices[i].identifier,
|
||||||
block_devices[i].flags.driver_installed ? block_devices[i].driver->name : "n/a");
|
block_devices[i].flags.driver_installed ? block_devices[i].driver->name : "n/a");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
INIT_FUNCTION(100) = {
|
||||||
|
.name = "blockdev-task",
|
||||||
|
.stage = INIT_STAGE_PRE_TASKING,
|
||||||
|
.init = block_dev_start_task,
|
||||||
|
};
|
||||||
|
|||||||
@@ -9,5 +9,6 @@ void tmpfs_init() {
|
|||||||
|
|
||||||
INIT_FUNCTION(100) = {
|
INIT_FUNCTION(100) = {
|
||||||
.name = "tmpfs",
|
.name = "tmpfs",
|
||||||
|
.stage = INIT_STAGE_AFTER_BOOT_PRE_INIT,
|
||||||
.init = tmpfs_init,
|
.init = tmpfs_init,
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user