Remove src-old
This commit is contained in:
parent
8278c4211b
commit
12067b8e1a
@ -1,18 +0,0 @@
|
|||||||
.global hos_start
|
|
||||||
.type hos_start, @function
|
|
||||||
hos_start:
|
|
||||||
/* Set stack pointer. */
|
|
||||||
mov $_stack_end, %esp
|
|
||||||
|
|
||||||
/* Jump to C. */
|
|
||||||
push $0
|
|
||||||
push $0
|
|
||||||
push $0
|
|
||||||
push %ebx
|
|
||||||
call hos_main
|
|
||||||
|
|
||||||
cli
|
|
||||||
1: hlt
|
|
||||||
jmp 1b
|
|
||||||
|
|
||||||
.size hos_start, . - hos_start
|
|
116
src-old/fb.c
116
src-old/fb.c
@ -1,116 +0,0 @@
|
|||||||
#include "fb.h"
|
|
||||||
#include <stddef.h>
|
|
||||||
#include "mem.h"
|
|
||||||
|
|
||||||
static struct {
|
|
||||||
uint32_t * addr;
|
|
||||||
uint32_t width;
|
|
||||||
uint32_t height;
|
|
||||||
uint32_t pitch;
|
|
||||||
} fb;
|
|
||||||
|
|
||||||
static inline uint32_t build_pixel(uint8_t r, uint8_t g, uint8_t b)
|
|
||||||
{
|
|
||||||
return (r << 16u) | (g << 8u) | b;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void fb_set_pixel(int x, int y, uint8_t r, uint8_t g, uint8_t b)
|
|
||||||
{
|
|
||||||
fb.addr[fb.pitch * y + x] = build_pixel(r, g, b);
|
|
||||||
}
|
|
||||||
|
|
||||||
void fb_clear(void)
|
|
||||||
{
|
|
||||||
memset32(fb.addr, 0u, fb.pitch * fb.height);
|
|
||||||
}
|
|
||||||
|
|
||||||
void fb_init(uint32_t * addr, uint32_t width, uint32_t height, uint32_t pitch)
|
|
||||||
{
|
|
||||||
fb.addr = addr;
|
|
||||||
fb.width = width;
|
|
||||||
fb.height = height;
|
|
||||||
fb.pitch = pitch / 4u;
|
|
||||||
fb_clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t * fb_addr(void)
|
|
||||||
{
|
|
||||||
return fb.addr;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool fb_ready(void)
|
|
||||||
{
|
|
||||||
return fb.addr != NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t fb_width(void)
|
|
||||||
{
|
|
||||||
return fb.width;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t fb_height(void)
|
|
||||||
{
|
|
||||||
return fb.height;
|
|
||||||
}
|
|
||||||
|
|
||||||
void fb_blend_alpha8(const uint8_t * bitmap, int width, int height, int pitch, int x, int y, uint8_t r, uint8_t g, uint8_t b)
|
|
||||||
{
|
|
||||||
if (((x + width) <= 0) || (x >= (int)fb.width) || ((y + height) <= 0) || (y >= (int)fb.height))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (x < 0)
|
|
||||||
{
|
|
||||||
width += x;
|
|
||||||
bitmap += (-x);
|
|
||||||
x = 0;
|
|
||||||
}
|
|
||||||
if (y < 0)
|
|
||||||
{
|
|
||||||
height += y;
|
|
||||||
bitmap += ((-y) * pitch);
|
|
||||||
y = 0;
|
|
||||||
}
|
|
||||||
if ((x + width) > (int)fb.width)
|
|
||||||
{
|
|
||||||
width = (int)fb.width - x;
|
|
||||||
}
|
|
||||||
if ((y + height) > (int)fb.height)
|
|
||||||
{
|
|
||||||
height = (int)fb.height - y;
|
|
||||||
}
|
|
||||||
uint32_t * target = &fb.addr[fb.pitch * y + x];
|
|
||||||
for (int row = 0; row < height; row++)
|
|
||||||
{
|
|
||||||
for (int col = 0; col < width; col++)
|
|
||||||
{
|
|
||||||
uint32_t alpha = bitmap[col];
|
|
||||||
uint32_t current_pixel = target[col];
|
|
||||||
uint8_t cr = (current_pixel >> 16u) & 0xFFu;
|
|
||||||
uint8_t cg = (current_pixel >> 8u) & 0xFFu;
|
|
||||||
uint8_t cb = current_pixel & 0xFFu;
|
|
||||||
uint8_t pr = alpha * r / 255u;
|
|
||||||
uint8_t pg = alpha * g / 255u;
|
|
||||||
uint8_t pb = alpha * b / 255u;
|
|
||||||
uint32_t current_alpha = 255u - alpha;
|
|
||||||
uint32_t pixel = build_pixel(
|
|
||||||
pr + current_alpha * cr / 255u,
|
|
||||||
pg + current_alpha * cg / 255u,
|
|
||||||
pb + current_alpha * cb / 255u);
|
|
||||||
target[col] = pixel;
|
|
||||||
}
|
|
||||||
bitmap += pitch;
|
|
||||||
target += fb.pitch;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void fb_fill(int x, int y, int width, int height, uint8_t r, uint8_t g, uint8_t b)
|
|
||||||
{
|
|
||||||
uint32_t * target = &fb.addr[fb.pitch * y + x];
|
|
||||||
uint32_t pixel = build_pixel(r, g, b);
|
|
||||||
for (int row = 0; row < height; row++)
|
|
||||||
{
|
|
||||||
memset32(target, pixel, width);
|
|
||||||
target += fb.pitch;
|
|
||||||
}
|
|
||||||
}
|
|
16
src-old/fb.h
16
src-old/fb.h
@ -1,16 +0,0 @@
|
|||||||
#ifndef FB_H
|
|
||||||
#define FB_H
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
void fb_init(uint32_t * addr, uint32_t width, uint32_t height, uint32_t pitch);
|
|
||||||
bool fb_ready(void);
|
|
||||||
uint32_t * fb_addr(void);
|
|
||||||
uint32_t fb_width(void);
|
|
||||||
uint32_t fb_height(void);
|
|
||||||
void fb_blend_alpha8(const uint8_t * bitmap, int width, int height, int pitch, int x, int y, uint8_t r, uint8_t g, uint8_t b);
|
|
||||||
void fb_fill(int x, int y, int width, int height, uint8_t r, uint8_t g, uint8_t b);
|
|
||||||
void fb_clear(void);
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,11 +0,0 @@
|
|||||||
#include "fb_text.h"
|
|
||||||
#include "kfont.h"
|
|
||||||
#include "fb.h"
|
|
||||||
|
|
||||||
void fb_text_render_char(int c, int x, int y, uint8_t r, uint8_t g, uint8_t b)
|
|
||||||
{
|
|
||||||
const fontgen_char_info_t * char_info = kfont.char_infos[c];
|
|
||||||
y += kfont.line_height - kfont.baseline_offset - char_info->top;
|
|
||||||
x += char_info->left;
|
|
||||||
fb_blend_alpha8(char_info->bitmap, char_info->width, char_info->height, char_info->width, x, y, r, g, b);
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
#ifndef FB_TEXT_H
|
|
||||||
#define FB_TEXT_H
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
void fb_text_render_char(int c, int x, int y, uint8_t r, uint8_t g, uint8_t b);
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,16 +0,0 @@
|
|||||||
.global gdt_set
|
|
||||||
.extern gdtr
|
|
||||||
.type gdt_set, @function
|
|
||||||
gdt_set:
|
|
||||||
lgdt gdtr
|
|
||||||
jmp $0x8, $gdt_set_reload
|
|
||||||
gdt_set_reload:
|
|
||||||
mov $0x10, %ax
|
|
||||||
mov %ax, %ds
|
|
||||||
mov %ax, %es
|
|
||||||
mov %ax, %fs
|
|
||||||
mov %ax, %gs
|
|
||||||
mov %ax, %ss
|
|
||||||
ret
|
|
||||||
|
|
||||||
.size gdt_set, . - gdt_set
|
|
@ -1,20 +0,0 @@
|
|||||||
#include "gdt.h"
|
|
||||||
|
|
||||||
static const gdt_entry_t gdt_entries[] = {
|
|
||||||
/* Null descriptor */
|
|
||||||
0u,
|
|
||||||
/* Code segment for kernel */
|
|
||||||
gdt_build_entry(0u, 0xFFFFFu, 1u, 0u, 1u, 1u, 0u, 1u, 0u, 1u, 1u, 0u),
|
|
||||||
/* Data segment for kernel */
|
|
||||||
gdt_build_entry(0u, 0xFFFFFu, 1u, 0u, 1u, 0u, 0u, 1u, 0u, 1u, 1u, 0u),
|
|
||||||
};
|
|
||||||
|
|
||||||
gdtr_t gdtr;
|
|
||||||
|
|
||||||
void gdt_init(void)
|
|
||||||
{
|
|
||||||
gdtr.size = sizeof(gdt_entries);
|
|
||||||
gdtr.offset_lower = (uintptr_t)gdt_entries & 0xFFFFu;
|
|
||||||
gdtr.offset_upper = (uintptr_t)gdt_entries >> 16u;
|
|
||||||
gdt_set();
|
|
||||||
}
|
|
@ -1,34 +0,0 @@
|
|||||||
#ifndef GDT_H
|
|
||||||
#define GDT_H
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint16_t size;
|
|
||||||
uint16_t offset_lower;
|
|
||||||
uint16_t offset_upper;
|
|
||||||
uint16_t _reserved;
|
|
||||||
} gdtr_t;
|
|
||||||
|
|
||||||
typedef uint64_t gdt_entry_t;
|
|
||||||
#define gdt_build_entry(base, limit, pr, privl, s, ex, dc, rw, ac, gr, sz, l) \
|
|
||||||
(gdt_entry_t)( \
|
|
||||||
(((gdt_entry_t)base << 32) & 0xFF00000000000000ull) | /* Base 0:15 */ \
|
|
||||||
(((gdt_entry_t)gr & 0x1u) << 55) | /* Granularity (0 = bytes, 1 = blocks) */ \
|
|
||||||
(((gdt_entry_t)sz & 0x1u) << 54) | /* Size (0 = 16-bit, 1 = 32-bit) */ \
|
|
||||||
(((gdt_entry_t)l & 0x1u) << 53) | /* L flag (x86_64 code) */ \
|
|
||||||
(((gdt_entry_t)limit << 32) & 0x000F000000000000ull) | /* Limit 16:19 */ \
|
|
||||||
(((gdt_entry_t)pr & 0x1u) << 47) | /* Present flag */ \
|
|
||||||
(((gdt_entry_t)privl & 0x3u) << 45) | /* Privilege (ring level) */ \
|
|
||||||
(((gdt_entry_t)s & 0x1u) << 44) | /* Type (0 = system, 1 = code/data) */ \
|
|
||||||
(((gdt_entry_t)ex & 0x1u) << 43) | /* Executable flag */ \
|
|
||||||
(((gdt_entry_t)dc & 0x1u) << 42) | /* Direction/Conforming */ \
|
|
||||||
(((gdt_entry_t)rw & 0x1u) << 41) | /* Readable/Writable */ \
|
|
||||||
(((gdt_entry_t)ac & 0x1u) << 40) | /* Accessed flag */ \
|
|
||||||
(((gdt_entry_t)base << 16) & 0x000000FFFFFF0000ull) | /* Base 0:23 */ \
|
|
||||||
((gdt_entry_t)limit & 0x000000000000FFFFull)) /* Limit 0:15 */
|
|
||||||
|
|
||||||
void gdt_init(void);
|
|
||||||
void gdt_set(void);
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,25 +0,0 @@
|
|||||||
#include <stdint.h>
|
|
||||||
#include "fb.h"
|
|
||||||
#include "mbinfo.h"
|
|
||||||
#include "klog.h"
|
|
||||||
#include "gdt.h"
|
|
||||||
#include "mm.h"
|
|
||||||
|
|
||||||
void hos_main(uint32_t mbinfo_addr)
|
|
||||||
{
|
|
||||||
gdt_init();
|
|
||||||
if (!mbinfo_init(mbinfo_addr))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!fb_ready())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
klog_init();
|
|
||||||
klog_printf("Welcome to HOS!\n");
|
|
||||||
mm_init();
|
|
||||||
mbinfo_load();
|
|
||||||
klog_printf("Found %dKB of usable RAM\n", mm_get_total_ram() / 1024u);
|
|
||||||
klog_printf("Kernel is %dKB at 0x%x\n", mm_get_kernel_size() / 1024u, mm_get_kernel_address());
|
|
||||||
}
|
|
@ -1,281 +0,0 @@
|
|||||||
#include "hos_printf.h"
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include "string.h"
|
|
||||||
|
|
||||||
static size_t format_dec(char * buffer, int32_t v)
|
|
||||||
{
|
|
||||||
size_t sz = 0u;
|
|
||||||
bool printing = false;
|
|
||||||
if (v < 0)
|
|
||||||
{
|
|
||||||
buffer[sz++] = '-';
|
|
||||||
v = -v;
|
|
||||||
}
|
|
||||||
for (int32_t div = 1000000000; div >= 1; div /= 10)
|
|
||||||
{
|
|
||||||
int32_t digit = v / div;
|
|
||||||
v %= div;
|
|
||||||
if ((digit != 0) || (div == 1))
|
|
||||||
{
|
|
||||||
printing = true;
|
|
||||||
}
|
|
||||||
if (printing)
|
|
||||||
{
|
|
||||||
buffer[sz++] = digit + '0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return sz;
|
|
||||||
}
|
|
||||||
|
|
||||||
static size_t format_dec64(char * buffer, int64_t v)
|
|
||||||
{
|
|
||||||
size_t sz = 0u;
|
|
||||||
bool printing = false;
|
|
||||||
if (v < 0)
|
|
||||||
{
|
|
||||||
buffer[sz++] = '-';
|
|
||||||
v = -v;
|
|
||||||
}
|
|
||||||
for (int64_t div = 1000000000000000000; div >= 1; div /= 10)
|
|
||||||
{
|
|
||||||
int64_t digit = v / div;
|
|
||||||
v %= div;
|
|
||||||
if ((digit != 0) || (div == 1))
|
|
||||||
{
|
|
||||||
printing = true;
|
|
||||||
}
|
|
||||||
if (printing)
|
|
||||||
{
|
|
||||||
buffer[sz++] = digit + '0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return sz;
|
|
||||||
}
|
|
||||||
|
|
||||||
static size_t format_udec(char * buffer, int32_t v)
|
|
||||||
{
|
|
||||||
size_t sz = 0u;
|
|
||||||
for (int32_t div = 1000000000u; div >= 1u; div /= 10u)
|
|
||||||
{
|
|
||||||
int32_t digit = v / div;
|
|
||||||
v %= div;
|
|
||||||
if ((digit != 0) || (sz > 0u) || (div == 1))
|
|
||||||
{
|
|
||||||
buffer[sz++] = digit + '0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return sz;
|
|
||||||
}
|
|
||||||
|
|
||||||
static size_t format_udec64(char * buffer, uint64_t v)
|
|
||||||
{
|
|
||||||
size_t sz = 0u;
|
|
||||||
for (uint64_t div = 10000000000000000000u; div >= 1u; div /= 10u)
|
|
||||||
{
|
|
||||||
uint64_t digit = v / div;
|
|
||||||
v %= div;
|
|
||||||
if ((digit != 0) || (sz > 0u) || (div == 1))
|
|
||||||
{
|
|
||||||
buffer[sz++] = digit + '0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return sz;
|
|
||||||
}
|
|
||||||
|
|
||||||
static size_t format_hex(char * buffer, uint32_t v, bool upper)
|
|
||||||
{
|
|
||||||
const char upper_hex[] = "0123456789ABCDEF";
|
|
||||||
const char lower_hex[] = "0123456789abcdef";
|
|
||||||
size_t sz = 0u;
|
|
||||||
for (int i = 28; i >= 0; i -= 4)
|
|
||||||
{
|
|
||||||
uint8_t n = (v >> i) & 0xFu;
|
|
||||||
if ((sz > 0u) || (n != 0u) || (i == 0))
|
|
||||||
{
|
|
||||||
buffer[sz] = upper ? upper_hex[n] : lower_hex[n];
|
|
||||||
sz++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return sz;
|
|
||||||
}
|
|
||||||
|
|
||||||
static size_t format_hex64(char * buffer, uint64_t v, bool upper)
|
|
||||||
{
|
|
||||||
const char upper_hex[] = "0123456789ABCDEF";
|
|
||||||
const char lower_hex[] = "0123456789abcdef";
|
|
||||||
size_t sz = 0u;
|
|
||||||
for (int i = 60; i >= 0; i -= 4)
|
|
||||||
{
|
|
||||||
uint8_t n = (v >> i) & 0xFu;
|
|
||||||
if ((sz > 0u) || (n != 0u) || (i == 0))
|
|
||||||
{
|
|
||||||
buffer[sz] = upper ? upper_hex[n] : lower_hex[n];
|
|
||||||
sz++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return sz;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void pad_write(const stream_t * stream, const char * data, size_t length, bool leading_zero, bool left_just, size_t width)
|
|
||||||
{
|
|
||||||
if (left_just)
|
|
||||||
{
|
|
||||||
stream->write(data, length);
|
|
||||||
while (length < width)
|
|
||||||
{
|
|
||||||
stream->write1(' ');
|
|
||||||
length++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
char fill = leading_zero ? '0' : ' ';
|
|
||||||
size_t l = length;
|
|
||||||
while (l < width)
|
|
||||||
{
|
|
||||||
stream->write1(fill);
|
|
||||||
l++;
|
|
||||||
}
|
|
||||||
stream->write(data, length);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void hos_vprintf(const stream_t * stream, const char * fmt, va_list va)
|
|
||||||
{
|
|
||||||
bool in_conv = false;
|
|
||||||
char c;
|
|
||||||
char buffer[22];
|
|
||||||
size_t width;
|
|
||||||
bool leading_zero;
|
|
||||||
bool left_just;
|
|
||||||
bool long_flag;
|
|
||||||
size_t length;
|
|
||||||
while ((c = *fmt))
|
|
||||||
{
|
|
||||||
if (in_conv)
|
|
||||||
{
|
|
||||||
switch (c)
|
|
||||||
{
|
|
||||||
case '%':
|
|
||||||
stream->write1('%');
|
|
||||||
break;
|
|
||||||
case 'X':
|
|
||||||
{
|
|
||||||
if (long_flag)
|
|
||||||
{
|
|
||||||
uint64_t v = va_arg(va, uint64_t);
|
|
||||||
length = format_hex(buffer, v, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
uint32_t v = va_arg(va, uint32_t);
|
|
||||||
length = format_hex(buffer, v, true);
|
|
||||||
}
|
|
||||||
pad_write(stream, buffer, length, leading_zero, left_just, width);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'c':
|
|
||||||
{
|
|
||||||
char ch = va_arg(va, int);
|
|
||||||
pad_write(stream, &ch, 1u, leading_zero, left_just, width);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'd':
|
|
||||||
{
|
|
||||||
if (long_flag)
|
|
||||||
{
|
|
||||||
int64_t v = va_arg(va, int64_t);
|
|
||||||
length = format_dec64(buffer, v);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int32_t v = va_arg(va, int32_t);
|
|
||||||
length = format_dec(buffer, v);
|
|
||||||
}
|
|
||||||
pad_write(stream, buffer, length, leading_zero, left_just, width);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 's':
|
|
||||||
{
|
|
||||||
const char * s = va_arg(va, const char *);
|
|
||||||
pad_write(stream, s, strlen(s), leading_zero, left_just, width);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'u':
|
|
||||||
{
|
|
||||||
if (long_flag)
|
|
||||||
{
|
|
||||||
uint64_t v = va_arg(va, uint64_t);
|
|
||||||
length = format_udec64(buffer, v);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
uint32_t v = va_arg(va, uint32_t);
|
|
||||||
length = format_udec(buffer, v);
|
|
||||||
}
|
|
||||||
pad_write(stream, buffer, length, leading_zero, left_just, width);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'x':
|
|
||||||
{
|
|
||||||
if (long_flag)
|
|
||||||
{
|
|
||||||
uint64_t v = va_arg(va, uint64_t);
|
|
||||||
length = format_hex64(buffer, v, false);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
uint32_t v = va_arg(va, uint32_t);
|
|
||||||
length = format_hex(buffer, v, false);
|
|
||||||
}
|
|
||||||
pad_write(stream, buffer, length, leading_zero, left_just, width);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
in_conv = false;
|
|
||||||
}
|
|
||||||
else if (c == '%')
|
|
||||||
{
|
|
||||||
in_conv = true;
|
|
||||||
width = 0u;
|
|
||||||
leading_zero = false;
|
|
||||||
left_just = false;
|
|
||||||
long_flag = false;
|
|
||||||
if (fmt[1] == '-')
|
|
||||||
{
|
|
||||||
left_just = true;
|
|
||||||
fmt++;
|
|
||||||
}
|
|
||||||
if (fmt[1] == '0')
|
|
||||||
{
|
|
||||||
leading_zero = true;
|
|
||||||
fmt++;
|
|
||||||
}
|
|
||||||
while (('0' <= fmt[1]) && (fmt[1] <= '9'))
|
|
||||||
{
|
|
||||||
width *= 10u;
|
|
||||||
width += (fmt[1] - '0');
|
|
||||||
fmt++;
|
|
||||||
}
|
|
||||||
if (fmt[1] == 'l')
|
|
||||||
{
|
|
||||||
long_flag = true;
|
|
||||||
fmt++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
stream->write1(c);
|
|
||||||
}
|
|
||||||
fmt++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void hos_printf(const stream_t * stream, const char * fmt, ...)
|
|
||||||
{
|
|
||||||
va_list va;
|
|
||||||
va_start(va, fmt);
|
|
||||||
hos_vprintf(stream, fmt, va);
|
|
||||||
va_end(va);
|
|
||||||
}
|
|
@ -1,10 +0,0 @@
|
|||||||
#ifndef HOS_PRINTF_H
|
|
||||||
#define HOS_PRINTF_H
|
|
||||||
|
|
||||||
#include "stream.h"
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
void hos_vprintf(const stream_t * stream, const char * fmt, va_list va);
|
|
||||||
void hos_printf(const stream_t * stream, const char * fmt, ...);
|
|
||||||
|
|
||||||
#endif
|
|
103
src-old/klog.c
103
src-old/klog.c
@ -1,103 +0,0 @@
|
|||||||
#include <stdint.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include "klog.h"
|
|
||||||
#include "kfont.h"
|
|
||||||
#include "fb.h"
|
|
||||||
#include "fb_text.h"
|
|
||||||
#include "stream.h"
|
|
||||||
#include "hos_printf.h"
|
|
||||||
#include "mem.h"
|
|
||||||
|
|
||||||
static struct {
|
|
||||||
size_t console_width;
|
|
||||||
size_t console_height;
|
|
||||||
size_t x;
|
|
||||||
size_t y;
|
|
||||||
bool need_shift;
|
|
||||||
} klog;
|
|
||||||
|
|
||||||
static void shift_line(void)
|
|
||||||
{
|
|
||||||
uint32_t * fb = fb_addr();
|
|
||||||
uint32_t w = fb_width();
|
|
||||||
size_t console_fb_line_words = w * kfont.line_height;
|
|
||||||
for (size_t row = 0u; row < klog.console_height; row++)
|
|
||||||
{
|
|
||||||
memcpy32(fb, fb + console_fb_line_words, console_fb_line_words);
|
|
||||||
fb += console_fb_line_words;
|
|
||||||
}
|
|
||||||
fb_fill(0, kfont.line_height * (klog.console_height - 1u), w, kfont.line_height, 0u, 0x2Cu, 0x55u);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void klog_fb_write1(char c)
|
|
||||||
{
|
|
||||||
if (klog.need_shift)
|
|
||||||
{
|
|
||||||
shift_line();
|
|
||||||
klog.need_shift = false;
|
|
||||||
}
|
|
||||||
if (c == '\n')
|
|
||||||
{
|
|
||||||
if (klog.y == (klog.console_height - 1u))
|
|
||||||
{
|
|
||||||
klog.need_shift = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
klog.y++;
|
|
||||||
}
|
|
||||||
klog.x = 0u;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int px = klog.x * kfont.advance;
|
|
||||||
int py = klog.y * kfont.line_height;
|
|
||||||
fb_text_render_char(c, px, py, 0xFFu, 0x80u, 0u);
|
|
||||||
klog.x++;
|
|
||||||
if (klog.x == klog.console_width)
|
|
||||||
{
|
|
||||||
if (klog.y == (klog.console_height - 1u))
|
|
||||||
{
|
|
||||||
klog.need_shift = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
klog.y++;
|
|
||||||
}
|
|
||||||
klog.x = 0u;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void klog_fb_write(const char * src, size_t length)
|
|
||||||
{
|
|
||||||
for (size_t i = 0u; i < length; i++)
|
|
||||||
{
|
|
||||||
klog_fb_write1(src[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static const stream_t klog_fb_stream = {
|
|
||||||
klog_fb_write,
|
|
||||||
klog_fb_write1,
|
|
||||||
};
|
|
||||||
|
|
||||||
void klog_init(void)
|
|
||||||
{
|
|
||||||
klog.console_width = fb_width() / kfont.advance;
|
|
||||||
klog.console_height = fb_height() / kfont.line_height;
|
|
||||||
klog.x = 0u;
|
|
||||||
klog.y = 0u;
|
|
||||||
klog.need_shift = false;
|
|
||||||
fb_fill(0, 0, fb_width(), fb_height(), 0u, 0x2Cu, 0x55u);
|
|
||||||
}
|
|
||||||
|
|
||||||
void klog_printf(const char * fmt, ...)
|
|
||||||
{
|
|
||||||
va_list va;
|
|
||||||
va_start(va, fmt);
|
|
||||||
hos_vprintf(&klog_fb_stream, fmt, va);
|
|
||||||
va_end(va);
|
|
||||||
}
|
|
@ -1,7 +0,0 @@
|
|||||||
#ifndef KLOG_H
|
|
||||||
#define KLOG_H
|
|
||||||
|
|
||||||
void klog_init(void);
|
|
||||||
void klog_printf(const char * fmt, ...);
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,41 +0,0 @@
|
|||||||
ENTRY(hos_start)
|
|
||||||
|
|
||||||
SECTIONS
|
|
||||||
{
|
|
||||||
. = 1M;
|
|
||||||
_hos_mem_start = .;
|
|
||||||
|
|
||||||
.text BLOCK(4K) : ALIGN(4K)
|
|
||||||
{
|
|
||||||
*(.multiboot)
|
|
||||||
*(.text)
|
|
||||||
}
|
|
||||||
|
|
||||||
.rodata BLOCK(4K) : ALIGN(4K)
|
|
||||||
{
|
|
||||||
*(.rodata)
|
|
||||||
}
|
|
||||||
|
|
||||||
.data BLOCK(4K) : ALIGN(4K)
|
|
||||||
{
|
|
||||||
*(.data)
|
|
||||||
}
|
|
||||||
|
|
||||||
_stack_size = 16K;
|
|
||||||
.stack (NOLOAD) : ALIGN(4K)
|
|
||||||
{
|
|
||||||
_stack_start = .;
|
|
||||||
. = . + _stack_size;
|
|
||||||
_stack_end = .;
|
|
||||||
}
|
|
||||||
|
|
||||||
.bss BLOCK(4K) : ALIGN(4K)
|
|
||||||
{
|
|
||||||
*(COMMON)
|
|
||||||
*(.bss)
|
|
||||||
}
|
|
||||||
|
|
||||||
. = ALIGN(4K);
|
|
||||||
|
|
||||||
_hos_mem_end = .;
|
|
||||||
}
|
|
100
src-old/mbinfo.c
100
src-old/mbinfo.c
@ -1,100 +0,0 @@
|
|||||||
#include "multiboot2.h"
|
|
||||||
#include "fb.h"
|
|
||||||
#include "mem.h"
|
|
||||||
#include <stdint.h>
|
|
||||||
#include "klog.h"
|
|
||||||
#include "mm.h"
|
|
||||||
|
|
||||||
static uint32_t mbinfo[2048];
|
|
||||||
|
|
||||||
static void mbinfo_process_tag(const multiboot2_info_tag_t * tag)
|
|
||||||
{
|
|
||||||
switch (tag->type)
|
|
||||||
{
|
|
||||||
case MULTIBOOT2_INFO_BOOT_COMMAND_LINE:
|
|
||||||
{
|
|
||||||
multiboot2_info_boot_command_line_t * cl =
|
|
||||||
(multiboot2_info_boot_command_line_t *)tag;
|
|
||||||
klog_printf("Kernel boot command line: '%s'\n", cl->string);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MULTIBOOT2_INFO_BOOT_LOADER_NAME:
|
|
||||||
{
|
|
||||||
multiboot2_info_boot_loader_name_t * bln =
|
|
||||||
(multiboot2_info_boot_loader_name_t *)tag;
|
|
||||||
klog_printf("Boot loader: '%s'\n", bln->string);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MULTIBOOT2_INFO_MEMORY_MAP:
|
|
||||||
{
|
|
||||||
multiboot2_info_memory_map_t * mmap_info =
|
|
||||||
(multiboot2_info_memory_map_t *)tag;
|
|
||||||
size_t sz = sizeof(mmap_info->header) +
|
|
||||||
sizeof(mmap_info->entry_size) +
|
|
||||||
sizeof(mmap_info->entry_version);
|
|
||||||
multiboot2_info_memory_map_entry_t * entry = &mmap_info->entries[0];
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
sz += mmap_info->entry_size;
|
|
||||||
if (sz > mmap_info->header.size)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (entry->type == MULTIBOOT2_MEMORY_MAP_TYPE_RAM)
|
|
||||||
{
|
|
||||||
klog_printf("Memory region %16lx : %16lx\n",
|
|
||||||
entry->base_addr,
|
|
||||||
entry->length);
|
|
||||||
mm_register_ram_region(entry->base_addr, entry->length);
|
|
||||||
}
|
|
||||||
entry = (multiboot2_info_memory_map_entry_t *)((uintptr_t)entry + mmap_info->entry_size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MULTIBOOT2_INFO_FRAMEBUFFER_INFO:
|
|
||||||
{
|
|
||||||
multiboot2_info_framebuffer_info_t * fbinfo =
|
|
||||||
(multiboot2_info_framebuffer_info_t *)tag;
|
|
||||||
fb_init((uint32_t *)(uintptr_t)fbinfo->framebuffer_addr,
|
|
||||||
fbinfo->framebuffer_width,
|
|
||||||
fbinfo->framebuffer_height,
|
|
||||||
fbinfo->framebuffer_pitch);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void process_tags(const multiboot2_info_tag_t * tag, bool init)
|
|
||||||
{
|
|
||||||
while (tag->type != 0u)
|
|
||||||
{
|
|
||||||
if ((init && (tag->type == MULTIBOOT2_INFO_FRAMEBUFFER_INFO)) ||
|
|
||||||
(!init && (tag->type != MULTIBOOT2_INFO_FRAMEBUFFER_INFO)))
|
|
||||||
{
|
|
||||||
mbinfo_process_tag(tag);
|
|
||||||
}
|
|
||||||
tag = multiboot2_info_next_tag(tag);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool mbinfo_init(uint32_t mbinfo_addr)
|
|
||||||
{
|
|
||||||
multiboot2_info_header_t * mbinfo_header = (multiboot2_info_header_t *)mbinfo_addr;
|
|
||||||
if (mbinfo_header->total_size <= sizeof(mbinfo))
|
|
||||||
{
|
|
||||||
memcpy32(mbinfo, mbinfo_header, mbinfo_header->total_size / 4u);
|
|
||||||
multiboot2_info_tag_t * tag = (multiboot2_info_tag_t *)(mbinfo + sizeof(multiboot2_info_header_t) / 4u);
|
|
||||||
process_tags(tag, true);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void mbinfo_load(void)
|
|
||||||
{
|
|
||||||
multiboot2_info_tag_t * tag = (multiboot2_info_tag_t *)(mbinfo + sizeof(multiboot2_info_header_t) / 4u);
|
|
||||||
process_tags(tag, false);
|
|
||||||
}
|
|
@ -1,10 +0,0 @@
|
|||||||
#ifndef MBINFO_H
|
|
||||||
#define MBINFO_H
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
bool mbinfo_init(uint32_t mbinfo_addr);
|
|
||||||
void mbinfo_load(void);
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,49 +0,0 @@
|
|||||||
#ifndef MEM_H
|
|
||||||
#define MEM_H
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
static inline void memcpy(void * dest, const void * src, size_t n)
|
|
||||||
{
|
|
||||||
uint32_t r0, r1, r2;
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
"cld\n\t"
|
|
||||||
"rep movsb"
|
|
||||||
: "=&c" (r0), "=&S" (r1), "=&D" (r2)
|
|
||||||
: "2" (dest), "1" (src), "0" (n)
|
|
||||||
: "memory");
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void memcpy32(void * dest, const void * src, size_t count)
|
|
||||||
{
|
|
||||||
uint32_t r0, r1, r2;
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
"cld\n\t"
|
|
||||||
"rep movsd"
|
|
||||||
: "=&c" (r0), "=&S" (r1), "=&D" (r2)
|
|
||||||
: "2" (dest), "1" (src), "0" (count)
|
|
||||||
: "memory");
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void * memmove(void * dest, const void * src, size_t count)
|
|
||||||
{
|
|
||||||
return __builtin_memmove(dest, src, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void * memset(void * dest, int val, size_t count)
|
|
||||||
{
|
|
||||||
return __builtin_memset(dest, val, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void memset32(void * dest, uint32_t val, size_t count)
|
|
||||||
{
|
|
||||||
uint32_t r0, r1;
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
"cld\n\t"
|
|
||||||
"rep stosl"
|
|
||||||
: "=&c" (r0), "=&D" (r1)
|
|
||||||
: "a" (val), "1" (dest), "0" (count)
|
|
||||||
: "memory");
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
91
src-old/mm.c
91
src-old/mm.c
@ -1,91 +0,0 @@
|
|||||||
#include "mm.h"
|
|
||||||
|
|
||||||
typedef struct mm_page_entry_s {
|
|
||||||
size_t count;
|
|
||||||
struct mm_page_entry_s * next;
|
|
||||||
} mm_region_entry_t;
|
|
||||||
|
|
||||||
static mm_region_entry_t * mm_next_free_region;
|
|
||||||
static size_t mm_free_pages;
|
|
||||||
static size_t mm_total_ram;
|
|
||||||
static size_t kernel_start_address;
|
|
||||||
static size_t kernel_size;
|
|
||||||
|
|
||||||
extern uint8_t _hos_mem_start;
|
|
||||||
extern uint8_t _hos_mem_end;
|
|
||||||
|
|
||||||
static void mm_add_ram_region(size_t base, size_t size)
|
|
||||||
{
|
|
||||||
mm_region_entry_t * region = (mm_region_entry_t *)base;
|
|
||||||
size_t pages = size / PAGE_SIZE;
|
|
||||||
region->count = pages;
|
|
||||||
region->next = mm_next_free_region;
|
|
||||||
mm_next_free_region = region;
|
|
||||||
mm_total_ram += size;
|
|
||||||
mm_free_pages = pages;
|
|
||||||
}
|
|
||||||
|
|
||||||
void mm_register_ram_region(uint64_t base, size_t size)
|
|
||||||
{
|
|
||||||
/* Ignore any RAM region above 4GB. */
|
|
||||||
if (base >= 0x100000000ull)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ((base + size) > 0x100000000ull)
|
|
||||||
{
|
|
||||||
size = (size_t)(0x100000000ull - base);
|
|
||||||
}
|
|
||||||
size_t end_address = mm_page_floor((size_t)base + size);
|
|
||||||
size_t start_address = mm_page_ceil(base);
|
|
||||||
size = end_address - start_address;
|
|
||||||
if (size < PAGE_SIZE)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
size_t kernel_end_address = kernel_start_address + kernel_size;
|
|
||||||
/* Add regions before and after kernel RAM. */
|
|
||||||
if (start_address < kernel_start_address)
|
|
||||||
{
|
|
||||||
/* RAM region begins before kernel RAM. */
|
|
||||||
size_t this_sz = size;
|
|
||||||
if ((start_address + this_sz) > kernel_start_address)
|
|
||||||
{
|
|
||||||
this_sz = kernel_start_address - start_address;
|
|
||||||
}
|
|
||||||
mm_add_ram_region(start_address, this_sz);
|
|
||||||
}
|
|
||||||
if ((start_address + size) > kernel_end_address)
|
|
||||||
{
|
|
||||||
/* RAM region ends after kernel RAM. */
|
|
||||||
size_t this_sz = size;
|
|
||||||
if (start_address < kernel_end_address)
|
|
||||||
{
|
|
||||||
this_sz = (start_address + size) - kernel_end_address;
|
|
||||||
start_address = kernel_end_address;
|
|
||||||
}
|
|
||||||
mm_add_ram_region(start_address, this_sz);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void mm_init(void)
|
|
||||||
{
|
|
||||||
kernel_start_address = mm_page_floor((size_t)&_hos_mem_start);
|
|
||||||
kernel_size = mm_page_ceil((size_t)&_hos_mem_end - kernel_start_address);
|
|
||||||
mm_total_ram = kernel_size;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t mm_get_total_ram(void)
|
|
||||||
{
|
|
||||||
return mm_total_ram;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t mm_get_kernel_address(void)
|
|
||||||
{
|
|
||||||
return kernel_start_address;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t mm_get_kernel_size(void)
|
|
||||||
{
|
|
||||||
return kernel_size;
|
|
||||||
}
|
|
25
src-old/mm.h
25
src-old/mm.h
@ -1,25 +0,0 @@
|
|||||||
#ifndef MM_H
|
|
||||||
#define MM_H
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
#define PAGE_SIZE 4096u
|
|
||||||
|
|
||||||
static inline size_t mm_page_floor(size_t bytes)
|
|
||||||
{
|
|
||||||
return bytes & ~(PAGE_SIZE - 1u);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline size_t mm_page_ceil(size_t bytes)
|
|
||||||
{
|
|
||||||
return (bytes + PAGE_SIZE - 1u) & ~(PAGE_SIZE - 1u);
|
|
||||||
}
|
|
||||||
|
|
||||||
void mm_init(void);
|
|
||||||
void mm_register_ram_region(uint64_t base, size_t size);
|
|
||||||
size_t mm_get_total_ram(void);
|
|
||||||
size_t mm_get_kernel_address(void);
|
|
||||||
size_t mm_get_kernel_size(void);
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,127 +0,0 @@
|
|||||||
#ifndef MULTIBOOT2_H
|
|
||||||
#define MULTIBOOT2_H
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#define MULTIBOOT2_MAGIC 0xE85250D6u
|
|
||||||
#define MULTIBOOT2_ARCHITECTURE_I386 0u
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint32_t magic;
|
|
||||||
uint32_t architecture;
|
|
||||||
uint32_t header_length;
|
|
||||||
uint32_t checksum;
|
|
||||||
} multiboot2_header_t;
|
|
||||||
#define multiboot2_header(magic, architecture, header_length) \
|
|
||||||
{(magic), (architecture), (header_length), (uint32_t)(0x100000000u - (magic) - (architecture) - (header_length))}
|
|
||||||
#define multiboot2_header_default() \
|
|
||||||
multiboot2_header(MULTIBOOT2_MAGIC, MULTIBOOT2_ARCHITECTURE_I386, sizeof(multiboot2_header_t))
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint16_t type;
|
|
||||||
uint16_t flags;
|
|
||||||
uint32_t size;
|
|
||||||
} multiboot2_tag_t;
|
|
||||||
#define multiboot2_end_tag() {0u, 0u, 8u}
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
multiboot2_tag_t header;
|
|
||||||
uint32_t width;
|
|
||||||
uint32_t height;
|
|
||||||
uint32_t depth;
|
|
||||||
uint32_t _padding;
|
|
||||||
} multiboot2_framebuffer_tag_t;
|
|
||||||
#define multiboot2_framebuffer_tag(width, height, depth) \
|
|
||||||
{{5u, 0u, 20u}, width, height, depth}
|
|
||||||
|
|
||||||
#define MULTIBOOT2_INFO_TAG_ALIGNMENT 8u
|
|
||||||
#define MULTIBOOT2_INFO_BOOT_COMMAND_LINE 1u
|
|
||||||
#define MULTIBOOT2_INFO_BOOT_LOADER_NAME 2u
|
|
||||||
#define MULTIBOOT2_INFO_MODULES 3u
|
|
||||||
#define MULTIBOOT2_INFO_BASIC_MEMORY_INFO 4u
|
|
||||||
#define MULTIBOOT2_INFO_BIOS_BOOT_DEVICE 5u
|
|
||||||
#define MULTIBOOT2_INFO_MEMORY_MAP 6u
|
|
||||||
#define MULTIBOOT2_INFO_VBE_INFO 7u
|
|
||||||
#define MULTIBOOT2_INFO_FRAMEBUFFER_INFO 8u
|
|
||||||
#define MULTIBOOT2_INFO_ELF_SYMBOLS 9u
|
|
||||||
#define MULTIBOOT2_INFO_APM_TABLE 10u
|
|
||||||
#define MULTIBOOT2_INFO_EFI_32BIT_SYSTEM_TABLE_POINTER 11u
|
|
||||||
#define MULTIBOOT2_INFO_EFI_64BIT_SYSTEM_TABLE_POINTER 12u
|
|
||||||
#define MULTIBOOT2_INFO_SMBIOS_TABLES 13u
|
|
||||||
#define MULTIBOOT2_INFO_ACPI_OLD_RSDP 14u
|
|
||||||
#define MULTIBOOT2_INFO_NETWORKING_INFO 16u
|
|
||||||
#define MULTIBOOT2_INFO_EFI_MEMORY_MAP 17u
|
|
||||||
#define MULTIBOOT2_INFO_EFI_BOOT_SERVICES_NOT_TERMINATED 18u
|
|
||||||
#define MULTIBOOT2_INFO_EFI_32BIT_IMAGE_HANDLE_POINTER 19u
|
|
||||||
#define MULTIBOOT2_INFO_EFI_64BIT_IMAGE_HANDLE_POINTER 20u
|
|
||||||
#define MULTIBOOT2_INFO_IMAGE_LOAD_BASE_PHYSICAL_ADDRESS 21u
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint32_t total_size;
|
|
||||||
uint32_t _reserved;
|
|
||||||
} multiboot2_info_header_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint32_t type;
|
|
||||||
uint32_t size;
|
|
||||||
} multiboot2_info_tag_t;
|
|
||||||
#define multiboot2_info_next_tag(current_tag) \
|
|
||||||
(multiboot2_info_tag_t *)(((uintptr_t)current_tag + current_tag->size + MULTIBOOT2_INFO_TAG_ALIGNMENT - 1u) & ~(MULTIBOOT2_INFO_TAG_ALIGNMENT - 1u))
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
multiboot2_info_tag_t header;
|
|
||||||
char string[];
|
|
||||||
} multiboot2_info_boot_command_line_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
multiboot2_info_tag_t header;
|
|
||||||
char string[];
|
|
||||||
} multiboot2_info_boot_loader_name_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
multiboot2_info_tag_t header;
|
|
||||||
uint32_t mem_lower;
|
|
||||||
uint32_t mem_upper;
|
|
||||||
} multiboot2_info_basic_memory_info_t;
|
|
||||||
|
|
||||||
#define MULTIBOOT2_MEMORY_MAP_TYPE_RAM 1u
|
|
||||||
#define MULTIBOOT2_MEMORY_MAP_TYPE_ACPI 3u
|
|
||||||
#define MULTIBOOT2_MEMORY_MAP_TYPE_PRESERVE 4u
|
|
||||||
#define MULTIBOOT2_MEMORY_MAP_TYPE_DEFECTIVE 5u
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint64_t base_addr;
|
|
||||||
uint64_t length;
|
|
||||||
uint32_t type;
|
|
||||||
uint32_t _reserved;
|
|
||||||
} multiboot2_info_memory_map_entry_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
multiboot2_info_tag_t header;
|
|
||||||
uint32_t entry_size;
|
|
||||||
uint32_t entry_version;
|
|
||||||
multiboot2_info_memory_map_entry_t entries[];
|
|
||||||
} multiboot2_info_memory_map_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
multiboot2_info_tag_t header;
|
|
||||||
uint16_t vbe_mode;
|
|
||||||
uint16_t vbe_interface_set;
|
|
||||||
uint16_t vbe_interface_off;
|
|
||||||
uint16_t vbe_interface_len;
|
|
||||||
uint8_t vbe_control_info[512];
|
|
||||||
uint8_t vbe_mode_info[256];
|
|
||||||
} multiboot2_info_vbe_info_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
multiboot2_info_tag_t header;
|
|
||||||
uint64_t framebuffer_addr;
|
|
||||||
uint32_t framebuffer_pitch;
|
|
||||||
uint32_t framebuffer_width;
|
|
||||||
uint32_t framebuffer_height;
|
|
||||||
uint8_t framebuffer_bpp;
|
|
||||||
uint8_t framebuffer_type;
|
|
||||||
uint8_t _reserved;
|
|
||||||
} multiboot2_info_framebuffer_info_t;
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,12 +0,0 @@
|
|||||||
#include "multiboot2.h"
|
|
||||||
|
|
||||||
/* Multiboot2 Header. */
|
|
||||||
struct {
|
|
||||||
multiboot2_header_t header;
|
|
||||||
multiboot2_framebuffer_tag_t framebuffer_tag;
|
|
||||||
multiboot2_tag_t end_tag;
|
|
||||||
} multiboot_header __attribute__((section(".multiboot"))) = {
|
|
||||||
multiboot2_header_default(),
|
|
||||||
multiboot2_framebuffer_tag(1600u, 900u, 32u),
|
|
||||||
multiboot2_end_tag(),
|
|
||||||
};
|
|
@ -1,12 +0,0 @@
|
|||||||
#ifndef STREAM_H
|
|
||||||
#define STREAM_H
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
void (*write)(const char * src, size_t length);
|
|
||||||
void (*write1)(char c);
|
|
||||||
} stream_t;
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,26 +0,0 @@
|
|||||||
#ifndef STRING_H
|
|
||||||
#define STRING_H
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
static inline size_t strlen(const char * s)
|
|
||||||
{
|
|
||||||
size_t r = 0u;
|
|
||||||
while (*s++ != (char)0)
|
|
||||||
{
|
|
||||||
r++;
|
|
||||||
}
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline char * strcpy(char * dest, const char * src)
|
|
||||||
{
|
|
||||||
return __builtin_strcpy(dest, src);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline char * strncpy(char * dest, const char * src, size_t n)
|
|
||||||
{
|
|
||||||
return __builtin_strncpy(dest, src, n);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
Loading…
x
Reference in New Issue
Block a user