mirror of
https://github.com/JannisHeydemann/BoredOS.git
synced 2026-05-30 10:26:59 +00:00
Merge branch 'BoredDevNL:main' into terminal-fix
This commit is contained in:
@@ -7,12 +7,13 @@ extern syscall_handler_c
|
||||
section .text
|
||||
|
||||
; Syscall ABI:
|
||||
; RDI = syscall_num
|
||||
; RSI = arg1
|
||||
; RDX = arg2
|
||||
; R10 = arg3
|
||||
; R8 = arg4
|
||||
; R9 = arg5
|
||||
; RAX = syscall_num
|
||||
; RDI = arg1
|
||||
; RSI = arg2
|
||||
; RDX = arg3
|
||||
; R10 = arg4
|
||||
; R8 = arg5
|
||||
; R9 = arg6
|
||||
|
||||
syscall_entry:
|
||||
swapgs
|
||||
|
||||
@@ -85,11 +85,16 @@ void kconsole_write(const char *s) {
|
||||
if (!s) return;
|
||||
|
||||
uint64_t flags = spinlock_acquire_irqsave(&console_lock);
|
||||
if (!kconsole_active) {
|
||||
spinlock_release_irqrestore(&console_lock, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
while (*s) {
|
||||
kconsole_putc_nolock(*s++);
|
||||
}
|
||||
|
||||
// Flip buffer after a write batch during boot
|
||||
// Flip once after a write batch to keep console updates coherent.
|
||||
graphics_flip_buffer();
|
||||
spinlock_release_irqrestore(&console_lock, flags);
|
||||
}
|
||||
|
||||
@@ -371,155 +371,3 @@ MemStats memory_get_stats(void) {
|
||||
|
||||
return stats;
|
||||
}
|
||||
|
||||
void memory_print_stats(void) {
|
||||
MemStats stats = memory_get_stats();
|
||||
|
||||
// Use CLI write functions - declare as extern
|
||||
extern void cmd_write(const char *str);
|
||||
extern void cmd_write_int(int n);
|
||||
extern void cmd_putchar(char c);
|
||||
|
||||
cmd_write("\n=== MEMORY STATISTICS ===\n");
|
||||
cmd_write("Total Memory: ");
|
||||
cmd_write_int(stats.total_memory / 1024);
|
||||
cmd_write(" KB\n");
|
||||
|
||||
cmd_write("Used Memory: ");
|
||||
cmd_write_int(stats.used_memory / 1024);
|
||||
cmd_write(" KB\n");
|
||||
|
||||
cmd_write("Available Memory: ");
|
||||
cmd_write_int(stats.available_memory / 1024);
|
||||
cmd_write(" KB\n");
|
||||
|
||||
cmd_write("Allocated Blocks: ");
|
||||
cmd_write_int(stats.allocated_blocks);
|
||||
cmd_write("\n");
|
||||
|
||||
cmd_write("Free Blocks: ");
|
||||
cmd_write_int(stats.free_blocks);
|
||||
cmd_write("\n");
|
||||
|
||||
cmd_write("Largest Free: ");
|
||||
cmd_write_int(stats.largest_free_block / 1024);
|
||||
cmd_write(" KB\n");
|
||||
|
||||
cmd_write("Peak Usage: ");
|
||||
cmd_write_int(stats.peak_memory_used / 1024);
|
||||
cmd_write(" KB\n");
|
||||
|
||||
cmd_write("Fragmentation: ");
|
||||
cmd_write_int(stats.fragmentation_percent);
|
||||
cmd_write("%\n");
|
||||
|
||||
cmd_write("Usage: ");
|
||||
int usage_percent = (stats.used_memory * 100) / stats.total_memory;
|
||||
cmd_write_int(usage_percent);
|
||||
cmd_write("%\n");
|
||||
|
||||
cmd_write("========================\n\n");
|
||||
}
|
||||
|
||||
void memory_print_detailed(void) {
|
||||
extern void cmd_write(const char *str);
|
||||
extern void cmd_write_int(int n);
|
||||
extern void cmd_putchar(char c);
|
||||
|
||||
cmd_write("\n=== DETAILED MEMORY BLOCKS ===\n");
|
||||
cmd_write("ID Address Size Status\n");
|
||||
cmd_write("------ -------- -------- --------\n");
|
||||
|
||||
for (int i = 0; i < block_count; i++) {
|
||||
if (block_list[i].size == 0) continue;
|
||||
|
||||
// ID
|
||||
cmd_write_int(block_list[i].allocation_id);
|
||||
cmd_write(" ");
|
||||
|
||||
// Address (simplified hex output)
|
||||
cmd_write("0x");
|
||||
cmd_write_int((uintptr_t)block_list[i].address / 1024);
|
||||
cmd_write(" ");
|
||||
|
||||
// Size
|
||||
cmd_write_int(block_list[i].size / 1024);
|
||||
cmd_write("KB ");
|
||||
|
||||
// Status
|
||||
if (block_list[i].allocated) {
|
||||
cmd_write("ALLOC\n");
|
||||
} else {
|
||||
cmd_write("FREE\n");
|
||||
}
|
||||
}
|
||||
|
||||
cmd_write("==============================\n\n");
|
||||
}
|
||||
|
||||
void memory_validate(void) {
|
||||
extern void cmd_write(const char *str);
|
||||
extern void cmd_write_int(int n);
|
||||
|
||||
int errors = 0;
|
||||
|
||||
// Check for overlapping blocks
|
||||
for (int i = 0; i < block_count; i++) {
|
||||
for (int j = i + 1; j < block_count; j++) {
|
||||
void *i_start = block_list[i].address;
|
||||
void *i_end = (uint8_t *)i_start + block_list[i].size;
|
||||
void *j_start = block_list[j].address;
|
||||
void *j_end = (uint8_t *)j_start + block_list[j].size;
|
||||
|
||||
if (i_start < j_end && i_end > j_start) {
|
||||
errors++;
|
||||
cmd_write("ERROR: Overlapping blocks detected!\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (errors == 0) {
|
||||
cmd_write("Memory validation: [OK]\n");
|
||||
} else {
|
||||
cmd_write("Memory validation failed with ");
|
||||
cmd_write_int(errors);
|
||||
cmd_write(" errors\n");
|
||||
}
|
||||
}
|
||||
|
||||
void memory_dump_blocks(void) {
|
||||
extern void cmd_write(const char *str);
|
||||
extern void cmd_write_int(int n);
|
||||
|
||||
cmd_write("\nMemory block dump:\n");
|
||||
cmd_write("Total blocks: ");
|
||||
cmd_write_int(block_count);
|
||||
cmd_write("\n");
|
||||
|
||||
memory_print_detailed();
|
||||
}
|
||||
|
||||
size_t memory_get_peak_usage(void) {
|
||||
return peak_allocated;
|
||||
}
|
||||
|
||||
void memory_reset_peak(void) {
|
||||
peak_allocated = total_allocated;
|
||||
}
|
||||
|
||||
bool memory_is_valid_ptr(void *ptr) {
|
||||
if (ptr == NULL) return false;
|
||||
|
||||
if (!initialized) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check if it's an allocated block
|
||||
for (int i = 0; i < block_count; i++) {
|
||||
if (block_list[i].allocated && block_list[i].address == ptr) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -47,16 +47,6 @@ void* krealloc(void *ptr, size_t new_size);
|
||||
|
||||
// Statistics and Information
|
||||
MemStats memory_get_stats(void);
|
||||
void memory_print_stats(void);
|
||||
void memory_print_detailed(void);
|
||||
|
||||
void memory_validate(void);
|
||||
void memory_dump_blocks(void);
|
||||
|
||||
// Internal utilities
|
||||
size_t memory_get_peak_usage(void);
|
||||
void memory_reset_peak(void);
|
||||
bool memory_is_valid_ptr(void *ptr);
|
||||
|
||||
void mem_memset(void *dest, int val, size_t len);
|
||||
void mem_memcpy(void *dest, const void *src, size_t len);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user