summaryrefslogtreecommitdiff
path: root/kernel/x86.c
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-09-08 12:23:20 +0200
committerMichal Idziorek <m.i@gmx.at>2014-09-08 12:23:20 +0200
commit77357ba0bd02eb9ef76af15697f62f6021c0a4fe (patch)
treee60b2d74357168e423613fed8ec529aed84c564e /kernel/x86.c
parent2a204125c98699aa2baa8f6f91fc5129f6eb7385 (diff)
fixed waiting for keypress in bootloader.
Diffstat (limited to 'kernel/x86.c')
-rw-r--r--kernel/x86.c28
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;
+}
+
+