diff options
Diffstat (limited to 'kernel/x86.c')
| -rw-r--r-- | kernel/x86.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/kernel/x86.c b/kernel/x86.c index 782baec..7775ab7 100644 --- a/kernel/x86.c +++ b/kernel/x86.c @@ -49,6 +49,10 @@ uint32_t x86_get_cr1() return cr; } +void x86_mov(uint8_t val) +{ +} + uint32_t x86_get_cr2() { uint32_t cr; @@ -134,4 +138,28 @@ void x86_flush_tlb(uint32_t addr) asm volatile("invlpg (%0)" ::"r" (addr) : "memory"); } +//xchg +volatile uint8_t x86_xchg(volatile uint8_t *addr, uint8_t val) +{ + uint8_t result; + + // test. because asm does not work !? + uint8_t oldval=*addr; + *addr=val; + return oldval; + + + + // The + in "+m" denotes a read-modify-write operand. + asm volatile("lock xchg %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; +} + + |
