Merge pull request #12 from johndoe6345789/copilot/fix-font-8x8-warning

Remove console module entirely
This commit is contained in:
2025-12-28 19:48:08 +00:00
committed by GitHub
4 changed files with 2 additions and 322 deletions

View File

@@ -1,31 +0,0 @@
#ifndef METALOS_KERNEL_CONSOLE_H
#define METALOS_KERNEL_CONSOLE_H
#include <stdint.h>
// Simple framebuffer console for early boot messages
typedef struct {
uint32_t* framebuffer;
uint32_t width;
uint32_t height;
uint32_t pitch;
uint32_t x;
uint32_t y;
uint32_t fg_color;
uint32_t bg_color;
} Console;
// Initialize console with framebuffer
void console_init(uint32_t* fb, uint32_t width, uint32_t height, uint32_t pitch);
// Print functions
void console_putchar(char c);
void console_print(const char* str);
void console_println(const char* str);
void console_clear(void);
// Set colors (RGB)
void console_set_color(uint32_t fg, uint32_t bg);
#endif // METALOS_KERNEL_CONSOLE_H

View File

@@ -1,113 +0,0 @@
/*
* Simple framebuffer console for kernel messages
* Minimal implementation - just enough for debugging
*/
#include "kernel/console.h"
// Simple 8x8 bitmap font (ASCII characters 32-126)
// This is a minimal font representation
static const uint8_t font_8x8[96][8] = {
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // Space
{0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00}, // !
{0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // "
{0x36, 0x36, 0x7F, 0x36, 0x7F, 0x36, 0x36, 0x00}, // #
// ... (simplified - would need full 96 characters)
// For now, we'll render simple blocks for all chars
};
static Console console;
void console_init(uint32_t* fb, uint32_t width, uint32_t height, uint32_t pitch) {
console.framebuffer = fb;
console.width = width;
console.height = height;
console.pitch = pitch;
console.x = 0;
console.y = 0;
console.fg_color = 0xFFFFFFFF; // White
console.bg_color = 0x00000000; // Black
}
void console_clear(void) {
if (!console.framebuffer) return;
for (uint32_t y = 0; y < console.height; y++) {
for (uint32_t x = 0; x < console.width; x++) {
console.framebuffer[y * (console.pitch / 4) + x] = console.bg_color;
}
}
console.x = 0;
console.y = 0;
}
void console_set_color(uint32_t fg, uint32_t bg) {
console.fg_color = fg;
console.bg_color = bg;
}
// Draw a simple 8x8 character (simplified version)
static void draw_char(char c, uint32_t x, uint32_t y) {
if (!console.framebuffer) return;
if (x + 8 > console.width || y + 8 > console.height) return;
// For simplicity, just draw a simple pattern based on character
// In a real implementation, we'd use the font bitmap
for (int cy = 0; cy < 8; cy++) {
for (int cx = 0; cx < 8; cx++) {
uint32_t pixel_x = x + cx;
uint32_t pixel_y = y + cy;
// Simple algorithm: draw pixels based on char value
// This creates a unique pattern for each character
uint8_t pattern = (c + cy) & (1 << cx) ? 0xFF : 0x00;
uint32_t color = pattern ? console.fg_color : console.bg_color;
console.framebuffer[pixel_y * (console.pitch / 4) + pixel_x] = color;
}
}
}
void console_putchar(char c) {
if (!console.framebuffer) return;
if (c == '\n') {
console.x = 0;
console.y += 8;
if (console.y >= console.height) {
console.y = 0; // Wrap around (simplified scrolling)
}
return;
}
if (c == '\r') {
console.x = 0;
return;
}
draw_char(c, console.x, console.y);
console.x += 8;
if (console.x >= console.width) {
console.x = 0;
console.y += 8;
if (console.y >= console.height) {
console.y = 0; // Wrap around
}
}
}
void console_print(const char* str) {
if (!str) return;
while (*str) {
console_putchar(*str);
str++;
}
}
void console_println(const char* str) {
console_print(str);
console_putchar('\n');
}

View File

@@ -7,7 +7,6 @@
*/
#include "kernel/kernel.h"
#include "kernel/console.h"
/*
* Kernel main entry point
@@ -17,55 +16,36 @@
* Just set up hardware and jump to the QT6 app.
*/
void kernel_main(BootInfo* boot_info) {
// Initialize basic console output using framebuffer
console_init(
(uint32_t*)boot_info->framebuffer_base,
boot_info->framebuffer_width,
boot_info->framebuffer_height,
boot_info->framebuffer_pitch
);
console_clear();
console_print("MetalOS v0.1 - MINIMAL\n");
console_print("======================\n\n");
// Suppress unused parameter warning
(void)boot_info;
// TODO: Set up minimal page tables (identity mapped or simple offset)
console_print("[ ] Memory (identity map)\n");
// TODO: Set up IDT with only interrupts we need:
// - Keyboard/mouse (USB or PS/2)
// - Timer (for QT event loop)
// - GPU (if needed)
// That's it! Maybe 5 interrupt handlers total.
console_print("[ ] Interrupts (minimal)\n");
// TODO: Simple memory allocator (bump allocator is fine)
console_print("[ ] Heap (bump allocator)\n");
// TODO: Find RX 6600 GPU via PCI (hardcode vendor/device ID)
console_print("[ ] PCI (find GPU only)\n");
// TODO: Initialize GPU - minimal
// - Enable BAR
// - Init display pipeline
// - Set up framebuffer at 1920x1080 (hardcoded)
console_print("[ ] GPU (RX 6600, 1920x1080)\n");
// TODO: Initialize input
// Try PS/2 first (simpler!)
// Fall back to minimal USB XHCI if needed
console_print("[ ] Input (PS/2 or USB)\n");
// TODO: Jump directly to QT6 Hello World app
// No shell, no init, no fork/exec
// Just: jump to application entry point
console_print("[ ] Jump to QT6 app\n");
console_print("\nBooting app...\n");
// TODO: Replace this with jump to QT6 app
// For now, halt
console_print("ERROR: App not linked yet\n");
while(1) {
__asm__ volatile("hlt");

View File

@@ -1,156 +0,0 @@
/*
* Unit tests for console module
* Tests console initialization, color setting, and basic operations
*/
#include "test_framework.h"
#include <stdint.h>
#include <string.h>
#include <stdlib.h>
// Mock console structure (matching kernel/console.h)
typedef struct {
uint32_t* framebuffer;
uint32_t width;
uint32_t height;
uint32_t pitch;
uint32_t x;
uint32_t y;
uint32_t fg_color;
uint32_t bg_color;
} Console;
// Simplified console functions for unit testing
// In real implementation, these would be in a testable module
static Console test_console;
void mock_console_init(uint32_t* fb, uint32_t width, uint32_t height, uint32_t pitch) {
test_console.framebuffer = fb;
test_console.width = width;
test_console.height = height;
test_console.pitch = pitch;
test_console.x = 0;
test_console.y = 0;
test_console.fg_color = 0xFFFFFFFF; // White
test_console.bg_color = 0x00000000; // Black
}
void mock_console_set_color(uint32_t fg, uint32_t bg) {
test_console.fg_color = fg;
test_console.bg_color = bg;
}
void mock_console_clear(void) {
if (!test_console.framebuffer) return;
for (uint32_t y = 0; y < test_console.height; y++) {
for (uint32_t x = 0; x < test_console.width; x++) {
test_console.framebuffer[y * (test_console.pitch / 4) + x] = test_console.bg_color;
}
}
test_console.x = 0;
test_console.y = 0;
}
// Test: Console initialization
TEST(console_init) {
uint32_t* test_framebuffer = malloc(1920 * 1080 * sizeof(uint32_t));
ASSERT_NOT_NULL(test_framebuffer);
mock_console_init(test_framebuffer, 1920, 1080, 1920 * 4);
ASSERT_NOT_NULL(test_console.framebuffer);
ASSERT_EQ(test_console.width, 1920);
ASSERT_EQ(test_console.height, 1080);
ASSERT_EQ(test_console.pitch, 1920 * 4);
ASSERT_EQ(test_console.x, 0);
ASSERT_EQ(test_console.y, 0);
ASSERT_EQ(test_console.fg_color, 0xFFFFFFFF);
ASSERT_EQ(test_console.bg_color, 0x00000000);
free(test_framebuffer);
TEST_PASS();
}
// Test: Console color setting
TEST(console_set_color) {
uint32_t* test_framebuffer = malloc(1920 * 1080 * sizeof(uint32_t));
ASSERT_NOT_NULL(test_framebuffer);
mock_console_init(test_framebuffer, 1920, 1080, 1920 * 4);
mock_console_set_color(0xFF0000FF, 0x00FF00FF);
ASSERT_EQ(test_console.fg_color, 0xFF0000FF);
ASSERT_EQ(test_console.bg_color, 0x00FF00FF);
free(test_framebuffer);
TEST_PASS();
}
// Test: Console clear operation
TEST(console_clear) {
uint32_t* test_framebuffer = malloc(800 * 600 * sizeof(uint32_t));
ASSERT_NOT_NULL(test_framebuffer);
mock_console_init(test_framebuffer, 800, 600, 800 * 4);
mock_console_set_color(0xFFFFFFFF, 0x00112233);
// Set some position
test_console.x = 100;
test_console.y = 200;
mock_console_clear();
// Check that position is reset
ASSERT_EQ(test_console.x, 0);
ASSERT_EQ(test_console.y, 0);
// Check that first few pixels are background color
ASSERT_EQ(test_framebuffer[0], 0x00112233);
ASSERT_EQ(test_framebuffer[1], 0x00112233);
ASSERT_EQ(test_framebuffer[10], 0x00112233);
free(test_framebuffer);
TEST_PASS();
}
// Test: Console with NULL framebuffer (edge case)
TEST(console_null_framebuffer) {
mock_console_init(NULL, 1920, 1080, 1920 * 4);
ASSERT_NULL(test_console.framebuffer);
// Clear should handle NULL gracefully (no crash)
mock_console_clear();
TEST_PASS();
}
// Test: Console with small dimensions
TEST(console_small_dimensions) {
uint32_t* test_framebuffer = malloc(64 * 48 * sizeof(uint32_t));
ASSERT_NOT_NULL(test_framebuffer);
mock_console_init(test_framebuffer, 64, 48, 64 * 4);
ASSERT_EQ(test_console.width, 64);
ASSERT_EQ(test_console.height, 48);
free(test_framebuffer);
TEST_PASS();
}
// Main test runner
int main(void) {
test_init("Console Module");
RUN_TEST(console_init);
RUN_TEST(console_set_color);
RUN_TEST(console_clear);
RUN_TEST(console_null_framebuffer);
RUN_TEST(console_small_dimensions);
return test_summary();
}