Source to machdep/i386/idt.c


Enter a symbol's name here to quickly find it.

/*
 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
 *
 * @APPLE_LICENSE_HEADER_START@
 * 
 * "Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
 * Reserved.  This file contains Original Code and/or Modifications of
 * Original Code as defined in and that are subject to the Apple Public
 * Source License Version 1.0 (the 'License').  You may not use this file
 * except in compliance with the License.  Please obtain a copy of the
 * License at http://www.apple.com/publicsource and read it before using
 * this file.
 * 
 * The Original Code and all software distributed under the License are
 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
 * License for the specific language governing rights and limitations
 * under the License."
 * 
 * @APPLE_LICENSE_HEADER_END@
 */

/*
 * Copyright (c) 1992 NeXT Computer, Inc.
 *
 * Intel386 Family:	Interrupt descriptor table.
 *
 * HISTORY
 *
 * 3 April 1992 ? at NeXT
 *	Created.
 */

#import <mach/mach_types.h>

#import <architecture/i386/table.h>

#import <machdep/i386/idt.h>
#import <machdep/i386/desc_inline.h>

extern trp_divr(), trp_debg(), int__nmi(), trp_brpt(); 
extern trp_over(), flt_bnds(), flt_opcd(), flt_ncpr(); 
extern abt_dblf(), abt_over(), flt_btss(), flt_bseg();
extern flt_bstk(), flt_prot(), trp_0x0F(), flt_page();
extern flt_bcpr(), trp_0x11(), trp_0x12(), trp_0x13();
extern trp_0x14(), trp_0x15(), trp_0x16(), trp_0x17();
extern trp_0x18(), trp_0x19(), trp_0x1A(), trp_0x1B();
extern trp_0x1C(), trp_0x1D(), trp_0x1E(), trp_0x1F();
extern trp_0x20(), trp_0x21(), trp_0x22(), trp_0x23();
extern trp_0x24(), trp_0x25(), trp_0x26(), trp_0x27();
extern trp_0x28(), trp_0x29(), trp_0x2A(), trp_0x2B();
extern trp_0x2C(), trp_0x2D(), trp_0x2E(), trp_0x2F();
extern trp_0x30(), trp_0x31(), trp_0x32(), trp_0x33();
extern trp_0x34(), trp_0x35(), trp_0x36(), trp_0x37();
extern trp_0x38(), trp_0x39(), trp_0x3A(), trp_0x3B();
extern trp_0x3C(), trp_0x3D(), trp_0x3E(), trp_0x3F();

extern int_0x40(), int_0x41(), int_0x42(), int_0x43();
extern int_0x44(), int_0x45(), int_0x46(), int_0x47();
extern int_0x48(), int_0x49(), int_0x4A(), int_0x4B();
extern int_0x4C(), int_0x4D(), int_0x4E(), int_0x4F();
extern int_0x50(), int_0x51(), int_0x52(), int_0x53();
extern int_0x54(), int_0x55(), int_0x56(), int_0x57();
extern int_0x58(), int_0x59(), int_0x5A(), int_0x5B();
extern int_0x5C(), int_0x5D(), int_0x5E(), int_0x5F();
extern int_0x60(), int_0x61(), int_0x62(), int_0x63();
extern int_0x64(), int_0x65(), int_0x66(), int_0x67();
extern int_0x68(), int_0x69(), int_0x6A(), int_0x6B();
extern int_0x6C(), int_0x6D(), int_0x6E(), int_0x6F();
extern int_0x70(), int_0x71(), int_0x72(), int_0x73();
extern int_0x74(), int_0x75(), int_0x76(), int_0x77();
extern int_0x78(), int_0x79(), int_0x7A(), int_0x7B();
extern int_0x7C(), int_0x7D(), int_0x7E(), int_0x7F();
extern int_0x80(), int_0x81(), int_0x82(), int_0x83();
extern int_0x84(), int_0x85(), int_0x86(), int_0x87();
extern int_0x88(), int_0x89(), int_0x8A(), int_0x8B();
extern int_0x8C(), int_0x8D(), int_0x8E(), int_0x8F();
extern int_0x90(), int_0x91(), int_0x92(), int_0x93();
extern int_0x94(), int_0x95(), int_0x96(), int_0x97();
extern int_0x98(), int_0x99(), int_0x9A(), int_0x9B();
extern int_0x9C(), int_0x9D(), int_0x9E(), int_0x9F();
extern int_0xA0(), int_0xA1(), int_0xA2(), int_0xA3();
extern int_0xA4(), int_0xA5(), int_0xA6(), int_0xA7();
extern int_0xA8(), int_0xA9(), int_0xAA(), int_0xAB();
extern int_0xAC(), int_0xAD(), int_0xAE(), int_0xAF();
extern int_0xB0(), int_0xB1(), int_0xB2(), int_0xB3();
extern int_0xB4(), int_0xB5(), int_0xB6(), int_0xB7();
extern int_0xB8(), int_0xB9(), int_0xBA(), int_0xBB();
extern int_0xBC(), int_0xBD(), int_0xBE(), int_0xBF();
extern int_0xC0(), int_0xC1(), int_0xC2(), int_0xC3();
extern int_0xC4(), int_0xC5(), int_0xC6(), int_0xC7();
extern int_0xC8(), int_0xC9(), int_0xCA(), int_0xCB();
extern int_0xCC(), int_0xCD(), int_0xCE(), int_0xCF();
extern int_0xD0(), int_0xD1(), int_0xD2(), int_0xD3();
extern int_0xD4(), int_0xD5(), int_0xD6(), int_0xD7();
extern int_0xD8(), int_0xD9(), int_0xDA(), int_0xDB();
extern int_0xDC(), int_0xDD(), int_0xDE(), int_0xDF();
extern int_0xE0(), int_0xE1(), int_0xE2(), int_0xE3();
extern int_0xE4(), int_0xE5(), int_0xE6(), int_0xE7();
extern int_0xE8(), int_0xE9(), int_0xEA(), int_0xEB();
extern int_0xEC(), int_0xED(), int_0xEE(), int_0xEF();
extern int_0xF0(), int_0xF1(), int_0xF2(), int_0xF3();
extern int_0xF4(), int_0xF5(), int_0xF6(), int_0xF7();
extern int_0xF8(), int_0xF9(), int_0xFA(), int_0xFB();
extern int_0xFC(), int_0xFD(), int_0xFE(), int_0xFF();

void
locate_idt(
    vm_offset_t		base
)
{
    extern
	unsigned int	idt_base;
    extern
	unsigned short	idt_limit;
	
    idt_base = base;
    idt_limit = (IDTSZ * sizeof (idt_entry_t)) - 1;
    
    asm volatile("lidt %0"
		    :
		    : "m" (idt_limit));
}


typedef struct {
    vm_offset_t		offset;
    sel_t		seg;
    unsigned short	type	:5,
    			dpl	:2,
				:9;
} idt_pseudo_entry_t;

idt_pseudo_entry_t	idt_pseudo[];

void
idt_init(void)
{
    idt_pseudo_entry_t	tmp;
    int			i;

    for (i = 0; i < IDTSZ; i++) {
	tmp = idt_pseudo[i];
	if (tmp.type == DESC_TRAP_GATE)
	    make_trap_gate((trap_gate_t *)&idt[i],
					    tmp.seg,
					    tmp.offset,
					    tmp.dpl);
	else
	if (tmp.type == DESC_INTR_GATE)
	    make_intr_gate((intr_gate_t *)&idt[i],
					    tmp.seg,
					    tmp.offset,
					    tmp.dpl);
	else
	if (tmp.type == DESC_TASK_GATE)
	    make_task_gate((task_gate_t *)&idt[i],
					    tmp.seg,
					    tmp.offset,
					    tmp.dpl);
    }
    
    locate_idt((vm_offset_t) idt);
}

#define IPE(o, t, p)	\
    { (vm_offset_t)(o), KCS_SEL, (t), (p) }

#define TG	DESC_TRAP_GATE
#define IG	DESC_INTR_GATE
#define K	KERN_PRIV
#define U	USER_PRIV

idt_pseudo_entry_t	idt_pseudo[IDTSZ] = {
    IPE(trp_divr,	TG, K),
    IPE(trp_debg,	IG, K),
    IPE(int__nmi,	IG, K),
    IPE(trp_brpt,	TG, U),
    IPE(trp_over,	TG, U),
    IPE(flt_bnds,	TG, U),
    IPE(flt_opcd,	TG, K),
    IPE(flt_ncpr,	TG, K),
    IPE(abt_dblf,	TG, K),
    IPE(abt_over,	TG, K),
    IPE(flt_btss,	TG, K),
    IPE(flt_bseg,	TG, K),
    IPE(flt_bstk,	TG, K),
    IPE(flt_prot,	TG, K),
    IPE(flt_page,	TG, K),
    IPE(trp_0x0F,	TG, K),
    IPE(flt_bcpr,	TG, K),
    IPE(trp_0x11,	TG, K),
    IPE(trp_0x12,	TG, K),
    IPE(trp_0x13,	TG, K),
    IPE(trp_0x14,	TG, K),
    IPE(trp_0x15,	TG, K),
    IPE(trp_0x16,	TG, K),
    IPE(trp_0x17,	TG, K),
    IPE(trp_0x18,	TG, K),
    IPE(trp_0x19,	TG, K),
    IPE(trp_0x1A,	TG, K),
    IPE(trp_0x1B,	TG, K),
    IPE(trp_0x1C,	TG, K),
    IPE(trp_0x1D,	TG, K),
    IPE(trp_0x1E,	TG, K),
    IPE(trp_0x1F,	TG, K),
    IPE(trp_0x20,	TG, K),
    IPE(trp_0x21,	TG, K),
    IPE(trp_0x22,	TG, K),
    IPE(trp_0x23,	TG, K),
    IPE(trp_0x24,	TG, K),
    IPE(trp_0x25,	TG, K),
    IPE(trp_0x26,	TG, K),
    IPE(trp_0x27,	TG, K),
    IPE(trp_0x28,	TG, K),
    IPE(trp_0x29,	TG, K),
    IPE(trp_0x2A,	TG, K),
    IPE(trp_0x2B,	TG, K),
    IPE(trp_0x2C,	TG, K),
    IPE(trp_0x2D,	TG, K),
    IPE(trp_0x2E,	TG, K),
    IPE(trp_0x2F,	TG, K),
    IPE(trp_0x30,	TG, K),
    IPE(trp_0x31,	TG, K),
    IPE(trp_0x32,	TG, K),
    IPE(trp_0x33,	TG, K),
    IPE(trp_0x34,	TG, K),
    IPE(trp_0x35,	TG, K),
    IPE(trp_0x36,	TG, K),
    IPE(trp_0x37,	TG, K),
    IPE(trp_0x38,	TG, K),
    IPE(trp_0x39,	TG, K),
    IPE(trp_0x3A,	TG, K),
    IPE(trp_0x3B,	TG, K),
    IPE(trp_0x3C,	TG, K),
    IPE(trp_0x3D,	TG, K),
    IPE(trp_0x3E,	TG, K),
    IPE(trp_0x3F,	TG, K),

    IPE(int_0x40,	IG, K),
    IPE(int_0x41,	IG, K),
    IPE(int_0x42,	IG, K),
    IPE(int_0x43,	IG, K),
    IPE(int_0x44,	IG, K),
    IPE(int_0x45,	IG, K),
    IPE(int_0x46,	IG, K),
    IPE(int_0x47,	IG, K),
    IPE(int_0x48,	IG, K),
    IPE(int_0x49,	IG, K),
    IPE(int_0x4A,	IG, K),
    IPE(int_0x4B,	IG, K),
    IPE(int_0x4C,	IG, K),
    IPE(int_0x4D,	IG, K),
    IPE(int_0x4E,	IG, K),
    IPE(int_0x4F,	IG, K),
    IPE(int_0x50,	IG, K),
    IPE(int_0x51,	IG, K),
    IPE(int_0x52,	IG, K),
    IPE(int_0x53,	IG, K),
    IPE(int_0x54,	IG, K),
    IPE(int_0x55,	IG, K),
    IPE(int_0x56,	IG, K),
    IPE(int_0x57,	IG, K),
    IPE(int_0x58,	IG, K),
    IPE(int_0x59,	IG, K),
    IPE(int_0x5A,	IG, K),
    IPE(int_0x5B,	IG, K),
    IPE(int_0x5C,	IG, K),
    IPE(int_0x5D,	IG, K),
    IPE(int_0x5E,	IG, K),
    IPE(int_0x5F,	IG, K),
    IPE(int_0x60,	IG, K),
    IPE(int_0x61,	IG, K),
    IPE(int_0x62,	IG, K),
    IPE(int_0x63,	IG, K),
    IPE(int_0x64,	IG, K),
    IPE(int_0x65,	IG, K),
    IPE(int_0x66,	IG, K),
    IPE(int_0x67,	IG, K),
    IPE(int_0x68,	IG, K),
    IPE(int_0x69,	IG, K),
    IPE(int_0x6A,	IG, K),
    IPE(int_0x6B,	IG, K),
    IPE(int_0x6C,	IG, K),
    IPE(int_0x6D,	IG, K),
    IPE(int_0x6E,	IG, K),
    IPE(int_0x6F,	IG, K),
    IPE(int_0x70,	IG, K),
    IPE(int_0x71,	IG, K),
    IPE(int_0x72,	IG, K),
    IPE(int_0x73,	IG, K),
    IPE(int_0x74,	IG, K),
    IPE(int_0x75,	IG, K),
    IPE(int_0x76,	IG, K),
    IPE(int_0x77,	IG, K),
    IPE(int_0x78,	IG, K),
    IPE(int_0x79,	IG, K),
    IPE(int_0x7A,	IG, K),
    IPE(int_0x7B,	IG, K),
    IPE(int_0x7C,	IG, K),
    IPE(int_0x7D,	IG, K),
    IPE(int_0x7E,	IG, K),
    IPE(int_0x7F,	IG, K),
    IPE(int_0x80,	IG, K),
    IPE(int_0x81,	IG, K),
    IPE(int_0x82,	IG, K),
    IPE(int_0x83,	IG, K),
    IPE(int_0x84,	IG, K),
    IPE(int_0x85,	IG, K),
    IPE(int_0x86,	IG, K),
    IPE(int_0x87,	IG, K),
    IPE(int_0x88,	TG, K),
    IPE(int_0x89,	TG, K),
    IPE(int_0x8A,	TG, K),	
    IPE(int_0x8B,	TG, K),
    IPE(int_0x8C,	TG, K),
    IPE(int_0x8D,	TG, K),
    IPE(int_0x8E,	TG, K),
    IPE(int_0x8F,	TG, K),
    IPE(int_0x90,	TG, K),
    IPE(int_0x91,	TG, K),
    IPE(int_0x92,	TG, K),
    IPE(int_0x93,	TG, K),
    IPE(int_0x94,	TG, K),
    IPE(int_0x95,	TG, K),
    IPE(int_0x96,	TG, K),
    IPE(int_0x97,	TG, K),
    IPE(int_0x98,	TG, K),
    IPE(int_0x99,	TG, K),
    IPE(int_0x9A,	TG, K),
    IPE(int_0x9B,	TG, K),
    IPE(int_0x9C,	TG, K),
    IPE(int_0x9D,	TG, K),
    IPE(int_0x9E,	TG, K),
    IPE(int_0x9F,	TG, K),
    IPE(int_0xA0,	TG, K),
    IPE(int_0xA1,	TG, K),
    IPE(int_0xA2,	TG, K),
    IPE(int_0xA3,	TG, K),
    IPE(int_0xA4,	TG, K),
    IPE(int_0xA5,	TG, K),
    IPE(int_0xA6,	TG, K),
    IPE(int_0xA7,	TG, K),
    IPE(int_0xA8,	TG, K),
    IPE(int_0xA9,	TG, K),
    IPE(int_0xAA,	TG, K),
    IPE(int_0xAB,	TG, K),
    IPE(int_0xAC,	TG, K),
    IPE(int_0xAD,	TG, K),
    IPE(int_0xAE,	TG, K),
    IPE(int_0xAF,	TG, K),	
    IPE(int_0xB0,	TG, K),	
    IPE(int_0xB1,	TG, K),	
    IPE(int_0xB2,	TG, K),	
    IPE(int_0xB3,	TG, K),	
    IPE(int_0xB4,	TG, K),	
    IPE(int_0xB5,	TG, K),	
    IPE(int_0xB6,	TG, K),	
    IPE(int_0xB7,	TG, K),	
    IPE(int_0xB8,	TG, K),	
    IPE(int_0xB9,	TG, K),	
    IPE(int_0xBA,	TG, K),	
    IPE(int_0xBB,	TG, K),	
    IPE(int_0xBC,	TG, K),	
    IPE(int_0xBD,	TG, K),	
    IPE(int_0xBE,	TG, K),	
    IPE(int_0xBF,	TG, K),	
    IPE(int_0xC0,	TG, K),	
    IPE(int_0xC1,	TG, K),	
    IPE(int_0xC2,	TG, K),	
    IPE(int_0xC3,	TG, K),	
    IPE(int_0xC4,	TG, K),	
    IPE(int_0xC5,	TG, K),
    IPE(int_0xC6,	TG, K),
    IPE(int_0xC7,	TG, K),
    IPE(int_0xC8,	TG, K),
    IPE(int_0xC9,	TG, K),
    IPE(int_0xCA,	TG, K),
    IPE(int_0xCB,	TG, K),
    IPE(int_0xCC,	TG, K),
    IPE(int_0xCD,	TG, K),
    IPE(int_0xCE,	TG, K),
    IPE(int_0xCF,	TG, K),
    IPE(int_0xD0,	TG, K),
    IPE(int_0xD1,	TG, K),
    IPE(int_0xD2,	TG, K),
    IPE(int_0xD3,	TG, K),
    IPE(int_0xD4,	TG, K),
    IPE(int_0xD5,	TG, K),
    IPE(int_0xD6,	TG, K),
    IPE(int_0xD7,	TG, K),
    IPE(int_0xD8,	TG, K),
    IPE(int_0xD9,	TG, K),
    IPE(int_0xDA,	TG, K),
    IPE(int_0xDB,	TG, K),
    IPE(int_0xDC,	TG, K),
    IPE(int_0xDD,	TG, K),
    IPE(int_0xDE,	TG, K),
    IPE(int_0xDF,	TG, K),
    IPE(int_0xE0,	TG, K),
    IPE(int_0xE1,	TG, K),
    IPE(int_0xE2,	TG, K),
    IPE(int_0xE3,	TG, K),
    IPE(int_0xE4,	TG, K),
    IPE(int_0xE5,	TG, K),
    IPE(int_0xE6,	TG, K),
    IPE(int_0xE7,	TG, K),
    IPE(int_0xE8,	TG, K),
    IPE(int_0xE9,	TG, K),
    IPE(int_0xEA,	TG, K),
    IPE(int_0xEB,	TG, K),
    IPE(int_0xEC,	TG, K),
    IPE(int_0xED,	TG, K),
    IPE(int_0xEE,	TG, K),
    IPE(int_0xEF,	TG, K),
    IPE(int_0xF0,	TG, K),
    IPE(int_0xF1,	TG, K),
    IPE(int_0xF2,	TG, K),
    IPE(int_0xF3,	TG, K),
    IPE(int_0xF4,	TG, K),
    IPE(int_0xF5,	TG, K),
    IPE(int_0xF6,	TG, K),
    IPE(int_0xF7,	TG, K),
    IPE(int_0xF8,	TG, K),
    IPE(int_0xF9,	TG, K),
    IPE(int_0xFA,	TG, K),
    IPE(int_0xFB,	TG, K),
    IPE(int_0xFC,	TG, K),
    IPE(int_0xFD,	TG, K),
    IPE(int_0xFE,	TG, K),
    IPE(int_0xFF,	TG, K),
};

idt_t *		idt = (idt_entry_t *)idt_pseudo;

void
idt_copy(
    vm_offset_t		new_idt,
    vm_size_t		length
)
{
    if (length < (IDTSZ * sizeof (idt_entry_t)))
	panic("idt_copy");

    (void) memcpy((void *)new_idt, idt, IDTSZ * sizeof (idt_entry_t));
    (vm_offset_t)idt = new_idt;

    locate_idt((vm_offset_t) idt);
}