3 # Utility functions to pretty-print x86 segment/interrupt descriptors.
4 # To load this file, run "source gdbutil" in gdb.
5 # printdesc and printdescs are the main entry points.
7 # IA32 2007, Volume 3A, Table 3-2
76 # IA32 2007, Volume 3A, Table 3-1
121 if $arg0 >> 3 == $SEG_KCODE
122 printf "SEG_KCODE<<3"
124 if $arg0 >> 3 == $SEG_KDATA
125 printf "SEG_KDATA<<3"
127 if $arg0 >> 3 == $SEG_KCPU
130 if $arg0 >> 3 == $SEG_UCODE
131 printf "SEG_UCODE<<3"
133 if $arg0 >> 3 == $SEG_UDATA
134 printf "SEG_UDATA<<3"
136 if $arg0 >> 3 == $SEG_TSS
139 if ($arg0 >> 3 < 1) + ($arg0 >> 3 > 6)
140 printf "GDT[%d]", $arg0 >> 3
143 printf "LDT[%d]", $arg0 >> 3
158 printf "DPL%d", $arg0
165 echo Usage: printdesc expr
167 _printdesc ((uint*)&($arg0))[0] ((uint*)&($arg0))[1]
173 Print an x86 segment or gate descriptor.
175 EXPR must evaluate to a descriptor value. It can be of any C type.
179 _printdesc1 $arg0 $arg1 ($arg1>>15&1) ($arg1>>13&3) ($arg1>>12&1) ($arg1>>8&15)
183 # 2:P 3:DPL 4:S 5:Type
185 printf "P = 0 (Not present)"
191 printf " (0x%x) ", $arg5
192 _printsysdesc $arg0 $arg1 $arg5
197 _printsegdesc $arg0 $arg1
202 printf " (%d)", $arg3
209 if ($arg2 == $STS_TG) + (($arg2&7) == $STS_IG16) + (($arg2&7) == $STS_TG16)
211 _printgate $arg2 ($arg0>>16) ($arg0&0xFFFF) ($arg1>>16)
213 # System segment descriptor
214 _printsegdesc $arg0 $arg1
219 # IA32 2007, Voume 3A, Figure 5-2
220 # 0:Type 1:CS 2:Offset 15..0 3:Offset 31..16
223 printf " (%d)", $arg1
225 if (($arg0&7) == $STS_IG16) + (($arg0&7) == $STS_TG16)
227 output/a $arg3 << 16 | $arg2
232 # IA32 20007, Volume 3A, Figure 3-8 and Figure 4-1
233 _printsegdesc1 ($arg0>>16) ($arg1&0xFF) ($arg1>>24) ($arg0&0xFFFF) ($arg1>>16&15) ($arg1>>23&1)
234 if ($arg1>>12&1) == 1
235 printf " AVL = %d", $arg1>>20&1
236 if ($arg1>>11&1) == 0
238 if ($arg1>>22&1) == 0
239 printf " B = small (0) "
241 printf " B = big (1) "
246 if ($arg1>>22&1) == 0
255 define _printsegdesc1
256 # 0:Base 0..15 1:Base 16..23 2:Base 24..32 3:Limit 0..15 4:Limit 16..19 5:G
257 printf "base = 0x%08x", $arg0 | ($arg1<<16) | ($arg2<<24)
260 printf "%08x", $arg3 | ($arg4<<16)
262 printf "%08x", (($arg3 | ($arg4<<16)) << 12) | 0xFFF
267 if $argc < 1 || $argc > 2
268 echo Usage: printdescs expr [count]
271 _printdescs ($arg0) (sizeof($arg0)/sizeof(($arg0)[0]))
273 _printdescs ($arg0) ($arg1)
279 Print an array of x86 segment or gate descriptors.
280 printdescs EXPR [COUNT]
281 EXPR must evaluate to an array of descriptors.