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:
josh 2009-07-13 22:38:53 +00:00
parent 5b9651299e
commit 0fb590a407
4 changed files with 41 additions and 6 deletions

View File

@ -24,7 +24,7 @@ void kio_bootstrap()
cursor_y = 9;
}
void kprintf(char * fmt, ...)
void kprintf(const char * fmt, ...)
{
va_list args;
va_start(args, fmt);
@ -34,7 +34,7 @@ void kprintf(char * fmt, ...)
va_end(args);
}
void kvprintf(char * fmt, va_list args)
void kvprintf(const char * fmt, va_list args)
{
char tmpbuf[25];
for ( ; *fmt; fmt++)
@ -127,7 +127,7 @@ void kputc(char c)
}
}
void kputs(char * s)
void kputs(const char * s)
{
while (*s)
{

View File

@ -10,13 +10,13 @@ extern "C" {
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 kputs(char * s);
void kputs(const char * s);
#ifdef __cplusplus
} /* extern "C" */

View File

@ -3,6 +3,7 @@
#include "mm.h"
#include "boot/k_early_panic.h"
#include "lang/string.h"
#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_num_free_pages = 0;
u32_t * mm_free_page_ptr = NULL;
gdtr_t mm_gdtr;
/**************************************************************************
* 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);
}
/* 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_cr3(page_directory);

View File

@ -26,8 +26,32 @@ int mm_map(u32_t virtual_address, u32_t physical_address,
u32_t mm_page_alloc();
typedef struct
{
u16_t length;
u32_t phys_addr;
} __attribute__ ((packed)) gdtr_t;
#define set_cr3(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