From f7a6317328ef7e8238a29d2397aae0853506c48d Mon Sep 17 00:00:00 2001 From: Sjoerd van der Berg Date: Mon, 23 Aug 2004 12:19:17 +0000 Subject: [PATCH] New memory handling using 1 big block of memory Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@1920 --- include/mem.h | 26 ++++++++--- include/paging.h | 5 --- src/hardware/memory.cpp | 97 +++-------------------------------------- 3 files changed, 27 insertions(+), 101 deletions(-) diff --git a/include/mem.h b/include/mem.h index b1ccb82e..f213305b 100644 --- a/include/mem.h +++ b/include/mem.h @@ -20,8 +20,6 @@ #define __MEM_H #include -#define bmemcpy(mem1,mem2,size) memcpy((void *)mem1,(void *)mem2,size) - typedef Bit32u PhysPt; typedef Bit8u * HostPt; typedef Bit32u RealPt; @@ -30,6 +28,8 @@ typedef Bit32s MemHandle; #define MEM_PAGESIZE 4096 +extern HostPt MemBase; + bool MEM_A20_Enabled(void); void MEM_A20_Enable(bool enable); @@ -123,9 +123,25 @@ void mem_writeb(PhysPt pt,Bit8u val); void mem_writew(PhysPt pt,Bit16u val); void mem_writed(PhysPt pt,Bit32u val); -void phys_writeb(PhysPt addr,Bit8u val); -void phys_writew(PhysPt addr,Bit16u val); -void phys_writed(PhysPt addr,Bit32u val); +INLINE void phys_writeb(PhysPt addr,Bit8u val) { + host_writeb(MemBase+addr,val); +} +INLINE void phys_writew(PhysPt addr,Bit16u val){ + host_writew(MemBase+addr,val); +} +INLINE void phys_writed(PhysPt addr,Bit32u val){ + host_writed(MemBase+addr,val); +} + +INLINE Bit8u phys_readb(PhysPt addr) { + return host_readb(MemBase+addr); +} +INLINE Bit16u phys_readw(PhysPt addr){ + return host_readw(MemBase+addr); +} +INLINE Bit32u phys_readd(PhysPt addr){ + return host_readd(MemBase+addr); +} /* These don't check for alignment, better be sure it's correct */ diff --git a/include/paging.h b/include/paging.h index 29f8ddde..169731e9 100644 --- a/include/paging.h +++ b/include/paging.h @@ -70,11 +70,6 @@ bool PAGING_MakePhysPage(Bitu & page); void MEM_SetLFB(Bitu _page,Bitu _pages,HostPt _pt); void MEM_SetPageHandler(Bitu phys_page,Bitu pages,PageHandler * handler); -Bit32u MEM_PhysReadD(Bitu addr); - - - - #pragma pack(1) typedef struct { Bit32u p:1; diff --git a/src/hardware/memory.cpp b/src/hardware/memory.cpp index cc57d417..2a511d38 100644 --- a/src/hardware/memory.cpp +++ b/src/hardware/memory.cpp @@ -34,11 +34,6 @@ #define LFB_PAGES 512 #define MAX_LINKS ((MAX_MEMORY*1024/4)+4096) //Hopefully enough -struct AllocBlock { - Bit8u data[PAGES_IN_BLOCK*4096]; - AllocBlock * next; -}; - struct LinkBlock { Bitu used; Bit32u pages[MAX_LINKS]; @@ -47,14 +42,8 @@ struct LinkBlock { static struct MemoryBlock { Bitu pages; PageHandler * * phandlers; - HostPt * hostpts; MemHandle * mhandles; LinkBlock links; - struct { - Bitu pages; - HostPt cur_page; - AllocBlock *cur_block; - } block; struct { Bitu start_page; Bitu end_page; @@ -67,6 +56,8 @@ static struct MemoryBlock { } a20; } memory; +HostPt MemBase; + class IllegalPageHandler : public PageHandler { public: IllegalPageHandler() { @@ -90,10 +81,7 @@ public: flags=PFLAG_READABLE|PFLAG_WRITEABLE; } HostPt GetHostPt(Bitu phys_page) { - if (!memory.hostpts[phys_page]) { - memory.hostpts[phys_page]=MEM_GetBlockPage(); - } - return memory.hostpts[phys_page]; + return MemBase+phys_page*MEM_PAGESIZE; } }; @@ -467,51 +455,6 @@ void mem_writed(PhysPt address,Bit32u val) { mem_writed_inline(address,val); } -void phys_writeb(PhysPt addr,Bit8u val) { - HostPt block=memory.hostpts[addr >> 12]; - if (!block) { - block=memory.hostpts[addr >> 12]=MEM_GetBlockPage(); - } - host_writeb(block+(addr & 4095),val); -} - -void phys_writew(PhysPt addr,Bit16u val) { - phys_writeb(addr,(Bit8u)val); - phys_writeb(addr+1,(Bit8u)(val >> 8)); -} - -void phys_writed(PhysPt addr,Bit32u val) { - phys_writeb(addr,(Bit8u)val); - phys_writeb(addr+1,(Bit8u)(val >> 8)); - phys_writeb(addr+2,(Bit8u)(val >> 16)); - phys_writeb(addr+3,(Bit8u)(val >> 24)); -} - -Bit32u MEM_PhysReadD(Bitu addr) { - Bitu page=addr >> 12; - Bitu index=(addr & 4095); - if (page>memory.pages) - E_Exit("Reading from illegal page"); - HostPt block=memory.hostpts[page]; - if (!block) { - E_Exit("Reading from empty page"); - } - return host_readd(block+index); -} - -void MEM_PhysWriteD(Bitu addr,Bit32u val) { - Bitu page=addr >> 12; - Bitu index=(addr & 4095); - if (page>memory.pages) - E_Exit("Writing from illegal page"); - HostPt block=memory.hostpts[page]; - if (!block) { - E_Exit("Writing to empty page"); - } - host_writed(block+index,val); -} - - static void write_p92(Bitu port,Bitu val,Bitu iolen) { // Bit 0 = system reset (switch back to real mode) if (val&1) E_Exit("XMS: CPU reset via port 0x92 not supported."); @@ -524,42 +467,14 @@ static Bitu read_p92(Bitu port,Bitu iolen) { } -HostPt MEM_GetBlockPage(void) { - HostPt ret; - if (memory.block.pages) { - ret=memory.block.cur_page; - memory.block.pages--; - memory.block.cur_page+=4096; - } else { - AllocBlock * newblock=new AllocBlock; - memset(newblock,0,sizeof(AllocBlock)); //zero new allocated memory - newblock->next=memory.block.cur_block; - memory.block.cur_block=newblock; - - memory.block.pages=PAGES_IN_BLOCK-1; - ret=&newblock->data[0]; - memory.block.cur_page=&newblock->data[4096]; - } - return ret; -} - static void MEM_ShutDown(Section * sec) { - AllocBlock * theblock=memory.block.cur_block; - while (theblock) { - AllocBlock * next=theblock->next; - delete theblock; - theblock=next; - } + free(MemBase); } void MEM_Init(Section * sec) { Bitu i; Section_prop * section=static_cast(sec); - /* Setup Memory Block */ - memory.block.pages=0; - memory.block.cur_block=0; - /* Setup the Physical Page Links */ Bitu memsize=section->Get_int("memsize"); @@ -568,13 +483,13 @@ void MEM_Init(Section * sec) { LOG_MSG("Maximum memory size is %d MB",MAX_MEMORY); memsize=MAX_MEMORY; } + MemBase=(HostPt)malloc(memsize*1024*1024); + if (!MemBase) E_Exit("Can't allocate main memory of %d MB",memsize); memory.pages=(memsize*1024*1024)/4096; /* Allocate the data for the different page information blocks */ - memory.hostpts=new HostPt[memory.pages]; memory.phandlers=new PageHandler * [memory.pages]; memory.mhandles=new MemHandle [memory.pages]; for (i=0;i