aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJaroslav Hensl <jara@hensl.cz>2024-07-05 00:52:28 +0200
committerJaroslav Hensl <jara@hensl.cz>2024-07-05 00:52:28 +0200
commite04537c2481cfdf3537c9e108fb8632181151d2c (patch)
tree78461a8cddbbb760e3330b51195929bd78c7ab4a
parent053673efe6ea7d8bc19c45504ce9822c6145cf2c (diff)
downloadvmdisp9x-e04537c2481cfdf3537c9e108fb8632181151d2c.tar.gz
eliminate PAGECONTIG, TLB flush when _PageAllocate
-rw-r--r--vxd_lib.c19
-rw-r--r--vxd_mouse.c4
-rw-r--r--vxd_svga.c49
-rw-r--r--vxd_svga.h4
-rw-r--r--vxd_svga_mouse.c18
5 files changed, 69 insertions, 25 deletions
diff --git a/vxd_lib.c b/vxd_lib.c
index d40c68c..eade7b2 100644
--- a/vxd_lib.c
+++ b/vxd_lib.c
@@ -402,11 +402,28 @@ void __cdecl _Allocate_GDT_Selector(ULONG DescHigh, ULONG DescLow, ULONG flags,
}
}
-ULONG __declspec(naked) __cdecl _PageAllocate(ULONG nPages, ULONG pType, ULONG VM, ULONG AlignMask, ULONG minPhys, ULONG maxPhys, ULONG *PhysAddr, ULONG flags)
+static ULONG __declspec(naked) __cdecl _PageAllocate_call(ULONG nPages, ULONG pType, ULONG VM, ULONG AlignMask, ULONG minPhys, ULONG maxPhys, ULONG *PhysAddr, ULONG flags)
{
VMMJmp(_PageAllocate);
}
+ULONG __cdecl _PageAllocate(ULONG nPages, ULONG pType, ULONG VM, ULONG AlignMask, ULONG minPhys, ULONG maxPhys, ULONG *PhysAddr, ULONG flags)
+{
+ ULONG r = _PageAllocate_call(nPages, pType, VM, AlignMask, minPhys, maxPhys, PhysAddr, flags);
+
+ /* do examplicit TLB flush, help much for stability.
+ * There is probably another TLB bug in VMM...
+ */
+ _asm
+ {
+ push eax
+ mov eax, cr3
+ mov cr3, eax
+ pop eax
+ };
+ return r;
+}
+
ULONG __declspec(naked) __cdecl _PageFree(PVOID hMem, DWORD flags)
{
VMMJmp(_PageFree);
diff --git a/vxd_mouse.c b/vxd_mouse.c
index ea4de37..6c11747 100644
--- a/vxd_mouse.c
+++ b/vxd_mouse.c
@@ -244,7 +244,7 @@ void mouse_hide()
#ifdef SVGA
if(SVGA_mouse_hw())
{
- SVGA_mouse_hide();
+ SVGA_mouse_hide(FALSE);
return;
}
#endif
@@ -261,7 +261,7 @@ void mouse_invalidate()
#ifdef SVGA
if(SVGA_mouse_hw())
{
- SVGA_mouse_hide();
+ SVGA_mouse_hide(TRUE);
return;
}
#endif
diff --git a/vxd_svga.c b/vxd_svga.c
index e024bf6..5b0c716 100644
--- a/vxd_svga.c
+++ b/vxd_svga.c
@@ -868,14 +868,14 @@ void SVGA_CMB_submit_critical(DWORD FBPTR cmb, DWORD cmb_size, SVGA_CMB_status_t
if(status)
{
status->sStatus = SVGA_PROC_FENCE;
- status->fifo_fence_used = fence;
status->qStatus = NULL;
+ status->fifo_fence_used = fence;
}
}
cb->status = SVGA_PROC_COMPLETED;
last_cb = NULL;
- }
+ } /* FIFO */
if(status)
{
@@ -1152,14 +1152,24 @@ static DWORD getPPN(DWORD virtualaddr)
**/
BOOL SVGA_region_create(SVGA_region_info_t *rinfo)
{
- ULONG phy = 0;
+ //ULONG phy = 0;
ULONG laddr;
ULONG pgblk;
ULONG new_size = RoundTo4k(rinfo->size);
ULONG nPages = RoundToPages(new_size);
//ULONG nPages = RoundToPages64k(rinfo->size);
-
+ ULONG pa_vm = ThisVM;
+ ULONG pa_type = PG_VM;
SVGAGuestMemDescriptor *desc;
+ ULONG size_total = 0;
+
+#if 0
+ if(svga_db->stat_regions_usage > (300*1024*1024))
+ {
+ pa_vm = 0;
+ pa_type = PG_SYS;
+ }
+#endif
rinfo->size = new_size;
@@ -1171,9 +1181,10 @@ BOOL SVGA_region_create(SVGA_region_info_t *rinfo)
}
//dbg_printf(dbg_pages, rinfo->size, nPages, P_SIZE);
-
+#if 0
+ /* JH: OK, using PAGECONTIG leads to very fast memory exhaustion, so using only slower way! */
/* first try to allocate continuous physical memory space, 1st page is used for GMR descriptor */
- laddr = _PageAllocate(nPages+1, PG_VM, ThisVM, 0, 0x0, 0x100000, &phy, PAGECONTIG | PAGEUSEALIGN | PAGEFIXED);
+ laddr = _PageAllocate(nPages+1, pa_type, pa_vm, 0, 0x0, 0x100000, &phy, PAGECONTIG | PAGEUSEALIGN | PAGEFIXED);
if(laddr)
{
@@ -1191,8 +1202,11 @@ BOOL SVGA_region_create(SVGA_region_info_t *rinfo)
rinfo->mob_ppn = (phy/P_SIZE)+1;
//dbg_printf(dbg_region_simple, laddr, rinfo->address);
+
+ size_total = (nPages+1)*P_SIZE;
}
else
+#endif
{
/* memory is too fragmented to create this large continous region */
ULONG taddr;
@@ -1202,12 +1216,13 @@ BOOL SVGA_region_create(SVGA_region_info_t *rinfo)
ULONG base_cnt;
ULONG blocks = 1;
ULONG blk_pages = 0;
+ ULONG mob_pages = 0;
DWORD *mob = NULL;
- DWORD mobphy = 0;
+ //DWORD mobphy = 0;
/* allocate user block */
- laddr = _PageAllocate(nPages, PG_VM, ThisVM, 0, 0x0, 0x100000, NULL, PAGEFIXED);
+ laddr = _PageAllocate(nPages, pa_type, pa_vm, 0, 0x0, 0x100000, NULL, PAGEFIXED);
if(!laddr)
{
@@ -1242,7 +1257,7 @@ BOOL SVGA_region_create(SVGA_region_info_t *rinfo)
blk_pages = ((blocks+blk_pages+1)/(P_SIZE/sizeof(SVGAGuestMemDescriptor))) + 1;
/* allocate memory for GMR descriptor */
- pgblk = _PageAllocate(blk_pages, PG_VM, ThisVM, 0, 0x0, 0x100000, NULL, PAGEFIXED);
+ pgblk = _PageAllocate(blk_pages, pa_type, pa_vm, 0, 0x0, 0x100000, NULL, PAGEFIXED);
if(!pgblk)
{
_PageFree((PVOID)laddr, 0);
@@ -1291,8 +1306,10 @@ BOOL SVGA_region_create(SVGA_region_info_t *rinfo)
{
int i;
/* for simplicity we're always creating table of depth 2, first page is page of PPN pages */
- mob = (DWORD *)_PageAllocate(1 + (nPages + PTONPAGE - 1)/PTONPAGE, PG_VM, ThisVM, 0, 0x0, 0x100000, &mobphy, PAGECONTIG | PAGEUSEALIGN | PAGEFIXED);
-
+ //mob = (DWORD *)_PageAllocate(1 + (nPages + PTONPAGE - 1)/PTONPAGE, pa_type, pa_vm, 0, 0x0, 0x100000, &mobphy, PAGECONTIG | PAGEUSEALIGN | PAGEFIXED);
+ mob_pages = 1 + (nPages + PTONPAGE - 1)/PTONPAGE;
+ mob = (DWORD *)_PageAllocate(mob_pages, pa_type, pa_vm, 0, 0x0, 0x100000, 0, PAGEFIXED);
+
if(!mob)
{
_PageFree((PVOID)laddr, 0);
@@ -1302,9 +1319,10 @@ BOOL SVGA_region_create(SVGA_region_info_t *rinfo)
}
/* dim 1 */
- for(i = 0; i < (nPages + PTONPAGE - 1)/PTONPAGE; i++)
+ for(i = 0; i < mob_pages-1; i++)
{
- mob[i] = (mobphy/P_SIZE) + i + 1;
+ //mob[i] = (mobphy/P_SIZE) + i + 1;
+ mob[i] = getPPN(((ULONG)mob) + ((i + 1)*P_SIZE));
}
/* dim 2 */
for(i = 0; i < nPages; i++)
@@ -1320,9 +1338,12 @@ BOOL SVGA_region_create(SVGA_region_info_t *rinfo)
rinfo->mob_ppn = 0;
if(mob)
{
- rinfo->mob_ppn = mobphy/P_SIZE;
+ //rinfo->mob_ppn = mobphy/P_SIZE;
+ rinfo->mob_ppn = getPPN((ULONG)mob);
}
+ size_total = (nPages + blk_pages + mob_pages)*P_SIZE;
+
//dbg_printf(dbg_region_fragmented);
}
diff --git a/vxd_svga.h b/vxd_svga.h
index d9c767d..aa168bf 100644
--- a/vxd_svga.h
+++ b/vxd_svga.h
@@ -22,7 +22,7 @@ SVGA_DB_surface_t *SVGA_GetSurfaceInfo(DWORD sid);
#define ST_16BPP 1
#define ST_CURSOR 2
-#define ST_CURSOR_HIDEABLE 3
+#define ST_CURSOR_HIDEABLE 4
BOOL st_useable(DWORD bpp);
@@ -33,6 +33,6 @@ BOOL SVGA_mouse_hw();
BOOL SVGA_mouse_load();
void SVGA_mouse_move(int x, int y);
void SVGA_mouse_show();
-void SVGA_mouse_hide();
+void SVGA_mouse_hide(BOOL invalidate);
#endif /* __VXD_SVGA_H__INCLUDED__ */
diff --git a/vxd_svga_mouse.c b/vxd_svga_mouse.c
index 9059a8b..375d42d 100644
--- a/vxd_svga_mouse.c
+++ b/vxd_svga_mouse.c
@@ -148,13 +148,14 @@ BOOL SVGA_mouse_load()
void *mb;
CURSORSHAPE *cur;
- SVGA_mouse_hide();
-
- hw_cursor_valid = FALSE;
+ SVGA_mouse_hide(TRUE);
mb = mouse_buffer();
- if(!mb) return FALSE;
+ if(!mb)
+ {
+ return FALSE;
+ }
cur = (CURSORSHAPE*)mb;
if(cur->cx == 0 || cur->cy == 0)
@@ -232,13 +233,13 @@ void SVGA_mouse_show()
}
}
-void SVGA_mouse_hide()
+void SVGA_mouse_hide(BOOL invalidate)
{
dbg_printf(dbg_hw_mouse_hide);
gSVGA.fifoMem[SVGA_FIFO_CURSOR_SCREEN_ID] = 0;
gSVGA.fifoMem[SVGA_FIFO_CURSOR_ON] = 0;
-
+
/* vbox bug, move cursor outside screen */
if((st_flags & ST_CURSOR_HIDEABLE) == 0)
{
@@ -248,5 +249,10 @@ void SVGA_mouse_hide()
gSVGA.fifoMem[SVGA_FIFO_CURSOR_COUNT]++;
+ if(invalidate)
+ {
+ hw_cursor_valid = FALSE;
+ }
+
hw_cursor_visible = FALSE;
}