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


#include"types.h"
#include"segment.h"


/* GDT */
DESCRIPTOR gdt[GDT_ENTRY]=
{
	{0,0},
	{0x0000ffff,0x00cf9a00},	/* カーネルコードセグメント。 */
	{0x0000ffff,0x00cf9200},	/* カーネルデータセグメント。 */
	{0x0000ffff,0x00cffa00},	/* ユーザーコードセグメント。 */
	{0x0000ffff,0x00cff200},	/* ユーザーデータセグメント。 */
	{0x0000ffff,0x00009a00},	/* 実アドレスモード用コードセグメント。 */
	{0x0000ffff,0x00009200},	/* 実アドレスモード用データセグメント。 */
};


/*
 * GLOBAL
 * ディスクリプタにアドレスを設定する。
 * リミットサイズは-1されるので、最大値は0となる。
 * 引数 : ディスクリプタ値、ベースアドレス、リミットサイズ、タイプフラグ
 */
void set_gdt(int des,uint addr,uint size,int flag)
{
	gdt[des/8].low=0;
	gdt[des/8].high=0;

	size-=1;

	/* ベースアドレスの設定 */
	gdt[des/8].low|=addr<<16;
	gdt[des/8].high|=(addr>>16)&0xff;
	gdt[des/8].high|=addr&0xff000000;

	/* リミットサイズの設定 */
	if(flag&0x100000)size>>=12;
	gdt[des/8].low|=size&0xffff;
	gdt[des/8].high|=size&0xf0000;

	/* タイプフラグの設定 */
	gdt[des/8].high|=flag;
}
