Graphics mode & linear framebuffer update #1
3
grub.cfg
3
grub.cfg
@@ -1,4 +1,5 @@
|
|||||||
menuentry "Blank OS" {
|
menuentry "Blank OS" {
|
||||||
multiboot /boot/kernel.elf
|
set gfxpayload=1024x768x32
|
||||||
|
multiboot2 /boot/kernel.elf
|
||||||
boot
|
boot
|
||||||
}
|
}
|
||||||
|
|||||||
15
link.ld
15
link.ld
@@ -1,28 +1,27 @@
|
|||||||
ENTRY(loader)
|
ENTRY(loader)
|
||||||
|
|
||||||
SECTIONS {
|
SECTIONS {
|
||||||
/* Address to load at; 1MB */
|
/* Address to load at; 2MB */
|
||||||
|
|
||||||
. = 0x00100000;
|
/*. = 2M;*/
|
||||||
|
|
||||||
.__mbHeader : {
|
.multiboot_header ALIGN(4K) : {
|
||||||
*(.__mbHeader)
|
*(.multiboot_header)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Align relevant sections at 4KB */
|
/* Align relevant sections at 4KB */
|
||||||
|
|
||||||
.text ALIGN (0x1000) :
|
.text ALIGN (4K) :
|
||||||
{
|
{
|
||||||
*(.text)
|
*(.text)
|
||||||
*(.rodata)
|
*(.rodata)
|
||||||
}
|
}
|
||||||
|
|
||||||
.data ALIGN (0x1000) :
|
.data ALIGN (4K) :
|
||||||
{
|
{
|
||||||
*(.data)
|
*(.data)
|
||||||
}
|
}
|
||||||
|
|
||||||
.bss ALIGN (0x1000) :
|
.bss ALIGN (4K) :
|
||||||
{
|
{
|
||||||
*(COMMON)
|
*(COMMON)
|
||||||
*(.bss)
|
*(.bss)
|
||||||
|
|||||||
@@ -5,6 +5,25 @@
|
|||||||
#include "system.h"
|
#include "system.h"
|
||||||
#include "paging.h"
|
#include "paging.h"
|
||||||
#include "../drivers/ata.h"
|
#include "../drivers/ata.h"
|
||||||
|
#include "../libc/stdint.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t type;
|
||||||
|
uint32_t size;
|
||||||
|
uint64_t framebuffer_addr;
|
||||||
|
uint32_t framebuffer_pitch;
|
||||||
|
uint32_t framebuffer_width;
|
||||||
|
uint32_t framebuffer_height;
|
||||||
|
uint8_t framebuffer_bpp;
|
||||||
|
uint8_t framebuffer_type;
|
||||||
|
uint16_t reserved;
|
||||||
|
} multiboot2_tag_framebuffer;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t total_size;
|
||||||
|
uint32_t reserved;
|
||||||
|
uint8_t tags[0];
|
||||||
|
} multiboot2_info;
|
||||||
|
|
||||||
char* ascii_title =
|
char* ascii_title =
|
||||||
"\n"
|
"\n"
|
||||||
@@ -17,10 +36,52 @@ char* ascii_title =
|
|||||||
|
|
||||||
unsigned int g_multiboot_info_address;
|
unsigned int g_multiboot_info_address;
|
||||||
|
|
||||||
void kmain(unsigned int multiboot_info_address)
|
void kmain(multiboot2_info *mb_info)
|
||||||
{
|
{
|
||||||
g_multiboot_info_address = multiboot_info_address;
|
|
||||||
|
|
||||||
|
multiboot2_tag_framebuffer *fb_info = NULL;
|
||||||
|
|
||||||
|
uint8_t *tags = mb_info->tags;
|
||||||
|
while (1) {
|
||||||
|
uint32_t tag_type = *((uint32_t*) tags);
|
||||||
|
uint32_t tag_size = *((uint32_t*) (tags + 4));
|
||||||
|
|
||||||
|
if (tag_type == 0) break;
|
||||||
|
if (tag_type == 8) {
|
||||||
|
fb_info = (multiboot2_tag_framebuffer*) tags;
|
||||||
|
}
|
||||||
|
|
||||||
|
tags += ((tag_size + 7) & ~7);
|
||||||
|
}
|
||||||
|
|
||||||
|
serial_printf(3, "Framebuffer Address: 0x%x\r\n", fb_info->framebuffer_addr);
|
||||||
|
serial_printf(3, "Framebuffer Width: %u\r\n", fb_info->framebuffer_width);
|
||||||
|
serial_printf(3, "Framebuffer Height: %u\r\n", fb_info->framebuffer_height);
|
||||||
|
serial_printf(3, "Framebuffer Pitch: %u\r\n", fb_info->framebuffer_pitch);
|
||||||
|
serial_printf(3, "Framebuffer BPP: %u\r\n", fb_info->framebuffer_bpp);
|
||||||
|
|
||||||
|
|
||||||
|
if (fb_info) {
|
||||||
|
log("Entered fb_info\r\n", 3);
|
||||||
|
uint32_t *framebuffer = (uint32_t *) fb_info->framebuffer_addr;
|
||||||
|
uint32_t width = fb_info->framebuffer_width;
|
||||||
|
uint32_t height = fb_info->framebuffer_height;
|
||||||
|
uint32_t pitch = fb_info->framebuffer_pitch;
|
||||||
|
uint32_t bpp = fb_info->framebuffer_bpp;
|
||||||
|
|
||||||
|
for (uint32_t y = 0; y < 100; y++) {
|
||||||
|
for (uint32_t x = 0; x < 100; x++) {
|
||||||
|
framebuffer[y * (pitch / 4) + x] = 0xFF0000; // Rouge
|
||||||
|
}
|
||||||
|
}
|
||||||
|
log("Drew to framebuffer.\r\n", 3);
|
||||||
|
}
|
||||||
|
puts("This should NOT work.");
|
||||||
|
|
||||||
|
while (1);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
init_serial();
|
init_serial();
|
||||||
log("serial connection established\n", 3);
|
log("serial connection established\n", 3);
|
||||||
gdt_install();
|
gdt_install();
|
||||||
@@ -51,4 +112,5 @@ void kmain(unsigned int multiboot_info_address)
|
|||||||
serial_printf(2, "%d\tinitialized keyboard handler", global_ticks);
|
serial_printf(2, "%d\tinitialized keyboard handler", global_ticks);
|
||||||
shell_install();
|
shell_install();
|
||||||
serial_printf(2, "%d\tstarted system shell", global_ticks);
|
serial_printf(2, "%d\tstarted system shell", global_ticks);
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,19 +1,45 @@
|
|||||||
global loader
|
global loader
|
||||||
|
|
||||||
section .__mbHeader
|
section .multiboot_header
|
||||||
|
|
||||||
align 0x4
|
align 8
|
||||||
section .text:
|
|
||||||
|
|
||||||
MAGIC_NUMBER equ 0x1BADB002 ; multiboot magic
|
; ASM macros
|
||||||
FLAGS equ 0x0
|
|
||||||
CHECKSUM equ -MAGIC_NUMBER
|
|
||||||
KERNEL_STACK_SIZE equ 4096
|
|
||||||
|
|
||||||
dd MAGIC_NUMBER
|
MAGIC_NUMBER equ 0xe85250d6 ; multiboot2 magic
|
||||||
|
FLAGS equ 0x0 ; 32-bit protected mode for i386
|
||||||
|
HEADER_LEN equ 44 ; Tags=2+2+4+4+4+4+2+2+4=28
|
||||||
|
CHECKSUM equ -(MAGIC_NUMBER + FLAGS + HEADER_LEN)
|
||||||
|
|
||||||
|
; Multiboot 2 header, according to specification (16bytes)
|
||||||
|
|
||||||
|
dd MAGIC_NUMBER ; dd = 4 bytes = 32bits = u32
|
||||||
dd FLAGS
|
dd FLAGS
|
||||||
|
dd HEADER_LEN
|
||||||
dd CHECKSUM
|
dd CHECKSUM
|
||||||
|
|
||||||
|
; Tags? (28bytes)
|
||||||
|
|
||||||
|
; Tag 1 : set graphics mode (only recommended, can be overriden by GRUB)
|
||||||
|
|
||||||
|
dw 5 ; 2
|
||||||
|
dw 0 ; 2
|
||||||
|
dd 20 ; 4
|
||||||
|
dd 1920 ; 4
|
||||||
|
dd 1080 ; 4
|
||||||
|
dd 32 ; 4
|
||||||
|
|
||||||
|
; End of tags
|
||||||
|
|
||||||
|
dw 0 ; 2
|
||||||
|
;dw 0 ; 2
|
||||||
|
dd 8 ; 4
|
||||||
|
|
||||||
|
; End of Multiboot 2 header
|
||||||
|
|
||||||
|
section .text:
|
||||||
|
|
||||||
|
KERNEL_STACK_SIZE equ 4096
|
||||||
extern kmain
|
extern kmain
|
||||||
|
|
||||||
loader:
|
loader:
|
||||||
|
|||||||
Reference in New Issue
Block a user