f850a6df1f
- put /*comments symbols*/ around any chars after #endif. Other compilers do not get it. - fix cases in which a pointer is cast to a 32-bit int, then back to a pointer. This breaks on a machine with 64-bit pointers. Examples: FPU_sub arg 2 and FPU_div arg 2. The int->ptr->int conversions are now done more safely by macros REGNO2PTR and PTR2INT. - use GCC_ATTRIBUTE macro instead of __attribute__. For compilers that do not support __attribute__, the macro can be defined to be nothing. - in fpu_entry.c, arg1 of FPU_load_int32 is (s32*), but the calls to it cast their data to (u32*). - if compiler does NOT inline functions in poly.h, the "extern inline" setting caused duplicate symbols to be created. Changed them to "static inline" so that the mul_32_32 from different .c files do not conflict. - implemented setcc so that it doesn't use curly brackets inside parens - comment out sigcontext structure definition, which conflicts with non-linux or non-intel operating systems. It's not used by bochs anyway.
62 lines
1.6 KiB
C
62 lines
1.6 KiB
C
#ifndef __ARCH_DESC_H
|
|
#define __ARCH_DESC_H
|
|
|
|
struct desc_struct {
|
|
unsigned long a,b;
|
|
};
|
|
|
|
extern struct desc_struct gdt_table[];
|
|
extern struct desc_struct *idt, *gdt;
|
|
|
|
struct Xgt_desc_struct {
|
|
unsigned short size;
|
|
unsigned long address GCC_ATTRIBUTE((packed));
|
|
};
|
|
|
|
#define idt_descr (*(struct Xgt_desc_struct *)((char *)&idt - 2))
|
|
#define gdt_descr (*(struct Xgt_desc_struct *)((char *)&gdt - 2))
|
|
|
|
/*
|
|
* Entry into gdt where to find first TSS. GDT layout:
|
|
* 0 - null
|
|
* 1 - not used
|
|
* 2 - kernel code segment
|
|
* 3 - kernel data segment
|
|
* 4 - user code segment
|
|
* 5 - user data segment
|
|
* 6 - not used
|
|
* 7 - not used
|
|
* 8 - APM BIOS support
|
|
* 9 - APM BIOS support
|
|
* 10 - APM BIOS support
|
|
* 11 - APM BIOS support
|
|
* 12 - TSS #0
|
|
* 13 - LDT #0
|
|
* 14 - TSS #1
|
|
* 15 - LDT #1
|
|
*/
|
|
#define FIRST_TSS_ENTRY 12
|
|
#define FIRST_LDT_ENTRY (FIRST_TSS_ENTRY+1)
|
|
#define _TSS(n) ((((unsigned long) n)<<4)+(FIRST_TSS_ENTRY<<3))
|
|
#define _LDT(n) ((((unsigned long) n)<<4)+(FIRST_LDT_ENTRY<<3))
|
|
#define load_TR(n) __asm__ __volatile__("ltr %%ax": /* no output */ :"a" (_TSS(n)))
|
|
#define load_ldt(n) __asm__ __volatile__("lldt %%ax": /* no output */ :"a" (_LDT(n)))
|
|
#define store_TR(n) \
|
|
__asm__("str %%ax\n\t" \
|
|
"subl %2,%%eax\n\t" \
|
|
"shrl $4,%%eax" \
|
|
:"=a" (n) \
|
|
:"0" (0),"i" (FIRST_TSS_ENTRY<<3))
|
|
|
|
extern void set_intr_gate(unsigned int irq, void * addr);
|
|
extern void set_ldt_desc(unsigned int n, void *addr, unsigned int size);
|
|
extern void set_tss_desc(unsigned int n, void *addr);
|
|
|
|
/*
|
|
* This is the ldt that every process will get unless we need
|
|
* something other than this.
|
|
*/
|
|
extern struct desc_struct default_ldt;
|
|
|
|
#endif
|