diff options
| -rw-r--r-- | include/asm/system.h | 2 | ||||
| -rw-r--r-- | kernel/asm.s | 38 | ||||
| -rw-r--r-- | kernel/memory.c | 9 |
3 files changed, 39 insertions, 10 deletions
diff --git a/include/asm/system.h b/include/asm/system.h index 0230f46..2ea2d73 100644 --- a/include/asm/system.h +++ b/include/asm/system.h @@ -2,5 +2,7 @@ volatile void switch_to(int n, struct task_struct *task); +void invlpg(void*); + void set_tss(unsigned int n, void *tss); void clear_tss(unsigned int n); diff --git a/kernel/asm.s b/kernel/asm.s index 8b5c231..655dcfc 100644 --- a/kernel/asm.s +++ b/kernel/asm.s @@ -1,12 +1,13 @@ global clear_tss -global switch_to +global invlpg global set_tss +global switch_to extern ctask extern ctaskn extern gdt extern save_state -; void switch_to(int n, struct task_struct *task); +; void switch_to(int n, struct task_struct *task) switch_to: push ebp mov ebp, esp @@ -36,7 +37,36 @@ switch_to: .tmp: dq 0 -; void set_tss(unsigned int n, void *tss); +; void invlpg(void *page) +invlpg: + push ebp + mov ebp, esp + ; test if we're running on a i386 and abort if so (only i486+ have caches) + pushf + pop eax + and eax, 0xFFFBFFFF + push eax + popf + pushf + pop eax + test eax, 0x40000 + jnz .skip + pushf + pop eax + or eax, 0x40000 + push eax + popf + pushf + pop eax + test eax, 0x40000 + jz .skip + mov eax, [ebp+8] + invlpg [eax] +.skip: + pop ebp + ret + +; void set_tss(unsigned int n, void *tss) set_tss: push ebp mov ebp, esp @@ -59,7 +89,7 @@ set_tss: pop ebp ret -; void clear_tss(unsigned int n); +; void clear_tss(unsigned int n) clear_tss: push ebp mov ebp, esp diff --git a/kernel/memory.c b/kernel/memory.c index 0c73970..67ad69c 100644 --- a/kernel/memory.c +++ b/kernel/memory.c @@ -1,3 +1,4 @@ +#include <asm/system.h> #include <kernel/memory.h> #include <stdint.h> #include <sys/types.h> @@ -82,12 +83,8 @@ void *map_page(void *page) { page = (void*) ((uint32_t) page & ~0xFFF); ktab[(p >> 12) & 0x3FF] = (uint32_t) page | 0x003; - /* - * invalidate any cached entries for - * the mapped page window. - * TODO: skip this on i386 - */ - __asm__ ("invlpg %0" :: "m" (mapped_page)); + + invlpg(mapped_page); return mapped_page; } |
