| #ifndef WINELIB |
| static char RCSId[] = "$Id: ldt.c,v 1.2 1993/07/04 04:04:21 root Exp root $"; |
| static char Copyright[] = "Copyright Robert J. Amstadt, 1993"; |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <errno.h> |
| #include "prototypes.h" |
| |
| #if defined(__NetBSD__) || defined(__FreeBSD__) |
| #include <machine/segments.h> |
| #endif |
| |
| /********************************************************************** |
| * print_ldt |
| */ |
| /* XXX These are *real* 386 descriptors !! */ |
| void |
| print_ldt() |
| { |
| char buffer[0x10000]; |
| unsigned long *lp; |
| unsigned long base_addr, limit; |
| int type, dpl, i; |
| #if defined(__NetBSD__) || defined(__FreeBSD__) |
| struct segment_descriptor *sd; |
| #endif |
| |
| if (get_ldt(buffer) < 0) |
| exit(1); |
| |
| lp = (unsigned long *) buffer; |
| #if defined(__NetBSD__) || defined(__FreeBSD__) |
| sd = (struct segment_descriptor *) buffer; |
| #endif |
| |
| for (i = 0; i < 32; i++, lp++) |
| { |
| /* First 32 bits of descriptor */ |
| base_addr = (*lp >> 16) & 0x0000FFFF; |
| limit = *lp & 0x0000FFFF; |
| lp++; |
| |
| /* First 32 bits of descriptor */ |
| base_addr |= (*lp & 0xFF000000) | ((*lp << 16) & 0x00FF0000); |
| limit |= (*lp & 0x000F0000); |
| #ifdef linux |
| type = (*lp >> 10) & 5; |
| dpl = (*lp >> 13) & 3; |
| #endif |
| #if defined(__NetBSD__) || defined(__FreeBSD__) |
| type = sd->sd_type; |
| dpl = sd->sd_dpl; |
| sd++; |
| #endif |
| if (*lp & 1000) |
| { |
| printf("Entry %2d: Base %08.8x, Limit %05.5x, DPL %d, Type %d\n", |
| i, base_addr, limit, dpl, type); |
| printf(" "); |
| if (*lp & 0x100) |
| printf("Accessed, "); |
| if (*lp & 8000) |
| printf("Present, "); |
| if (*lp & 0x100000) |
| printf("User, "); |
| if (*lp & 0x200000) |
| printf("X, "); |
| if (*lp & 0x400000) |
| printf("32, "); |
| else |
| printf("16, "); |
| if (*lp & 0x800000) |
| printf("page limit, "); |
| else |
| printf("byte limit, "); |
| printf("\n"); |
| printf(" %08.8x %08.8x\n", *(lp), *(lp-1)); |
| } |
| else |
| { |
| printf("Entry %2d: Base %08.8x, Limit %05.5x, DPL %d, Type %d\n", |
| i, base_addr, limit, dpl, type); |
| printf(" SYSTEM: %08.8x %08.8x\n", *lp, *(lp-1)); |
| } |
| } |
| } |
| |
| #endif /* ifndef WINELIB */ |