Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. #include "mem.h"
  2.  
  3.  
  4.  
  5. void memInit(ArmMem* mem){
  6.        
  7.         UInt8 i;
  8.        
  9.         for(i = 0; i < MAX_MEM_REGIONS; i++){
  10.                 mem->regions[i].sz = 0;
  11.         }
  12. }
  13.  
  14.  
  15. void memDeinit(_UNUSED_ ArmMem* mem){
  16.        
  17.         //nothing here
  18. }
  19.  
  20. Boolean memRegionAdd(ArmMem* mem, UInt32 pa, UInt32 sz, ArmMemAccessF aF, void* uD){
  21.  
  22.         UInt8 i;
  23.        
  24.         //check for intersection with another region
  25.        
  26.         for(i = 0; i < MAX_MEM_REGIONS; i++){
  27.                
  28.                 if(!mem->regions[i].sz) continue;
  29.                 if((mem->regions[i].pa <= pa && mem->regions[i].pa + mem->regions[i].sz > pa) || (pa <= mem->regions[i].pa && pa + sz > mem->regions[i].pa)){
  30.                
  31.                         return false;           //intersection -> fail
  32.                 }
  33.         }
  34.        
  35.        
  36.         //find a free region and put it there
  37.        
  38.         for(i = 0; i < MAX_MEM_REGIONS; i++){
  39.                 if(mem->regions[i].sz == 0){
  40.                
  41.                         mem->regions[i].pa = pa;
  42.                         mem->regions[i].sz = sz;
  43.                         mem->regions[i].aF = aF;
  44.                         mem->regions[i].uD = uD;
  45.                
  46.                         return true;
  47.                 }
  48.         }
  49.        
  50.        
  51.         //fail miserably
  52.        
  53.         return false;  
  54. }
  55.  
  56. Boolean memRegionDel(ArmMem* mem, UInt32 pa, UInt32 sz){
  57.  
  58.         UInt8 i;
  59.        
  60.         for(i = 0; i < MAX_MEM_REGIONS; i++){
  61.                 if(mem->regions[i].pa == pa && mem->regions[i].sz ==sz){
  62.                
  63.                         mem->regions[i].sz = 0;
  64.                         return true;
  65.                 }
  66.         }
  67.        
  68.         return false;
  69. }
  70.  
  71. Boolean memAccess(ArmMem* mem, UInt32 addr, UInt8 size, Boolean write, void* buf){
  72.        
  73.         UInt8 i;
  74.        
  75.         for(i = 0; i < MAX_MEM_REGIONS; i++){
  76.                 if(mem->regions[i].pa <= addr && mem->regions[i].pa + mem->regions[i].sz > addr){
  77.                
  78.                         return mem->regions[i].aF(mem->regions[i].uD, addr, size, write & 0x7F, buf);
  79.                 }
  80.         }
  81.        
  82.         if(!(write & 0x80)){    //high bit in write tells us to not print this error (used by gdb stub)
  83.                
  84.                 err_str("Memory ");
  85.                 err_str(write ? "write" : "read");
  86.                 err_str(" of ");
  87.                 err_dec(size);
  88.                 err_str(" bytes at physical addr 0x");
  89.                 err_hex(addr);
  90.                 err_str(" fails, halting\r\n");
  91.                 while(1);
  92.         }
  93.        
  94.         return false;
  95. }
  96.  
  97.