1
0
Fork 0

Changed the paging link management

Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@1506
This commit is contained in:
Sjoerd van der Berg 2003-12-29 23:07:12 +00:00
parent de536dfae0
commit 5573af89f6
3 changed files with 43 additions and 46 deletions

View file

@ -132,10 +132,7 @@ void PAGING_PageFault(PhysPt lin_addr,Bitu page_addr,Bitu type) {
void MEM_PhysWriteD(Bitu addr,Bit32u val);
class InitPageHandler : public PageHandler {
public:
InitPageHandler() {flags=PFLAG_ILLEGAL;}
void AddPageLink(Bitu lin_page, Bitu phys_page) {
assert(0);
}
InitPageHandler() {flags=PFLAG_INIT|PFLAG_NOCODE;}
Bitu readb(PhysPt addr) {
InitPage(addr);
return mem_readb(addr);
@ -179,7 +176,7 @@ public:
table.block.a=table.block.d=1; //Set access/Dirty
MEM_PhysWriteD(table_addr,table.load);
X86PageEntry entry;
Bitu entry_addr=(table.block.base << 12)+t_index*4;
Bitu entry_addr=(table.block.base<<12)+t_index*4;
entry.load=MEM_PhysReadD(entry_addr);
if (!entry.block.p) {
LOG(LOG_PAGING,LOG_ERROR)("NP Page");
@ -199,6 +196,23 @@ public:
}
};
bool PAGING_MakePhysPage(Bitu & page) {
if (paging.enabled) {
Bitu d_index=page >> 10;
Bitu t_index=page & 0x3ff;
X86PageEntry table;
table.load=MEM_PhysReadD((paging.base.page<<12)+d_index*4);
if (!table.block.p) return false;
X86PageEntry entry;
entry.load=MEM_PhysReadD((table.block.base<<12)+t_index*4);
if (!entry.block.p) return false;
page=entry.block.base;
} else {
if (page<LINK_START) page=mapfirstmb[page];
//Else keep it the same
}
return true;
}
static InitPageHandler init_page_handler;
@ -207,37 +221,35 @@ Bitu PAGING_GetDirBase(void) {
return paging.cr3;
}
void PAGING_ClearTLB(void) {
LOG(LOG_PAGING,LOG_NORMAL)("Clearing TLB");
Bitu i;
for (i=0;i<LINK_START;i++) {
paging.tlb.read[i]=0;
paging.tlb.write[i]=0;
paging.tlb.handler[i]=&init_page_handler;
}
MEM_UnlinkPages();
}
void PAGING_InitTLB(void) {
for (Bitu i=0;i<TLB_SIZE;i++) {
paging.tlb.read[i]=0;
paging.tlb.write[i]=0;
paging.tlb.handler[i]=&init_page_handler;
}
paging.links.used=0;
}
void PAGING_ClearTLBEntries(Bitu pages,Bit32u * entries) {
for (;pages>0;pages--) {
void PAGING_ClearTLB(void) {
Bit32u * entries=&paging.links.entries[0];
for (;paging.links.used>0;paging.links.used--) {
Bitu page=*entries++;
paging.tlb.read[page]=0;
paging.tlb.write[page]=0;
paging.tlb.handler[page]=&init_page_handler;
}
paging.links.used=0;
}
void PAGING_UnlinkPages(Bitu lin_page,Bitu pages) {
for (;pages>0;pages--) {
paging.tlb.read[lin_page]=0;
paging.tlb.write[lin_page]=0;
paging.tlb.handler[lin_page]=&init_page_handler;
}
}
void PAGING_LinkPage(Bitu lin_page,Bitu phys_page) {
PageHandler * handler=MEM_GetPageHandler(phys_page);
Bitu lin_base=lin_page << 12;
@ -249,8 +261,8 @@ void PAGING_LinkPage(Bitu lin_page,Bitu phys_page) {
else paging.tlb.read[lin_page]=0;
if (handler->flags & PFLAG_WRITEABLE) paging.tlb.write[lin_page]=host_mem-lin_base;
else paging.tlb.write[lin_page]=0;
handler->AddPageLink(lin_page,phys_page);
if (paging.links.used>=PAGING_LINKS) E_Exit("Not enough paging links");
paging.links.entries[paging.links.used++]=lin_page;
paging.tlb.handler[lin_page]=handler;
}

View file

@ -126,34 +126,17 @@ static void VGA_GFX_256U_WriteHandler(PhysPt start,Bit8u val) {
/* Gonna assume that whoever maps vga memory, maps it on 32/64kb boundary */
#define LINK_MAX 64
#define VGA_PAGES (128/4)
#define VGA_PAGE_A0 (0xA0000/4096)
#define VGA_PAGE_B0 (0xB0000/4096)
#define VGA_PAGE_B8 (0xB8000/4096)
static struct {
Bitu used_links;
Bit32u links[LINK_MAX];
Bit8u ram_area[VGA_PAGES*4096];
Bitu map_base;
} vgapages;
void VGA_ClearPageLinks(void) {
PAGING_ClearTLBEntries(vgapages.used_links,vgapages.links);
vgapages.used_links=0;
}
class VGA_PageHandler : public PageHandler {
void AddPageLink(Bitu lin_page, Bitu phys_page) {
if (vgapages.used_links<LINK_MAX) {
vgapages.links[vgapages.used_links++]=lin_page;
}
}
};
class VGARead_PageHandler : public VGA_PageHandler {
class VGARead_PageHandler : public PageHandler {
public:
Bitu readb(PhysPt addr) {
addr&=0xffff;
@ -221,7 +204,7 @@ public:
}
};
class VGA_TEXT_PageHandler : public VGA_PageHandler {
class VGA_TEXT_PageHandler : public PageHandler {
public:
VGA_TEXT_PageHandler() {
flags=PFLAG_NOCODE;
@ -239,7 +222,7 @@ public:
};
class VGA_RAM_PageHandler : public VGA_PageHandler {
class VGA_RAM_PageHandler : public PageHandler {
public:
VGA_RAM_PageHandler() {
flags=PFLAG_READABLE|PFLAG_WRITEABLE|PFLAG_NOCODE;
@ -250,7 +233,7 @@ public:
}
};
class VGA_MAP_PageHandler : public VGA_PageHandler {
class VGA_MAP_PageHandler : public PageHandler {
public:
VGA_MAP_PageHandler() {
flags=PFLAG_READABLE|PFLAG_WRITEABLE|PFLAG_NOCODE;
@ -261,7 +244,7 @@ public:
}
};
class VGA_TANDY_PageHandler : public VGA_PageHandler {
class VGA_TANDY_PageHandler : public PageHandler {
public:
VGA_TANDY_PageHandler() {
flags=PFLAG_READABLE|PFLAG_WRITEABLE|PFLAG_NOCODE;
@ -340,7 +323,7 @@ void VGA_SetupHandlers(void) {
MEM_SetPageHandler(VGA_PAGE_B0,8,&vgaph.hram);
break;
}
VGA_ClearPageLinks();
PAGING_ClearTLB();
}
bool lfb_update;
@ -359,5 +342,4 @@ void VGA_StartUpdateLFB(void) {
void VGA_SetupMemory() {
memset((void *)&vga.mem,0,512*1024*4);
vgapages.used_links=0;
}

View file

@ -162,6 +162,7 @@ static Bit8u EMM_MapPage(Bitu phys_page,Bit16u handle,Bit16u log_page) {
PAGING_MapPage(EMM_PAGEFRAME4K+phys_page*4+i,memh);
memh=MEM_NextHandle(memh);
}
PAGING_ClearTLB();
return EMM_NO_ERROR;
} else if (log_page==NULL_PAGE) {
/* Unmapping it is */
@ -169,6 +170,7 @@ static Bit8u EMM_MapPage(Bitu phys_page,Bit16u handle,Bit16u log_page) {
emm_mappings[phys_page].page=NULL_PAGE;
for (Bitu i=0;i<4;i++)
PAGING_MapPage(EMM_PAGEFRAME4K+phys_page*4+i,EMM_PAGEFRAME4K+phys_page*4+i);
PAGING_ClearTLB();
return EMM_NO_ERROR;
} else {
/* Illegal logical page it is */
@ -442,6 +444,7 @@ static Bit8u MemoryRegion(void) {
return EMM_NO_ERROR;
}
static Bitu INT67_Handler(void) {
Bitu i;
switch (reg_ah) {