OpenCores
URL https://opencores.org/ocsvn/c0or1k/c0or1k/trunk

Subversion Repositories c0or1k

[/] [c0or1k/] [trunk/] [conts/] [test_suite0/] [src/] [arch/] [arm/] [v7/] [mm.c] - Rev 2

Compare with Previous | Blame | View Log

/*
 * ARMv7 specific functions
 *
 * Copyright (C) 2008 - 2010 B Labs Ltd.
 */
#include <macros.h>
#include <l4lib/exregs.h>
#include <fault.h>
#include INC_SUBARCH(mm.h)
#include INC_SUBARCH(exception.h)
 
/* Get simplified access permissions */
int pte_get_access_simple(pte_t pte)
{
	/* Place AP[2] and AP[1] in [1:0] positions and return */
	return (((pte >> PTE_AP2_BIT) & 1) << 1)
	       | ((pte >> PTE_AP1_BIT) & 1);
}
 
int is_translation_fault(u32 fsr)
{
	return (fsr & FSR_FS_MASK) == ABORT_TRANSLATION_PAGE;
}
 
unsigned int vm_prot_flags(pte_t pte, u32 fsr)
{
	unsigned int pte_prot_flags = 0;
 
	/* Translation fault means no permissions */
	if (is_translation_fault(fsr))
		return VM_NONE;
 
	/* Check simplified permission bits */
	switch (pte_get_access_simple(pte)) {
	case AP_SIMPLE_USER_RW_KERN_RW:
		pte_prot_flags |= VM_WRITE;
	case AP_SIMPLE_USER_RO_KERN_RO:
		pte_prot_flags |= VM_READ;
 
		/* Also, check exec never bit */
		if (!(pte & (1 << PTE_XN_BIT)))
			pte_prot_flags |= VM_EXEC;
		break;
	case AP_SIMPLE_USER_NONE_KERN_RW:
	case AP_SIMPLE_USER_NONE_KERN_RO:
	default:
		pte_prot_flags = VM_NONE;
		break;
	}
 
	return pte_prot_flags;
}
 
void set_generic_fault_params(struct fault_data *fault)
{
	fault->pte_flags = vm_prot_flags(fault->kdata->pte, fault->kdata->fsr);
	fault->reason = 0;
 
	/*
	 * Prefetch fault denotes exec fault.
	 */
	if (is_prefetch_abort(fault->kdata->fsr)) {
		fault->reason |= VM_EXEC;
		fault->address = fault->kdata->faulty_pc;
	} else {
		fault->address = fault->kdata->far;
 
		/* Write-not-read bit determines fault */
		if (fault->kdata->fsr & (1 << DFSR_WNR_BIT))
			fault->reason |= VM_WRITE;
		else
			fault->reason |= VM_READ;
	}
}
 
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.