changed kio routines to accept const char *; added MAKE_DESCRIPTOR() macro to mm
git-svn-id: svn://anubis/hos/trunk@48 5b3e749e-e535-0410-8002-a9bb6afbdfca
This commit is contained in:
parent
5b9651299e
commit
0fb590a407
@ -24,7 +24,7 @@ void kio_bootstrap()
|
|||||||
cursor_y = 9;
|
cursor_y = 9;
|
||||||
}
|
}
|
||||||
|
|
||||||
void kprintf(char * fmt, ...)
|
void kprintf(const char * fmt, ...)
|
||||||
{
|
{
|
||||||
va_list args;
|
va_list args;
|
||||||
va_start(args, fmt);
|
va_start(args, fmt);
|
||||||
@ -34,7 +34,7 @@ void kprintf(char * fmt, ...)
|
|||||||
va_end(args);
|
va_end(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
void kvprintf(char * fmt, va_list args)
|
void kvprintf(const char * fmt, va_list args)
|
||||||
{
|
{
|
||||||
char tmpbuf[25];
|
char tmpbuf[25];
|
||||||
for ( ; *fmt; fmt++)
|
for ( ; *fmt; fmt++)
|
||||||
@ -127,7 +127,7 @@ void kputc(char c)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void kputs(char * s)
|
void kputs(const char * s)
|
||||||
{
|
{
|
||||||
while (*s)
|
while (*s)
|
||||||
{
|
{
|
||||||
|
@ -10,13 +10,13 @@ extern "C" {
|
|||||||
|
|
||||||
void kio_bootstrap();
|
void kio_bootstrap();
|
||||||
|
|
||||||
void kprintf(char * fmt, ...);
|
void kprintf(const char * fmt, ...);
|
||||||
|
|
||||||
void kvprintf(char * fmt, va_list args);
|
void kvprintf(const char * fmt, va_list args);
|
||||||
|
|
||||||
void kputc(char c);
|
void kputc(char c);
|
||||||
|
|
||||||
void kputs(char * s);
|
void kputs(const char * s);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} /* extern "C" */
|
} /* extern "C" */
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include "mm.h"
|
#include "mm.h"
|
||||||
#include "boot/k_early_panic.h"
|
#include "boot/k_early_panic.h"
|
||||||
|
#include "lang/string.h"
|
||||||
|
|
||||||
#define MM_MAX_MMAP_ENTRIES 64
|
#define MM_MAX_MMAP_ENTRIES 64
|
||||||
|
|
||||||
@ -13,6 +14,7 @@ static mm_mem_range_t mm_mmap_entries[MM_MAX_MMAP_ENTRIES];
|
|||||||
static int mm_mmap_num_entries = 0;
|
static int mm_mmap_num_entries = 0;
|
||||||
static int mm_num_free_pages = 0;
|
static int mm_num_free_pages = 0;
|
||||||
u32_t * mm_free_page_ptr = NULL;
|
u32_t * mm_free_page_ptr = NULL;
|
||||||
|
gdtr_t mm_gdtr;
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* This function is run in segmented memory before paging is in effect. *
|
* This function is run in segmented memory before paging is in effect. *
|
||||||
@ -141,6 +143,15 @@ void mm_bootstrap()
|
|||||||
mm_map(page_base, page_base - KERNEL_OFFSET, 0, 1);
|
mm_map(page_base, page_base - KERNEL_OFFSET, 0, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* set up the global descriptor table */
|
||||||
|
u32_t gdt_base = mm_page_alloc();
|
||||||
|
u64_t * gdt = (u64_t *) ((u32_t) gdt_base + (u32_t) KERNEL_OFFSET);
|
||||||
|
memsetd((u32_t *) gdt, 0, PAGE_SIZE / 4);
|
||||||
|
mm_gdtr.length = PAGE_SIZE - 1;
|
||||||
|
mm_gdtr.phys_addr = gdt_base;
|
||||||
|
gdt[1] = MAKE_DESCRIPTOR(0, 0xFFFFF, 1, 0, 1, 1);
|
||||||
|
gdt[2] = MAKE_DESCRIPTOR(0, 0xFFFFF, 1, 0, 1, 0);
|
||||||
|
|
||||||
/* set the page directory base register */
|
/* set the page directory base register */
|
||||||
set_cr3(page_directory);
|
set_cr3(page_directory);
|
||||||
|
|
||||||
|
@ -26,8 +26,32 @@ int mm_map(u32_t virtual_address, u32_t physical_address,
|
|||||||
|
|
||||||
u32_t mm_page_alloc();
|
u32_t mm_page_alloc();
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
u16_t length;
|
||||||
|
u32_t phys_addr;
|
||||||
|
} __attribute__ ((packed)) gdtr_t;
|
||||||
|
|
||||||
#define set_cr3(address) \
|
#define set_cr3(address) \
|
||||||
__asm__ __volatile__ ("movl %0, %%cr3" : : "r" (address));
|
__asm__ __volatile__ ("movl %0, %%cr3" : : "r" (address));
|
||||||
|
|
||||||
|
/* http://courses.ece.illinois.edu/ece391/references/descriptors.pdf */
|
||||||
|
/* granularity: 0: limit in bytes; 1: limit in pages */
|
||||||
|
/* dpl: 0: system mode; 3: user mode */
|
||||||
|
/* normal: 0: TSS/LDT/call gate; 1: code/data segment */
|
||||||
|
/* code_seg: 0: data segment; 1: code segment */
|
||||||
|
#define MAKE_DESCRIPTOR(base, limit, granularity, dpl, normal, code_seg) \
|
||||||
|
(u64_t) ( ( (((u64_t) base) & 0xFF000000ull) << 32 ) /* base 31:24 */ \
|
||||||
|
| ( (((u64_t) granularity) & 0x1ull) << 55 ) /* granularity */ \
|
||||||
|
| ( ( (u64_t) 0x1ull) << 54 ) /* 32-bit */ \
|
||||||
|
| ( (((u64_t) limit) & 0xF0000ull) << 32 ) /* limit 19:16 */ \
|
||||||
|
| ( ( (u64_t) 0x1ull) << 47 ) /* present */ \
|
||||||
|
| ( (((u64_t) dpl) & 0x3ull) << 45 ) /* dpl */ \
|
||||||
|
| ( (((u64_t) normal) & 0x1ull) << 44 ) /* normal */ \
|
||||||
|
| ( (((u64_t) code_seg) & 0x1ull) << 43 ) /* code seg */ \
|
||||||
|
| ( ( (u64_t) 0x2ull) << 40 ) /* ? */ \
|
||||||
|
| ( (((u64_t) base) & 0x00FFFFFFull) << 16) /* base 23:00 */ \
|
||||||
|
| ( (((u64_t) limit) & 0x0000FFFFull) ) ) /* limit 15:00 */
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user