Exemplo n.º 1
0
/**
	@brief Arch ctx init
*/
void km_arch_ctx_init(struct km * mm_ctx)
{
	/* Share the core's address space */
	int base = HAL_GET_BASIC_KADDRESS(0) / 0x400000;
	int end  = ARCH_KM_LV2_COUNT;

	copy_kernel_to_user(mm_ctx, base, end);
}
Exemplo n.º 2
0
__init void km_arch_trim()
{
	unsigned long i;
	
	unsigned long *p = hal_x86_get_init_pgtable();
	
	/*
	 Kernel part in 4mb page;
		1,低端。
		2,高端
	*/
	for(i = 0; i < HAL_GET_BASIC_KADDRESS(0) / 0x400000; i++)
		p[i] = 0;																//Mask as invalid;
	for(i = (HAL_GET_BASIC_KADDRESS(0) + CONFIG_HAL_KERNEL_MEM_LEN) / 0x400000; i < 1024; i++)
		p[i] = 0;																//Mask as invalid;
	
	write_cr3((unsigned long)hal_x86_get_init_pgtable() - HAL_GET_BASIC_KADDRESS(0));

	/*
	 load tr
	 */
	set_tss_desc(0, &init_tss);
	load_TR_desc();
	
	/*
	 打开WP功能
	 */
	do {
		unsigned long i = read_cr0();
		//if(open)
		i |= 1 << 16;
		//else
		//	i &= ~(1 << 16);
		write_cr0(i);
	} while (0);
}
Exemplo n.º 3
0
bool km_page_create_cow(struct km *mem_dst, unsigned long address)
{
	pte_t entry;
	unsigned long page = 0;
	struct km_walk_ctx dst_ctx;
	
	KM_WALK_INIT(mem_dst, &dst_ctx);
	
	if (unlikely(km_walk_to(&dst_ctx, address) == false))
		goto err;
	
	/* 必须有内容,否则就不应该Cow */
	if (!km_pte_read(&dst_ctx))
		goto err;
	page = km_page_alloc();
	if (!page)
		goto err;
	
	//TODO: Non identical map
	if (page >= CONFIG_HAL_KERNEL_MEM_LEN)
		goto err;
	memcpy((void*)HAL_GET_BASIC_KADDRESS(page), (void*)KM_PAGE_ROUND_ALIGN(address), PAGE_SIZE);
	
	entry = page | km_arch_get_flags(KM_PROT_READ | KM_PROT_WRITE);
	km_pte_write_force(&dst_ctx, entry);

	/* Must flush, because we are changing the entry */
	km_arch_flush_page(mem_dst, address);

	return true;
	
err:
	if (page)
		km_page_dealloc(page);
	return false;
}
Exemplo n.º 4
0
static bool address_in_user(unsigned long address)
{
	if (address < HAL_GET_BASIC_KADDRESS(0))
		return true;
	return false;
}
Exemplo n.º 5
0
unsigned long hal_get_basic_kaddr(unsigned long phy)
{
	return HAL_GET_BASIC_KADDRESS(phy);
}