diff options
author | rsc <rsc> | 2006-07-16 16:55:52 +0000 |
---|---|---|
committer | rsc <rsc> | 2006-07-16 16:55:52 +0000 |
commit | 564f787e916392af7b1960d079abf110234305d4 (patch) | |
tree | ad3095388d6723fdb177303a25de38477571c33b /x86.h | |
parent | 6e6a1dd7d717246f58bc3bbdf2a32e7e3f901cf3 (diff) | |
download | xv6-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.h | 27 |
1 files changed, 24 insertions, 3 deletions
@@ -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 |