static Bit8u EMM_MapPage(Bitu phys_page,Bit16u handle,Bit16u log_page) { // LOG_MSG("EMS MapPage handle %d phys %d log %d",handle,phys_page,log_page); /* Check for too high physical page */ if (phys_page>=EMM_MAX_PHYS) return EMM_ILL_PHYS; /* unmapping doesn't need valid handle (as handle isn't used) */ if (log_page==NULL_PAGE) { /* Unmapping */ emm_mappings[phys_page].handle=NULL_HANDLE; 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; } /* Check for valid handle */ if (!ValidHandle(handle)) return EMM_INVALID_HANDLE; if (log_page<emm_handles[handle].pages) { /* Mapping it is */ emm_mappings[phys_page].handle=handle; emm_mappings[phys_page].page=log_page; MemHandle memh=MEM_NextHandleAt(emm_handles[handle].mem,log_page*4);; for (Bitu i=0;i<4;i++) { PAGING_MapPage(EMM_PAGEFRAME4K+phys_page*4+i,memh); memh=MEM_NextHandle(memh); } PAGING_ClearTLB(); return EMM_NO_ERROR; } else { /* Illegal logical page it is */ return EMM_LOG_OUT_RANGE; } }
void MEM_SetLFB(Bitu page, Bitu pages, PageHandler *handler, PageHandler *mmiohandler) { memory.lfb.handler=handler; memory.lfb.mmiohandler=mmiohandler; memory.lfb.start_page=page; memory.lfb.end_page=page+pages; memory.lfb.pages=pages; PAGING_ClearTLB(); }
static Bit8u EMM_MapSegment(Bitu segment,Bit16u handle,Bit16u log_page) { // LOG_MSG("EMS MapSegment handle %d segment %d log %d",handle,segment,log_page); if (((segment>=0xa000) && (segment<0xb000)) || ((segment>=EMM_PAGEFRAME-0x1000) && (segment<EMM_PAGEFRAME+0x1000))) { Bit32s tphysPage = ((Bit32s)segment-EMM_PAGEFRAME)/(0x1000/EMM_MAX_PHYS); /* unmapping doesn't need valid handle (as handle isn't used) */ if (log_page==NULL_PAGE) { /* Unmapping */ if ((tphysPage>=0) && (tphysPage<EMM_MAX_PHYS)) { emm_mappings[tphysPage].handle=NULL_HANDLE; emm_mappings[tphysPage].page=NULL_PAGE; } else { emm_segmentmappings[segment>>10].handle=NULL_HANDLE; emm_segmentmappings[segment>>10].page=NULL_PAGE; } for (Bitu i=0;i<4;i++) PAGING_MapPage(segment*16/4096+i,segment*16/4096+i); PAGING_ClearTLB(); return EMM_NO_ERROR; } /* Check for valid handle */ if (!ValidHandle(handle)) return EMM_INVALID_HANDLE; if (log_page<emm_handles[handle].pages) { /* Mapping it is */ if ((tphysPage>=0) && (tphysPage<EMM_MAX_PHYS)) { emm_mappings[tphysPage].handle=handle; emm_mappings[tphysPage].page=log_page; } else { emm_segmentmappings[segment>>10].handle=handle; emm_segmentmappings[segment>>10].page=log_page; } MemHandle memh=MEM_NextHandleAt(emm_handles[handle].mem,log_page*4);; for (Bitu i=0;i<4;i++) { PAGING_MapPage(segment*16/4096+i,memh); memh=MEM_NextHandle(memh); } PAGING_ClearTLB(); return EMM_NO_ERROR; } else { /* Illegal logical page it is */ return EMM_LOG_OUT_RANGE;