include-asm
汇编
io.h
#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;
})
memory.h
/*
- 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;
})
segment.h
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));
}
system.h
#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”
“movw %%ax,%%ds\n\t”
“movw %%ax,%%es\n\t”
“movw %%ax,%%fs\n\t”
“movw %%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”)