/*-
* Copyright (c) 2002-2018 The UbixOS Project.
* All rights reserved.
*
* This was developed by Christopher W. Olsen for the UbixOS Project.
*
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met:
*
* 1) Redistributions of source code must retain the above copyright notice, this list of
* conditions, the following disclaimer and the list of authors.
* 2) Redistributions in binary form must reproduce the above copyright notice, this list of
* conditions, the following disclaimer and the list of authors in the documentation and/or
* other materials provided with the distribution.
* 3) Neither the name of the UbixOS Project nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _GDT_H_
#define _GDT_H_
#define SEL_GET_PL(sel) ((sel)&3) /* Get Priority Level Of Selector */
#define SEL_GET_LG(sel) ((sel)&4) /* Return Local/Global Descriptor */
#define SEL_GET_IDX(sel) (((sel)>>3) & 0x1FFF) /* Get Selector Index */
#define SEL_PL_KERN 0x0
#define SEL_PL_USER 0x3
/* Descriptor Definitions */
#define dCall 0x0C00 /* 386 Call Gate */
#define dCode 0x1800 /* Code Segment */
#define dData 0x1000 /* Data Segment */
#define dInt 0x0E00 /* 386 Interrupt Gate */
#define dLdt 0x200 /* Local Descriptor Table (LDT) */
#define dTask 0x500 /* Task gate */
#define dTrap 0x0F00 /* 386 Trap Gate */
#define dTss 0x900 /* Task State Segment (TSS) */
/* Descriptor Options */
#define dDpl3 0x6000 /* DPL3 or mask for DPL */
#define dDpl2 0x4000 /* DPL2 or mask for DPL */
#define dDpl1 0x2000 /* DPL1 or mask for DPL */
#define dDpl0 0x0000 /* DPL0 or mask for DPL */
#define dPresent 0x8000 /* Present */
#define dNpresent 0x8000 /* Not Present */
#define dAcc 0x100 /* Accessed (Data or Code) */
#define dWrite 0x200 /* Writable (Data segments only) */
#define dRead 0x200 /* Readable (Code segments only) */
#define dBusy 0xB00 /* Busy (TSS only) was 200 */
#define dEexdown 0x400 /* Expand down (Data segments only) */
#define dConform 0x400 /* Conforming (Code segments only) */
#define dBig 0x40 /* Default to 32 bit mode */
#define dBiglim 0x80 /* Limit is in 4K units */
/* GDT Descriptor */
struct gdtDescriptor {
unsigned short limitLow; /* Limit 0..15 */
unsigned short baseLow; /* Base 0..15 */
unsigned char baseMed; /* Base 16..23 */
unsigned char access; /* Access Byte */
unsigned int limitHigh :4; /* Limit 16..19 */
unsigned int granularity :4; /* Granularity */
unsigned char baseHigh; /* Base 24..31 */
}__attribute__ ((packed));
struct gdtGate {
unsigned short offsetLow; /* Offset 0..15 */
unsigned short selector; /* Selector */
unsigned short access; /* Access Flags */
unsigned short offsetHigh; /* Offset 16..31 */
}__attribute__ ((packed));
union descriptorTableUnion {
struct gdtDescriptor descriptor; /* Normal descriptor */
struct gdtGate gate; /* Gate descriptor */
unsigned long dummy; /* Any other info */
};
#define ubixDescriptorTable(name, length) union descriptorTableUnion name[length] =
#define ubixStandardDescriptor(base, limit, control) {.descriptor = {(limit & 0xffff), (base & 0xffff), ((base >> 16) & 0xff), ((control + dPresent) >> 8), (limit >> 16), ((control & 0xff) >> 4), (base >> 24)}}
#define ubixGateDescriptor(offset, selector, control) {.gate = {(offset & 0xffff), selector, (control+dPresent), (offset >> 16) }}
extern union descriptorTableUnion ubixGDT[11];
#endif
/***
$Log: gdt.h,v $
Revision 1.1.1.1 2006/06/01 12:46:15 reddawg
ubix2
Revision 1.2 2005/10/12 00:13:37 reddawg
Removed
Revision 1.1.1.1 2005/09/26 17:23:52 reddawg
no message
Revision 1.5 2004/08/15 16:47:49 reddawg
Fixed
Revision 1.4 2004/07/22 20:53:07 reddawg
atkbd: fixed problem
Revision 1.3 2004/05/21 15:12:17 reddawg
Cleaned up
END
***/