diff --git a/src/bootloader.asm b/src/bootloader.asm index 51227e9..66d70d7 100644 --- a/src/bootloader.asm +++ b/src/bootloader.asm @@ -10,7 +10,6 @@ mov sp, 0x7000 FIRST_PARTITION_SECTOR equ 2048 ; TODO Read MBR. STAGE_BUFFER_SEGMENT equ 0x0900 STAGE_BUFFER_OFFSET equ 0x0000 -KERNEL_BUFFER_SEGMENT equ 0x2000 jmp prepare_kernel @@ -39,9 +38,10 @@ root_start: dw 0 root_size: dw 0 data_start: dw 0 -kernel_filename: db 'KERNEL BIN' -kernel_cluster: dw 0 -kernel_buffer_offset: dw 0 +kernel_filename: db 'KERNEL BIN' +kernel_cluster: dw 0 +kernel_buffer_segment: dw 0x2000 +kernel_buffer_offset: dw 0 read_sectors: xor bx, bx @@ -192,7 +192,7 @@ load_kernel_cluster: add ax, [data_start] xor cx, cx mov cl, [bpb.sectors_per_cluster] - mov bx, KERNEL_BUFFER_SEGMENT + mov bx, [kernel_buffer_segment] mov es, bx mov di, [kernel_buffer_offset] call read_sectors @@ -201,6 +201,8 @@ load_kernel_cluster: shl ax, 9 ; * 512 add ax, [kernel_buffer_offset] mov [kernel_buffer_offset], ax + jnc find_next_kernel_cluster + add word [kernel_buffer_segment], 0x1000 find_next_kernel_cluster: xor bx, bx diff --git a/src/kernel/log.h b/src/kernel/log.h index 1770f1a..ec5dc91 100644 --- a/src/kernel/log.h +++ b/src/kernel/log.h @@ -1,7 +1,6 @@ #pragma once #include "src/kernel/stream.h" -#include "src/lib/memory.h" #include "src/lib/string.h" extern stream_t *kernel_log; @@ -15,58 +14,47 @@ extern stream_t *kernel_log; #define LOG_LEVEL_DATA 3 #define LOG_LEVEL_TRACE 4 +static uint64_t print_size; +static char print_buffer[512]; + #define PRINT(stream, fmt, ...) \ - do { \ - uint64_t _size = string_length(fmt) * 10; \ - char *_string = memory_allocate(_size); \ - _size = string_format(fmt, _size, _string, ##__VA_ARGS__); \ - stream->write(stream, _string, _size); \ - memory_free(_string); \ - } while (0); + print_size = string_format(fmt, sizeof(print_buffer) - 1, print_buffer, ##__VA_ARGS__); \ + stream->write(stream, print_buffer, print_size); #define PRINT_LN(stream, fmt, ...) \ - do { \ - uint64_t _size = string_length(fmt) * 10; \ - char *_string = memory_allocate(_size); \ - _size = string_format(fmt, _size, _string, ##__VA_ARGS__); \ - stream->write(stream, __func__, string_length(__func__)); \ - stream->write(stream, ": ", 2); \ - stream->write(stream, _string, _size); \ - stream->write(stream, "\n", 1); \ - memory_free(_string); \ - } while (0); + print_size = string_format(fmt, sizeof(print_buffer) - 1, print_buffer, ##__VA_ARGS__); \ + stream->write(stream, __func__, string_length(__func__)); \ + stream->write(stream, ": ", 2); \ + stream->write(stream, print_buffer, print_size); \ + stream->write(stream, "\n", 1); #define PRINT_VAL(stream, v, f) PRINT_LN(#v = f, v) -#define LOG_INFO(fmt, ...) \ - if (LOG_LEVEL >= LOG_LEVEL_INFO) \ - PRINT(kernel_log, fmt, ##__VA_ARGS__) -#define LOG_STEP(fmt, ...) \ - if (LOG_LEVEL >= LOG_LEVEL_STEP) \ - PRINT(kernel_log, fmt, ##__VA_ARGS__) -#define LOG_DATA(fmt, ...) \ - if (LOG_LEVEL >= LOG_LEVEL_DATA) \ - PRINT(kernel_log, fmt, ##__VA_ARGS__) -#define LOG_TRACE(fmt, ...) \ - if (LOG_LEVEL >= LOG_LEVEL_TRACE) \ - PRINT(kernel_log, fmt, ##__VA_ARGS__) +#define LOG(level, fmt, ...) \ + if (LOG_LEVEL >= level) { \ + PRINT(kernel_log, fmt, ##__VA_ARGS__) \ + } -#define LOG_LN_INFO(fmt, ...) \ - if (LOG_LEVEL >= LOG_LEVEL_INFO) \ - PRINT_LN(kernel_log, fmt, ##__VA_ARGS__) -#define LOG_LN_STEP(fmt, ...) \ - if (LOG_LEVEL >= LOG_LEVEL_STEP) \ - PRINT_LN(kernel_log, fmt, ##__VA_ARGS__) -#define LOG_LN_DATA(fmt, ...) \ - if (LOG_LEVEL >= LOG_LEVEL_DATA) \ - PRINT_LN(kernel_log, fmt, ##__VA_ARGS__) -#define LOG_LN_TRACE(fmt, ...) \ - if (LOG_LEVEL >= LOG_LEVEL_TRACE) \ - PRINT_LN(kernel_log, fmt, ##__VA_ARGS__) +#define LOG_LN(level, fmt, ...) \ + if (LOG_LEVEL >= level) { \ + PRINT_LN(kernel_log, fmt, ##__VA_ARGS__) \ + } -#define LOG_VAL_INFO(v, f) LOG_LN_INFO(#v "=" f, v) -#define LOG_VAL_STEP(v, f) LOG_LN_STEP(#v "=" f, v) -#define LOG_VAL_DATA(v, f) LOG_LN_DATA(#v "=" f, v) -#define LOG_VAL_TRACE(v, f) LOG_LN_TRACE(#v "=" f, v) +#define LOG_VAL(level, v, f) LOG_LN(level, #v "=" f, v) + +#define LOG_INFO(fmt, ...) LOG(LOG_LEVEL_INFO, fmt, ##__VA_ARGS__) +#define LOG_STEP(fmt, ...) LOG(LOG_LEVEL_STEP, fmt, ##__VA_ARGS__) +#define LOG_DATA(fmt, ...) LOG(LOG_LEVEL_DATA, fmt, ##__VA_ARGS__) +#define LOG_TRACE(fmt, ...) LOG(LOG_LEVEL_TRACE, fmt, ##__VA_ARGS__) + +#define LOG_LN_INFO(fmt, ...) LOG_LN(LOG_LEVEL_INFO, fmt, ##__VA_ARGS__) +#define LOG_LN_STEP(fmt, ...) LOG_LN(LOG_LEVEL_STEP, fmt, ##__VA_ARGS__) +#define LOG_LN_DATA(fmt, ...) LOG_LN(LOG_LEVEL_DATA, fmt, ##__VA_ARGS__) +#define LOG_LN_TRACE(fmt, ...) LOG_LN(LOG_LEVEL_TRACE, fmt, ##__VA_ARGS__) + +#define LOG_VAL_INFO(v, f) LOG_VAL(LOG_LEVEL_INFO, v, f) +#define LOG_VAL_STEP(v, f) LOG_VAL(LOG_LEVEL_STEP, v, f) +#define LOG_VAL_DATA(v, f) LOG_VAL(LOG_LEVEL_DATA, v, f) +#define LOG_VAL_TRACE(v, f) LOG_VAL(LOG_LEVEL_TRACE, v, f) void log_init(stream_t *log);