From f5ff78ea0853eac8c020faf730fcf3c39ec2b090 Mon Sep 17 00:00:00 2001 From: Baptiste Wicht Date: Sun, 12 Jan 2014 13:55:03 +0100 Subject: [PATCH] Prepare VESA Support --- kernel/include/vesa.hpp | 45 +++++++++++++++++++++---------------- kernel/src/boot/boot_16.cpp | 20 +++++++++++++++++ 2 files changed, 46 insertions(+), 19 deletions(-) diff --git a/kernel/include/vesa.hpp b/kernel/include/vesa.hpp index 1d269d67..ab26c574 100644 --- a/kernel/include/vesa.hpp +++ b/kernel/include/vesa.hpp @@ -8,31 +8,35 @@ #ifndef VESA_H #define VESA_H +#ifndef CODE_16 +#include "stl/types.hpp" +#endif + namespace vesa { -struct vbe_info_block { - char[4] signature; //"VESA" +struct vbe_info_block_t { + char signature[4]; //"VESA" uint16_t version; // == 0x0300 for VBE 3.0 - uint16_t[2] oem_name_ptr; - uint8_t[4] capabilities; - uint16_t[2] video_modes_ptr; + uint16_t oem_name_ptr[2]; + uint8_t capabilities[4]; + uint16_t video_modes_ptr[2]; uint16_t total_memory; // as # of 64KB blocks //VBE 2.0 uint16_t oem_software_version; - uint16_t[2] vendor_name_ptr; - uint16_t[2] product_name_ptr; - uint16_t[2] product_revision_ptr; + uint16_t vendor_name_ptr[2]; + uint16_t product_name_ptr[2]; + uint16_t product_revision_ptr[2]; uint16_t vbe_af_version; - uint16_t[2] accelerator_video_modes_ptr; + uint16_t accelerator_video_modes_ptr[2]; - uint8_t[216] reserved; - uint8_t[256] oem_scratchpad; + uint8_t reserved[216]; + uint8_t oem_scratchpad[256]; } __attribute__((packed)); -static_assert(sizeof(vbe_info_block) == 512, "The size of a VBE info block is 512 bytes"); +static_assert(sizeof(vbe_info_block_t) == 512, "The size of a VBE info block is 512 bytes"); -struct mode_info_block { +struct mode_info_block_t { uint16_t mode_attributes; uint8_t window_a_attributes; uint8_t window_b_attributes; @@ -40,7 +44,7 @@ struct mode_info_block { uint16_t window_size; uint16_t segment_window_a; uint16_t segment_window_b; - uint16_t[2] window_position_function; + uint16_t window_position_function[2]; uint16_t pitch; //Bytes per scan line //OEM modes @@ -71,8 +75,8 @@ struct mode_info_block { //VBE 2.0+ - uint16_t[2] linear_video_buffer; //LFB (Linear Framebuffer) address - uint16_t[2] offscreen_memory; + uint16_t linear_video_buffer[2]; //LFB (Linear Framebuffer) address + uint16_t offscreen_memory[2]; uint16_t offscreen_memory_size; uint16_t bytes_per_scan_line; @@ -86,11 +90,14 @@ struct mode_info_block { uint8_t linear_blue_mask_position; uint8_t linear_reserved_mask_size; uint8_t linear_reserved_mask_position; - uint16_t[2] maximum_pixel_clock; - uint8_t[190] reserved; + uint16_t maximum_pixel_clock[2]; + uint8_t reserved_2[190]; } __attribute__((packed)); -static_assert(sizeof(mode_info_block) == 256, "The size of a mode info block is 256 bytes"); +static_assert(sizeof(mode_info_block_t) == 256, "The size of a mode info block is 256 bytes"); + +extern vbe_info_block_t vbe_info_block; +extern bool vesa_enabled; } //end of vesa namespace diff --git a/kernel/src/boot/boot_16.cpp b/kernel/src/boot/boot_16.cpp index c96e333c..c5ce8209 100644 --- a/kernel/src/boot/boot_16.cpp +++ b/kernel/src/boot/boot_16.cpp @@ -34,6 +34,11 @@ typedef uint64_t size_t; e820::bios_e820_entry e820::bios_e820_entries[e820::MAX_E820_ENTRIES]; int16_t e820::bios_e820_entry_count = 0; +#include "vesa.hpp" + +vesa::vbe_info_block_t vesa::vbe_info_block; +bool vesa::vesa_enabled = false; + namespace { struct gdt_ptr { @@ -101,6 +106,18 @@ void detect_memory(){ e820::bios_e820_entry_count = detect_memory_e820(); } +void setup_vesa(){ + uint16_t return_code; + asm volatile ("int 0x10" + : "=a"(return_code) + : "a"(0x4F00), "D"(&vesa::vbe_info_block)); + + if(return_code == 0x4F){ + vesa::vesa_enabled = true; + + } +} + void disable_interrupts(){ __asm__ __volatile__ ("cli"); } @@ -242,6 +259,9 @@ void __attribute__ ((noreturn)) rm_main(){ //Analyze memory detect_memory(); + //Enable VESA + setup_vesa(); + //Disable interrupts disable_interrupts();