OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [rtems-20020807/] [c/] [src/] [lib/] [libcpu/] [i386/] [idtr.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.
 *
 *  idtr.S,v 1.1 2000/06/13 21:53:38 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_CODE

END

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.