⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mtrrqnx.c

📁 uboot在arm处理器s3c2410的移植代码
💻 C
字号:
/******************************************************************************                   SciTech OS Portability Manager Library**  ========================================================================**    The contents of this file are subject to the SciTech MGL Public*    License Version 1.0 (the "License"); you may not use this file*    except in compliance with the License. You may obtain a copy of*    the License at http://www.scitechsoft.com/mgl-license.txt**    Software distributed under the License is distributed on an*    "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or*    implied. See the License for the specific language governing*    rights and limitations under the License.**    The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.**    The Initial Developer of the Original Code is SciTech Software, Inc.*    All Rights Reserved.**  ========================================================================** Language:     ANSI C* Environment:  QNX** Description:  MTRR helper functions module. To make it easier to implement*               the MTRR support under QNX, we simply put our ring 0 helper*               functions into stubs that run them at ring 0 using whatever*               mechanism is available.*****************************************************************************/#include "pmapi.h"#include <stdio.h>#include <sys/mman.h>#include <time.h>#ifdef __QNXNTO__#include <sys/neutrino.h>#include <sys/syspage.h>#else#include <i86.h>#include <sys/irqinfo.h>#endif/*--------------------------- Global variables ----------------------------*/#define R0_FLUSH_TLB    0#define R0_SAVE_CR4     1#define R0_RESTORE_CR4  2#define R0_READ_MSR     3#define R0_WRITE_MSR    4typedef struct {    int     service;    int     reg;    ulong   eax;    ulong   edx;    } R0_data;extern volatile R0_data _PM_R0;/*----------------------------- Implementation ----------------------------*/#ifdef __QNXNTO__const struct sigevent * _ASMAPI _PM_ring0_isr(void *arg, int id);#elsepid_t far _ASMAPI _PM_ring0_isr();#endif/****************************************************************************REMARKS:Return true if ring 0 (or if we can call the helpers functions at ring 0)****************************************************************************/ibool _ASMAPI _MTRR_isRing0(void){#ifdef __QNXNTO__    return false;   /* Not implemented yet! */#else    return true;#endif}/****************************************************************************REMARKS:Function to execute a service at ring 0. This is done using the clockinterrupt handler since the code we attach to it will always run at ring 0.****************************************************************************/static void CallRing0(void){#ifdef __QNXNTO__    uint    clock_intno = SYSPAGE_ENTRY(qtime)->intr;#else    uint    clock_intno = 0;    /* clock irq */#endif    int     intrid;#ifdef __QNXNTO__    mlock((void*)&_PM_R0, sizeof(_PM_R0));    ThreadCtl(_NTO_TCTL_IO, 0);#endif#ifdef __QNXNTO__    if ((intrid = InterruptAttach(_NTO_INTR_CLASS_EXTERNAL | clock_intno,	_PM_ring0_isr, (void*)&_PM_R0, sizeof(_PM_R0), _NTO_INTR_FLAGS_END)) == -1) {#else    if ((intrid = qnx_hint_attach(clock_intno, _PM_ring0_isr, FP_SEG(&_PM_R0))) == -1) {#endif	perror("Attach");	exit(-1);	}    while (_PM_R0.service != -1)	;#ifdef __QNXNTO__    InterruptDetachId(intrid);#else    qnx_hint_detach(intrid);#endif}/****************************************************************************REMARKS:Flush the translation lookaside buffer.****************************************************************************/void PMAPI PM_flushTLB(void){    _PM_R0.service = R0_FLUSH_TLB;    CallRing0();}/****************************************************************************REMARKS:Read and return the value of the CR4 register****************************************************************************/ulong _ASMAPI _MTRR_saveCR4(void){    _PM_R0.service = R0_SAVE_CR4;    CallRing0();    return _PM_R0.reg;}/****************************************************************************REMARKS:Restore the value of the CR4 register****************************************************************************/void _ASMAPI _MTRR_restoreCR4(ulong cr4Val){    _PM_R0.service = R0_RESTORE_CR4;    _PM_R0.reg = cr4Val;    CallRing0();}/****************************************************************************REMARKS:Read a machine status register for the CPU.****************************************************************************/void _ASMAPI _MTRR_readMSR(    int reg,    ulong *eax,    ulong *edx){    _PM_R0.service = R0_READ_MSR;    _PM_R0.reg = reg;    CallRing0();    *eax = _PM_R0.eax;    *edx = _PM_R0.edx;}/****************************************************************************REMARKS:Write a machine status register for the CPU.****************************************************************************/void _ASMAPI _MTRR_writeMSR(    int reg,    ulong eax,    ulong edx){    _PM_R0.service = R0_WRITE_MSR;    _PM_R0.reg = reg;    _PM_R0.eax = eax;    _PM_R0.edx = edx;    CallRing0();}

⌨️ 快捷键说明

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