diff options
author | njl <njl@FreeBSD.org> | 2007-08-09 20:14:35 +0000 |
---|---|---|
committer | njl <njl@FreeBSD.org> | 2007-08-09 20:14:35 +0000 |
commit | 6fbfdc29284a9679b2564c699957e1b35dd0c36d (patch) | |
tree | 92b1e138479abdf58ffb6d430d9c68f33dfbd4fe /sys/i386/include/cpufunc.h | |
parent | 3e954dbc055d1799a92b99f305a9becfeec7a491 (diff) | |
download | FreeBSD-src-6fbfdc29284a9679b2564c699957e1b35dd0c36d.zip FreeBSD-src-6fbfdc29284a9679b2564c699957e1b35dd0c36d.tar.gz |
Add "show sysregs" command to ddb. On i386, this gives gdt, idt, ldt,
cr0-4, etc. Support should be added for other platforms that have a
different set of registers for system use.
Loosely based on: OpenBSD
Approved by: re
Diffstat (limited to 'sys/i386/include/cpufunc.h')
-rw-r--r-- | sys/i386/include/cpufunc.h | 58 |
1 files changed, 47 insertions, 11 deletions
diff --git a/sys/i386/include/cpufunc.h b/sys/i386/include/cpufunc.h index 9a646f6..f3f6715 100644 --- a/sys/i386/include/cpufunc.h +++ b/sys/i386/include/cpufunc.h @@ -326,28 +326,28 @@ read_eflags(void) return (ef); } -static __inline u_int64_t +static __inline uint64_t rdmsr(u_int msr) { - u_int64_t rv; + uint64_t rv; __asm __volatile("rdmsr" : "=A" (rv) : "c" (msr)); return (rv); } -static __inline u_int64_t +static __inline uint64_t rdpmc(u_int pmc) { - u_int64_t rv; + uint64_t rv; __asm __volatile("rdpmc" : "=A" (rv) : "c" (pmc)); return (rv); } -static __inline u_int64_t +static __inline uint64_t rdtsc(void) { - u_int64_t rv; + uint64_t rv; __asm __volatile("rdtsc" : "=A" (rv)); return (rv); @@ -366,7 +366,7 @@ write_eflags(u_int ef) } static __inline void -wrmsr(u_int msr, u_int64_t newval) +wrmsr(u_int msr, uint64_t newval) { __asm __volatile("wrmsr" : : "A" (newval), "c" (msr)); } @@ -456,6 +456,14 @@ rfs(void) return (sel); } +static __inline uint64_t +rgdt(void) +{ + uint64_t gdtr; + __asm __volatile("sgdt %0" : "=m" (gdtr)); + return (gdtr); +} + static __inline u_int rgs(void) { @@ -464,6 +472,22 @@ rgs(void) return (sel); } +static __inline uint64_t +ridt(void) +{ + uint64_t idtr; + __asm __volatile("sidt %0" : "=m" (idtr)); + return (idtr); +} + +static __inline u_short +rldt(void) +{ + u_short ldtr; + __asm __volatile("sldt %0" : "=g" (ldtr)); + return (ldtr); +} + static __inline u_int rss(void) { @@ -472,6 +496,14 @@ rss(void) return (sel); } +static __inline u_short +rtr(void) +{ + u_short tr; + __asm __volatile("str %0" : "=g" (tr)); + return (tr); +} + static __inline void load_fs(u_int sel) { @@ -677,8 +709,8 @@ u_int rcr0(void); u_int rcr2(void); u_int rcr3(void); u_int rcr4(void); -u_int64_t rdmsr(u_int msr); -u_int64_t rdpmc(u_int pmc); +uint64_t rdmsr(u_int msr); +uint64_t rdpmc(u_int pmc); u_int rdr0(void); u_int rdr1(void); u_int rdr2(void); @@ -687,13 +719,17 @@ u_int rdr4(void); u_int rdr5(void); u_int rdr6(void); u_int rdr7(void); -u_int64_t rdtsc(void); +uint64_t rdtsc(void); u_int read_eflags(void); u_int rfs(void); +uint64_t rgdt(void); u_int rgs(void); +uint64_t ridt(void); +u_short rldt(void); +u_short rtr(void); void wbinvd(void); void write_eflags(u_int ef); -void wrmsr(u_int msr, u_int64_t newval); +void wrmsr(u_int msr, uint64_t newval); #endif /* __GNUCLIKE_ASM && __CC_SUPPORTS___INLINE */ |