/********************************************************************
NAME : MMU.H
DESC :
Revision: 02.28.2002 ver 0.0
**********************************************************************/
#include "2440slib.h"
#ifndef __MMU_H__
#define __MMU_H__
#ifdef __cplusplus
extern "C" {
#endif
/**********************************************************************
* 段描述符中各字段含义
* 位[1 : 0] 一级描述符的类型标识(4种)
* 位[3 : 2] C\B控制位
* 位[4 : 4] 固定为1
* 位[8 : 5] 本段所在的域的标识符,标识第几个域
* 位[9 : 9] 保留,为0
* 位[11:10] 访问权限控制位AP
* 位[19:12] 保留,为0
* 位[31:20] 该段对应的物理空间的基地址的高12位
************************************************************************/
#define DESC_SEC (0x2|(1<<4)) //段描述符(看下图)
/************************************************************************
*S3c2440共有4种内存映射方式,分别是:
*00 Fault (无映射)
*01 Coarse Page (粗表)
*10 Section (段)
*11 Fine Page (细表)
***************************************************/
#define CB (3<<2)
//cache_on, write_back回写
#define CNB (2<<2)
//cache_on, write_through直写
#define NCB (1<<2)
//cache_off,WR_BUF on
#define NCNB (0<<2)
//cache_off,WR_BUF off
#define AP_RW (3<<10)
//supervisor=RW, user=RW
#define AP_RO (2<<10)
//supervisor=RW, user=RO
//Domain域可以填写的值有4个
//00:当前级别下,该内存区域不允许被访问,任何的访问都会引起一个domain fault
//01:当前级别下,该内存区域的访问必须配合该内存区域的段描述符中AP位进行权检查
//10:保留状态(我们最好不要填写该值,以免引起不能确定的问题)
//11:当前级别下,对该内存区域的访问都不进行权限检查
#define DOMAIN_FAULT (0x0) // 不可访问
#define DOMAIN_CHK (0x1) // 访问受页表项中设置的权限值控制
#define DOMAIN_NOTCHK (0x3) // 访问不受控制,不产生权限中止
#define DOMAIN0 (0x0<<5) // 第0个域
#define DOMAIN1 (0x1<<5) // 第1个域
// 域访问控制寄存器C3的格式
//┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
//│15│14│13│12│11│10│9 │8 │7 │6 │5 │4 │3 │2 │1 │0 │
//└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
// ================================================================
// 访问 位域值 说明
// ================================================================
// 管理者 11 访问不受控制,不产生权限中止
// 保 留 10 不可预料
// 客 户 01 访问受页表项(AP)中设置的权限控制
// 不可访问 00 产生域错误
// ================================================================
#define DOMAIN0_ATTR (DOMAIN_CHK<<0) // 域0属性,访问受页表项中设置的权限值控制
//由于domain=0,而DOMAIN ACCESS CONTROL REGISTER中field 0的值是01,系统会对该访问进行访问权限的检查
//假设当前CPU处于Supervisor模式下,则程序可以对该描述符描述的内存区域进行读写操作
#define DOMAIN1_ATTR (DOMAIN_FAULT<<2) // 域1属性,不可以访问
//由于domain=2,而DOMAIN ACCESS CONTROL REGISTER中field 1的值是00,当前级别下,该内存区域不允许被访问,任何的访问都会引起一个domain fault
#define RW_CB (AP_RW|DOMAIN0|CB|DESC_SEC) // 读写,属于第0域,cache开,回写,段描述符
#define RW_CNB (AP_RW|DOMAIN0|CNB|DESC_SEC) // 读写,属于第0域,cache开,直写,段描述符
#define RW_NCNB (AP_RW|DOMAIN0|NCNB|DESC_SEC) // 读写,属于第0域,cache关,WR_BUF off,段描述符
#define RW_FAULT (AP_RW|DOMAIN1|NCNB|DESC_SEC) // 读写,属于第1域,cache关,WR_BUF off,段描述符
void MMU_Init(void);
void MMU_SetMTT(int vaddrStart,int vaddrEnd,int paddrStart,int attr);
void ChangeRomCacheStatus(int attr);
#ifdef __cplusplus
}
#endif
#endif /*__MMU_H__*/
阅读(4000) | 评论(0) | 转发(2) |