#define FOOLOS_MODULE_NAME "x86" #include "x86.h" #include "timer.h" #include "lib/logger/log.h" // // suffix (b, w, l, q for byte, word, dword, and qword). // /* volatile void sleep(int i) { uint64_t clock=timer_get_ticks(); while(clock+i>timer_get_ticks()); } */ // disable interrupts void x86_int_disable() { asm volatile("cli"); } // enable interrupts void x86_int_enable() { asm volatile("sti"); } // get control registers (cr0-cr4) uint32_t x86_get_cr0() { uint32_t cr; asm volatile("mov %%cr0, %0": "=b"(cr)); return cr; } uint32_t x86_get_cr1() { uint32_t cr=0; // reading the reserved cr1 register results in crash. // (at least on emulators) // asm volatile("mov %%cr1, %0": "=b"(cr)); return cr; } void x86_mov(uint8_t val) { } uint32_t x86_get_cr2() { uint32_t cr; asm volatile("mov %%cr2, %0": "=b"(cr)); return cr; } uint32_t x86_get_cr3() { uint32_t cr=0; asm volatile("mov %%cr3, %0": "=b"(cr)); return cr; } uint32_t x86_get_cr4() { uint32_t cr; asm volatile("mov %%cr4, %0": "=b"(cr)); return cr; } void x86_outb(int port, uint8_t data) { asm volatile("outb %0,%w1" : : "a" (data), "d" (port)); } uint8_t x86_inb(int port) { uint8_t data; asm volatile("inb %w1,%0" : "=a" (data) : "d" (port)); return data; } void x86_outw(int port, uint16_t data) { asm volatile("outw %0,%w1" : : "a" (data), "d" (port)); } uint16_t x86_inw(int port) { uint16_t data; asm volatile("inw %w1,%0" : "=a" (data) : "d" (port)); return data; } void x86_outl(int port, uint32_t data) { asm volatile("outl %0,%w1" : : "a" (data), "d" (port)); } uint32_t x86_inl(int port) { uint32_t data; asm volatile("inl %w1,%0" : "=a" (data) : "d" (port)); return data; } void x86_set_pdbr(uint32_t addr) { asm volatile("mov %0, %%cr3":: "b"(addr)); } // enable PT bit in CR0 void x86_paging_enable() { uint32_t cr0=x86_get_cr0(); cr0 |= 0x80000000; // enable paging asm volatile("mov %0, %%cr0":: "b"(cr0)); } // disable PT bit in CR0 void x86_paging_disable() { uint32_t cr0=x86_get_cr0(); cr0 &= ~0x80000000; asm volatile("mov %0, %%cr0":: "b"(cr0)); } void x86_flush_tlb(uint32_t addr) { asm volatile("invlpg (%0)" ::"r" (addr) : "memory"); } //xchg uint8_t x86_xchg(uint8_t *addr, uint8_t val) { uint8_t result; // The + in "+m" denotes a read-modify-write operand. asm volatile("lock xchgb %0, %1" : "+m" (*addr), "=a" (result) : "1" (val) : "cc"); //log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"xchg val:%d with addr:0x%08X : result: %d",val,addr,result); return result; }