URL
https://opencores.org/ocsvn/or1k/or1k/trunk
Subversion Repositories or1k
[/] [or1k/] [trunk/] [rtems/] [c/] [src/] [lib/] [libcpu/] [i386/] [cpu_asm.S] - Rev 1765
Compare with Previous | Blame | View Log
/* 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.OARcorp.com/rtems/license.html.** $Id: cpu_asm.S,v 1.2 2001-09-27 12:01:22 chris 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)retEND_CODEEND
