📄 idtr.s
字号:
/* cpu_asm.S * * This file contains all assembly code for the Intel i386 IDT * manipulation. * * COPYRIGHT (c) 1998 valette@crf.canon.fr * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at * http://www.rtems.com/license/LICENSE. * * $Id: idtr.S,v 1.1.6.1 2003/09/04 18:45:43 joel Exp $ */#include <asm.h>BEGIN_CODE/* * C callable function enabling to get easilly usable info from * the actual value of IDT register. *extern void i386_get_info_from_IDTR (interrupt_gate_descriptor** table, unsigned* limit); */PUBLIC (i386_get_info_from_IDTR)PUBLIC (i386_set_IDTR)PUBLIC (i386_get_info_from_GDTR)PUBLIC (i386_set_GDTR) SYM (i386_get_info_from_IDTR): movl 4(esp), ecx /* get location where table address */ /* must be stored */ movl 8(esp), edx /* get location table size must be stored */ subl $6, esp /* let room to prepare 48 bit IDTR */ sidt (esp) /* get 48 bit IDTR value */ movl 2(esp), eax /* get base */ movl eax, (ecx) movzwl (esp), eax /* get limit */ movl eax, (edx) addl $6, esp /* restore %esp */ ret/* * C callable function enabling to change the value of IDT register. Must be called * with inmterrupt masked at processor level!!!. *extern void i386_set_IDTR (interrupt_gate_descriptor* table, unsigned limit); */SYM (i386_set_IDTR): leal 4(esp), edx /* load in edx address of input */ /* parameter "table" */ movl (edx), eax /* load base into eax */ movl 4(edx), ecx /* load limit into ecx */ movw cx, (edx) /* prepare 48 bit pointer */ movl eax, 2(edx) lidt (edx) ret/* * * C callable function enabling to get easilly usable info from * the actual value of GDT register.extern void i386_get_info_from_GDTR (segment_descriptors** table, unsigned* limit); */ SYM (i386_get_info_from_GDTR): movl 4(esp), ecx /* get location where table address */ /* must be stored */ movl 8(esp), edx /* get location table size must be stored */ subl $6, esp /* let room to prepare 48 bit GDTR */ sgdt (esp) /* get 48 bit GDTR value */ movl 2(esp), eax /* get base */ movl eax, (ecx) movzwl (esp), eax /* get limit */ movl eax, (edx) addl $6, esp /* restore %esp */ ret/* * C callable function enabling to change the value of GDT register. * Must be called with interrupts masked at processor level!!!. * extern void i386_set_GDTR (segment_descriptors*, unsigned limit); */SYM (i386_set_GDTR): leal 4(esp), edx /* load in edx address of input */ /* parameter "table" */ movl (edx), eax /* load base into eax */ movl 4(edx), ecx /* load limit into ecx */ movw cx, (edx) /* prepare 48 bit pointer */ movl eax, 2(edx) lgdt (edx) ret END_CODEEND
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -