summaryrefslogtreecommitdiff
path: root/x86.h
diff options
context:
space:
mode:
authorrsc <rsc>2006-07-16 16:55:52 +0000
committerrsc <rsc>2006-07-16 16:55:52 +0000
commit564f787e916392af7b1960d079abf110234305d4 (patch)
treead3095388d6723fdb177303a25de38477571c33b /x86.h
parent6e6a1dd7d717246f58bc3bbdf2a32e7e3f901cf3 (diff)
downloadxv6-labs-564f787e916392af7b1960d079abf110234305d4.tar.gz
xv6-labs-564f787e916392af7b1960d079abf110234305d4.tar.bz2
xv6-labs-564f787e916392af7b1960d079abf110234305d4.zip
Eliminate annoying Pseudodesc structure.
Eliminate unnecessary parts of mmu.h.
Diffstat (limited to 'x86.h')
-rw-r--r--x86.h27
1 files changed, 24 insertions, 3 deletions
diff --git a/x86.h b/x86.h
index 6c67df7..a25d875 100644
--- a/x86.h
+++ b/x86.h
@@ -12,7 +12,10 @@ static __inline void outsw(int port, const void *addr, int cnt) __attribute__((a
static __inline void outsl(int port, const void *addr, int cnt) __attribute__((always_inline));
static __inline void outl(int port, uint32_t data) __attribute__((always_inline));
static __inline void invlpg(void *addr) __attribute__((always_inline));
-static __inline void lidt(void *p) __attribute__((always_inline));
+struct Segdesc;
+static __inline void lgdt(struct Segdesc *p, int) __attribute__((always_inline));
+struct Gatedesc;
+static __inline void lidt(struct Gatedesc *p, int) __attribute__((always_inline));
static __inline void lldt(uint16_t sel) __attribute__((always_inline));
static __inline void ltr(uint16_t sel) __attribute__((always_inline));
static __inline void lcr0(uint32_t val) __attribute__((always_inline));
@@ -141,9 +144,27 @@ invlpg(void *addr)
}
static __inline void
-lidt(void *p)
+lgdt(struct Segdesc *p, int size)
{
- __asm __volatile("lidt (%0)" : : "r" (p));
+ volatile uint16_t pd[3];
+
+ pd[0] = size-1;
+ pd[1] = (uint)p;
+ pd[2] = (uint)p >> 16;
+
+ asm volatile("lgdt (%0)" : : "g" (pd));
+}
+
+static __inline void
+lidt(struct Gatedesc *p, int size)
+{
+ volatile uint16_t pd[3];
+
+ pd[0] = size-1;
+ pd[1] = (uint)p;
+ pd[2] = (uint)p >> 16;
+
+ asm volatile("lidt (%0)" : : "g" (pd));
}
static __inline void