initial version
This commit is contained in:
24
Book-Lite/linux-0.12/include/asm/io.h
Normal file
24
Book-Lite/linux-0.12/include/asm/io.h
Normal file
@@ -0,0 +1,24 @@
|
||||
#define outb(value,port) \
|
||||
__asm__ ("outb %%al,%%dx"::"a" (value),"d" (port))
|
||||
|
||||
|
||||
#define inb(port) ({ \
|
||||
unsigned char _v; \
|
||||
__asm__ volatile ("inb %%dx,%%al":"=a" (_v):"d" (port)); \
|
||||
_v; \
|
||||
})
|
||||
|
||||
#define outb_p(value,port) \
|
||||
__asm__ ("outb %%al,%%dx\n" \
|
||||
"\tjmp 1f\n" \
|
||||
"1:\tjmp 1f\n" \
|
||||
"1:"::"a" (value),"d" (port))
|
||||
|
||||
#define inb_p(port) ({ \
|
||||
unsigned char _v; \
|
||||
__asm__ volatile ("inb %%dx,%%al\n" \
|
||||
"\tjmp 1f\n" \
|
||||
"1:\tjmp 1f\n" \
|
||||
"1:":"=a" (_v):"d" (port)); \
|
||||
_v; \
|
||||
})
|
||||
14
Book-Lite/linux-0.12/include/asm/memory.h
Normal file
14
Book-Lite/linux-0.12/include/asm/memory.h
Normal file
@@ -0,0 +1,14 @@
|
||||
/*
|
||||
* NOTE!!! memcpy(dest,src,n) assumes ds=es=normal data segment. This
|
||||
* goes for all kernel functions (ds=es=kernel space, fs=local data,
|
||||
* gs=null), as well as for all well-behaving user programs (ds=es=
|
||||
* user data space). This is NOT a bug, as any user program that changes
|
||||
* es deserves to die if it isn't careful.
|
||||
*/
|
||||
#define memcpy(dest,src,n) ({ \
|
||||
void * _res = dest; \
|
||||
__asm__ ("cld;rep;movsb" \
|
||||
::"D" ((long)(_res)),"S" ((long)(src)),"c" ((long) (n)) \
|
||||
:"di","si","cx"); \
|
||||
_res; \
|
||||
})
|
||||
65
Book-Lite/linux-0.12/include/asm/segment.h
Normal file
65
Book-Lite/linux-0.12/include/asm/segment.h
Normal file
@@ -0,0 +1,65 @@
|
||||
extern inline unsigned char get_fs_byte(const char * addr)
|
||||
{
|
||||
unsigned register char _v;
|
||||
|
||||
__asm__ ("movb %%fs:%1,%0":"=r" (_v):"m" (*addr));
|
||||
return _v;
|
||||
}
|
||||
|
||||
extern inline unsigned short get_fs_word(const unsigned short *addr)
|
||||
{
|
||||
unsigned short _v;
|
||||
|
||||
__asm__ ("movw %%fs:%1,%0":"=r" (_v):"m" (*addr));
|
||||
return _v;
|
||||
}
|
||||
|
||||
extern inline unsigned long get_fs_long(const unsigned long *addr)
|
||||
{
|
||||
unsigned long _v;
|
||||
|
||||
__asm__ ("movl %%fs:%1,%0":"=r" (_v):"m" (*addr)); \
|
||||
return _v;
|
||||
}
|
||||
|
||||
extern inline void put_fs_byte(char val,char *addr)
|
||||
{
|
||||
__asm__ ("movb %0,%%fs:%1"::"r" (val),"m" (*addr));
|
||||
}
|
||||
|
||||
extern inline void put_fs_word(short val,short * addr)
|
||||
{
|
||||
__asm__ ("movw %0,%%fs:%1"::"r" (val),"m" (*addr));
|
||||
}
|
||||
|
||||
extern inline void put_fs_long(unsigned long val,unsigned long * addr)
|
||||
{
|
||||
__asm__ ("movl %0,%%fs:%1"::"r" (val),"m" (*addr));
|
||||
}
|
||||
|
||||
/*
|
||||
* Someone who knows GNU asm better than I should double check the followig.
|
||||
* It seems to work, but I don't know if I'm doing something subtly wrong.
|
||||
* --- TYT, 11/24/91
|
||||
* [ nothing wrong here, Linus ]
|
||||
*/
|
||||
|
||||
extern inline unsigned long get_fs()
|
||||
{
|
||||
unsigned short _v;
|
||||
__asm__("mov %%fs,%%ax":"=a" (_v):);
|
||||
return _v;
|
||||
}
|
||||
|
||||
extern inline unsigned long get_ds()
|
||||
{
|
||||
unsigned short _v;
|
||||
__asm__("mov %%ds,%%ax":"=a" (_v):);
|
||||
return _v;
|
||||
}
|
||||
|
||||
extern inline void set_fs(unsigned long val)
|
||||
{
|
||||
__asm__("mov %0,%%fs"::"a" ((unsigned short) val));
|
||||
}
|
||||
|
||||
66
Book-Lite/linux-0.12/include/asm/system.h
Normal file
66
Book-Lite/linux-0.12/include/asm/system.h
Normal file
@@ -0,0 +1,66 @@
|
||||
#define move_to_user_mode() \
|
||||
__asm__ ("movl %%esp,%%eax\n\t" \
|
||||
"pushl $0x17\n\t" \
|
||||
"pushl %%eax\n\t" \
|
||||
"pushfl\n\t" \
|
||||
"pushl $0x0f\n\t" \
|
||||
"pushl $1f\n\t" \
|
||||
"iret\n" \
|
||||
"1:\tmovl $0x17,%%eax\n\t" \
|
||||
"mov %%ax,%%ds\n\t" \
|
||||
"mov %%ax,%%es\n\t" \
|
||||
"mov %%ax,%%fs\n\t" \
|
||||
"mov %%ax,%%gs" \
|
||||
:::"ax")
|
||||
|
||||
#define sti() __asm__ ("sti"::)
|
||||
#define cli() __asm__ ("cli"::)
|
||||
#define nop() __asm__ ("nop"::)
|
||||
|
||||
#define iret() __asm__ ("iret"::)
|
||||
|
||||
#define _set_gate(gate_addr,type,dpl,addr) \
|
||||
__asm__ ("movw %%dx,%%ax\n\t" \
|
||||
"movw %0,%%dx\n\t" \
|
||||
"movl %%eax,%1\n\t" \
|
||||
"movl %%edx,%2" \
|
||||
: \
|
||||
: "i" ((short) (0x8000+(dpl<<13)+(type<<8))), \
|
||||
"o" (*((char *) (gate_addr))), \
|
||||
"o" (*(4+(char *) (gate_addr))), \
|
||||
"d" ((char *) (addr)),"a" (0x00080000))
|
||||
|
||||
#define set_intr_gate(n,addr) \
|
||||
_set_gate(&idt[n],14,0,addr)
|
||||
|
||||
#define set_trap_gate(n,addr) \
|
||||
_set_gate(&idt[n],15,0,addr)
|
||||
|
||||
#define set_system_gate(n,addr) \
|
||||
_set_gate(&idt[n],15,3,addr)
|
||||
|
||||
#define _set_seg_desc(gate_addr,type,dpl,base,limit) {\
|
||||
*(gate_addr) = ((base) & 0xff000000) | \
|
||||
(((base) & 0x00ff0000)>>16) | \
|
||||
((limit) & 0xf0000) | \
|
||||
((dpl)<<13) | \
|
||||
(0x00408000) | \
|
||||
((type)<<8); \
|
||||
*((gate_addr)+1) = (((base) & 0x0000ffff)<<16) | \
|
||||
((limit) & 0x0ffff); }
|
||||
|
||||
#define _set_tssldt_desc(n,addr,type) \
|
||||
__asm__ ("movw $104,%1\n\t" \
|
||||
"movw %%ax,%2\n\t" \
|
||||
"rorl $16,%%eax\n\t" \
|
||||
"movb %%al,%3\n\t" \
|
||||
"movb $" type ",%4\n\t" \
|
||||
"movb $0x00,%5\n\t" \
|
||||
"movb %%ah,%6\n\t" \
|
||||
"rorl $16,%%eax" \
|
||||
::"a" (addr), "m" (*(n)), "m" (*(n+2)), "m" (*(n+4)), \
|
||||
"m" (*(n+5)), "m" (*(n+6)), "m" (*(n+7)) \
|
||||
)
|
||||
|
||||
#define set_tss_desc(n,addr) _set_tssldt_desc(((char *) (n)),addr,"0x89")
|
||||
#define set_ldt_desc(n,addr) _set_tssldt_desc(((char *) (n)),addr,"0x82")
|
||||
Reference in New Issue
Block a user