gdt.cc

来自「Murphy 大俠 GPL 的 C++/x86 RTOS, 支持 MMU, 用戶」· CC 代码 · 共 88 行

CC
88
字号
// File: GDT.cc

/*
 * Copyright (c) 1998-1999 Murphy Cheng-Che Chen <murphychen@mail2000.com.tw>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
*/

#include "GDT.h"
#include "LibC/assert/assert.h"
#include "LibC/stdio/stdio.h"

void GDT::FillDescriptor(WORD no, DWORD base, DWORD limit,
		BYTE access, BYTE sizebits)
{
	assert(m_descGdt);
	assert(no<GDTSZ);

	if (limit > 0xfffff)
	{
		limit >>= 12;
		sizebits |= SZ_G;
	}
	
	m_descGdt[no].entryDesc.limit_low = limit & 0xffff;
	m_descGdt[no].entryDesc.base_low = base & 0xffff;
	m_descGdt[no].entryDesc.base_med = (base >> 16) & 0xff;
	m_descGdt[no].entryDesc.access = access | ACC_P;
	m_descGdt[no].entryDesc.limit_high = limit >> 16;
	m_descGdt[no].entryDesc.granularity = sizebits;
	m_descGdt[no].entryDesc.base_high = base >> 24;

//	printf("no=%x, base=%x, limit=%x\n", no, base, limit);
}

void GDT::ModifyDescriptorAccess(WORD no, BYTE access, DWORD nOption)
{
	assert(m_descGdt);
	assert(no<GDTSZ);

//	printf("ModifyDescriptorAccess()\n");

	BYTE result;

	switch(nOption) {
		case GDT_OR:
			result = access | m_descGdt[no].entryDesc.access;
			break;
		case GDT_AND:
			result = access & m_descGdt[no].entryDesc.access;
			break;
		default:
			assert(FALSE);
	}

//	printf("index=%08x result=%08x\n", no, result);

	m_descGdt[no].entryDesc.access=result;
}


void GDT::FillGate(WORD no, WORD selector, DWORD offset, BYTE access,
	BYTE WORD_count)
{
	assert(m_descGdt);
	assert(no<GDTSZ);

	m_descGdt[no].entryGate.selector = selector;
	m_descGdt[no].entryGate.offset_low = offset & 0xffff;
	m_descGdt[no].entryGate.offset_high = (offset >> 16) & 0xffff;
	m_descGdt[no].entryGate.access = access | ACC_P;
	m_descGdt[no].entryGate.WORD_count = WORD_count & 0x1f;

}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?