/*
 * segment.h
 *
 * Copyright 2002, Minoru Murashima. All rights reserved.
 * Distributed under the terms of the BSD License.
 */


#ifndef segment_h
#define segment_h


#include"types.h"
#include"config.h"


#define	KERNEL_CODE_DES 0x8				/* カーネルコードディスクリプタ値 */
#define	KERNEL_DATA_DES 0x10			/* カーネルデータディスクリプタ値 */
#define	USER_CODE_DES 0x1b				/* ユーザーコードディスクリプタ値 */
#define	USER_DATA_DES 0x23				/* ユーザーデータディスクリプタ値 */
#define	TSS_DES 0x28					/* TSSディスクリプタ値 */
#define GATE_DES (TSS_DES+MAX_CPU*8)	/* value of Call gate discriptor */


#ifndef ASM_FILE


/* ディスクリプタ構造体 */
typedef struct{
	uint low;
	uint high;
}DESCRIPTOR;

/* ディスクリプタテーブルレジスタ構造体 */
typedef struct{
	ushort num;
	DESCRIPTOR *des __attribute__((packed));
}DTR;


enum{
	TYPE_KERNEL_CODE=0xc09a00,		/* カーネルコードディスクリプタ用タイプフラグ値 */
	TYPE_KERNEL_DATA=0xc09200,		/* カーネルコードディスクリプタ用タイプフラグ値 */
	TYPE_USER_CODE=0xc0fa00,		/* ユーザーコードディスクリプタ用タイプフラグ値 */
	TYPE_USER_DATA=0xc0f200,		/* ユーザーコードディスクリプタ用タイプフラグ値 */
	TYPE_TSS=0x8900					/* TSS用タイプフラグ値 */
};


extern DTR gdtr;
extern DESCRIPTOR gdt[];

extern void set_user_desculiptor();
extern void set_gdt(int,void*,uint,int);


#endif


#endif
