#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#define PAGE_SHIFT 12 /* LOG2(PAGE_SIZE) */
#define PAGE_SIZE (1<<PAGE_SHIFT) /* bytes/page */
#define PAGE_MASK (PAGE_SIZE-1)
#define O_FILES 64
struct thread {
int td_retval[2];
void * o_files[O_FILES];
char * vm_daddr;
int32_t vm_dsize;
};
#define PAD_(t) (sizeof(register_t) <= sizeof(t) ? \
0 : sizeof(register_t) - sizeof(t))
#if BYTE_ORDER == LITTLE_ENDIAN
#define PADL_(t) 0
#define PADR_(t) PAD_(t)
#else
#define PADL_(t) PAD_(t)
#define PADR_(t) 0
#endif
struct freebsd6_mmap_args {
char addr_l_[PADL_(caddr_t)]; caddr_t addr; char addr_r_[PADR_(caddr_t)];
char len_l_[PADL_(size_t)]; size_t len; char len_r_[PADR_(size_t)];
char prot_l_[PADL_(int)]; int prot; char prot_r_[PADR_(int)];
char flags_l_[PADL_(int)]; int flags; char flags_r_[PADR_(int)];
char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
char pad_l_[PADL_(int)]; int pad; char pad_r_[PADR_(int)];
char pos_l_[PADL_(off_t)]; off_t pos; char pos_r_[PADR_(off_t)];
};
extern char etext, edata, end;
/* GDT Descriptor */
struct gdtDescriptor {
unsigned short limitLow; /* Limit 0..15 */
unsigned short baseLow; /* Base 0..15 */
unsigned char baseMed; /* Base 16..23 */
unsigned char access; /* Access Byte */
unsigned int limitHigh :4; /* Limit 16..19 */
unsigned int granularity :4; /* Granularity */
unsigned char baseHigh; /* Base 24..31 */
}__attribute__ ((packed));
struct gdtGate {
unsigned short offsetLow; /* Offset 0..15 */
unsigned short selector; /* Selector */
unsigned short access; /* Access Flags */
unsigned short offsetHigh; /* Offset 16..31 */
}__attribute__ ((packed));
union descriptorTableUnion {
struct gdtDescriptor descriptor; /* Normal descriptor */
struct gdtGate gate; /* Gate descriptor */
unsigned long dummy; /* Any other info */
};
#define ubixDescriptorTable(name, length) union descriptorTableUnion name[length] =
#define ubixStandardDescriptor(base, limit, control) {.descriptor = {(limit & 0xffff), (base & 0xffff), ((base >> 16) & 0xff), ((control + dPresent) >> 8), (limit >> 16), ((control & 0xff) >> 4), (base >> 24)}}
#define ubixGateDescriptor(offset, selector, control) {.gate = {(offset & 0xffff), selector, (control+dPresent), (offset >> 16) }}
int main() {
int base = 0x1000;
int size = 4096 >> PAGE_SHIFT;
int *i = 0;
int x1 = 0;
int x2 = 0;
int x3 = 0;
int x4 = 0;
union descriptorTableUnion *LDT;
printf("sizeof(long) - %i\n", sizeof(long));
printf("sizeof(u_int32_t) - %i\n", sizeof(u_int32_t));
printf("end: 0x%X, etext: 0x%X, edata: 0x%X\n", &end, &etext, &edata);
asm(
"movl %%gs:0,%%eax\n"
"movl %%eax,%0\n"
: "=g" (x1)
:
: "eax"
);
i = (int *)x1;
printf("GS-i: [0x%X]\n", i);
printf("GS-*i: [0x%X]\n", *i);
asm(
"movl %%gs:4,%%eax\n"
"movl %%eax, %0\n"
: "=g" (x2)
:
: "eax"
);
i = (int *)x2;
printf("GS-i(2): [0x%X]\n", i);
printf("GS-*i(2): [0x%X]\n", *i);
asm(
"movl %%gs:8,%%eax\n"
"movl %%eax, %0\n"
: "=g" (x3)
:
: "eax"
);
i = (int *)x3;
printf("GS-i(3): [0x%X]\n", i);
//printf("GS-*i(3): [0x%X]\n", *i);
printf("x1: 0x%X, x2: 0x%X, x3: 0x%X, x2 - x1: 0x%X, (x2-x1)/4: 0x%X, Entries: %i\n", x1, x2 , x3, x2 - x1, (x2 - x1)/4, (x2-x1)/8);
i = (int *)x1;
/*
for (int z = 0; z < (x2 - x1)/4;z++) {
printf("V: [0x%X], ", i[z]);
}
*/
LDT = ( union descriptorTableUnion *)x1;
printf("\n");
printf("LDT[0].descriptor.baseLow: 0x%X\n", LDT[0].descriptor.baseLow);
printf("LDT[0].descriptor.baseMed: 0x%X\n", LDT[0].descriptor.baseMed);
printf("LDT[0].descriptor.baseHigh: 0x%X\n", LDT[0].descriptor.baseHigh);
printf("LDT[0].descriptor.limitLow: 0x%X\n", LDT[0].descriptor.limitLow);
printf("LDT[0].descriptor.limitHigh: 0x%X\n", LDT[0].descriptor.limitHigh);
printf("LDT[0]-Limit: [0x%X]\n", LDT[0].descriptor.limitLow + (LDT[0].descriptor.limitHigh << 16));
printf("LDT[0].descriptor.baseLow: 0x%X\n", LDT[0].descriptor.baseLow);
printf("LDT[0].descriptor.baseMed: 0x%X\n", LDT[0].descriptor.baseMed << 16);
printf("LDT[0].descriptor.baseHigh: 0x%X\n", LDT[0].descriptor.baseHigh << 24);
printf("LDT[0]-Base: [0x%X]\n", LDT[0].descriptor.baseLow + (LDT[0].descriptor.baseMed << 16) + (LDT[0].descriptor.baseHigh << 24));
printf("LDT[0].descriptor.access: 0x%X\n", LDT[0].descriptor.access);
printf("LDT[0].descriptor.granularity: 0x%X\n", LDT[0].descriptor.granularity);
printf("LDT[500].descriptor.baseLow: 0x%X\n", LDT[500].descriptor.baseLow);
printf("LDT[500].descriptor.baseMed: 0x%X\n", LDT[500].descriptor.baseMed);
printf("LDT[500].descriptor.baseHigh: 0x%X\n", LDT[500].descriptor.baseHigh);
printf("LDT[500].descriptor.baseLow: 0x%X\n", LDT[500].descriptor.baseLow);
printf("LDT[500].descriptor.baseMed: 0x%X\n", LDT[500].descriptor.baseMed << 16);
printf("LDT[500].descriptor.baseHigh: 0x%X\n", LDT[500].descriptor.baseHigh << 24);
printf("LDT[500]-Base: [0x%X]\n", LDT[500].descriptor.baseLow + (LDT[500].descriptor.baseMed << 16) + (LDT[500].descriptor.baseHigh << 24));
printf("LDT[500].descriptor.access: 0x%X\n", LDT[500].descriptor.access);
printf("LDT[500].descriptor.granularity: 0x%X\n", LDT[500].descriptor.granularity);
printf("LDT[501]-Base: [0x%X]\n", LDT[501].descriptor.baseLow + (LDT[501].descriptor.baseMed << 16) + (LDT[501].descriptor.baseHigh << 24));
printf("LDT[501].descriptor.access: 0x%X\n", LDT[501].descriptor.access);
printf("LDT[501].descriptor.granularity: 0x%X\n", LDT[501].descriptor.granularity);
asm(
"movl %%gs:12,%%eax\n"
"movl %%eax, %0\n"
: "=g" (x4)
:
: "eax"
);
i = (int *)x4;
printf("GS-i(3): [0x%X]\n", i);
//printf("GS-*i(3): [0x%X]\n", *i);
asm(
"movl %%fs,%%eax\n"
"movl %%eax, %0\n"
: "=g" (x1)
:
: "eax"
);
printf("FS: [0x%X]\n", x1);
asm(
"movl %%ebp, %0\n"
: "=g" (x1)
:
: "eax"
);
printf("EBP: [0x%X]\n", x1);
asm(
"movl %%esp, %0\n"
: "=g" (x1)
:
: "eax"
);
printf("ESP: [0x%X]\n", x1);
exit(0);
printf("%i %i %i %i %i %i %i", sizeof(void *), sizeof(size_t), sizeof(int), sizeof(int), sizeof(int), sizeof(off_t), sizeof(struct freebsd6_mmap_args));
return(0);
// char buffer[0x10000];
// mmap(&buffer, 0x10, 0x20, 0x30 , 0x5 ,0x0);
printf("[%i]\n", *i);
struct thread td;
td.vm_daddr = (char *)0x1000;
td.vm_dsize = 4096 >> PAGE_SHIFT;
//td = malloc(sizeof(struct thread));
printf("Base: 0x%X, Size: 0x%X, Shift: 0x%X\n", base, size, (base + (size << PAGE_SHIFT)));
printf("Base: 0x%X, Size: 0x%X, Shift: 0x%X\n", (u_int32_t)td.vm_daddr, td.vm_dsize, (u_int32_t)td.vm_daddr + (td.vm_dsize << PAGE_SHIFT));
printf("sizeof(int *) = %i\n", sizeof(int *));
return(0);
}