From 4193a0967c0b1cdc48c30204d442f9c48f1436a6 Mon Sep 17 00:00:00 2001 From: Lucas Fryzek Date: Sat, 20 Jul 2024 23:32:00 +0100 Subject: drvemu: Implement more ioctls for gles test to init --- src/drvemu.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 84 insertions(+), 1 deletion(-) diff --git a/src/drvemu.c b/src/drvemu.c index f1fdfca..3188ec1 100644 --- a/src/drvemu.c +++ b/src/drvemu.c @@ -58,7 +58,11 @@ #define MAX_ALLOCATIONS 1024 +#define STR_DETAIL(x) #x +#define STR(x) STR_DETAIL(x) #define LOG(msg...) fprintf(stderr, "[DRVEMU] " msg) +#define SOFT_TODO(msg) LOG(__FILE__ ":" STR(__LINE__) " " msg "\n") +#define TODO(msg) SOFT_TODO(msg); assert(0) struct memory_allocation { bool allocated; @@ -88,6 +92,13 @@ static int alloc_memory(int heap, size_t size) { return -1; } +#define create_handle(size, msg) create_handle_helper((size), (msg), __FILE__, __LINE__) +static void *create_handle_helper(int size, const char *msg, const char *file, int line) { + int handle = alloc_memory(0, size); // TODO handle heap correctly here; + LOG("%s:%d Creating handle 0x%x for %s\n", file, line, handle, msg); + return (void*)handle; +} + #define PROLOG(func) \ static typeof(func) *orig_##func = NULL; \ if(!orig_##func) \ @@ -211,7 +222,7 @@ PVRSRV_HEAP_INFO pvr_heaps[] = { #define DEV_DATE "20110701" #define DEV_DESC "Imagination Technologies PVR DRM" -void get_misc_info(SGX_MISC_INFO *info) { +static void get_misc_info(SGX_MISC_INFO *info) { switch(info->eRequest) { case SGX_MISC_INFO_REQUEST_DRIVER_SGXREV: info->uData.sSGXFeatures.ui32BuildOptions = SGX_BUILD_OPTIONS; @@ -220,6 +231,7 @@ void get_misc_info(SGX_MISC_INFO *info) { break; case SGX_MISC_INFO_REQUEST_SGXREV: // TODO need to get this from real hardware + LOG("TODO dump SGX_MISC_INFO_REQUEST_SGXREV from hw"); info->uData.sSGXFeatures.ui32BuildOptions = SGX_BUILD_OPTIONS; info->uData.sSGXFeatures.ui32DDKBuild = 3759903; info->uData.sSGXFeatures.ui32DDKVersion = (1 << 16) | (14 << 8); @@ -234,6 +246,57 @@ void get_misc_info(SGX_MISC_INFO *info) { } } +static void get_bridge_misc(PVRSRV_BRIDGE_IN_GET_MISC_INFO *in, PVRSRV_BRIDGE_OUT_GET_MISC_INFO *out) { +#define if_present(present) if (in->sMiscInfo.ui32StateRequest & (present)) + if_present(PVRSRV_MISC_INFO_MEMSTATS_PRESENT) { + TODO("Implement PVRSRV_MISC_INFO_MEMSTATS_PRESENT"); + } + if_present(PVRSRV_MISC_INFO_DDKVERSION_PRESENT) { + TODO("Implement PVRSRV_MISC_INFO_DDKVERSION_PRESENT"); + } + if_present(PVRSRV_MISC_INFO_FREEMEM_PRESENT) { + TODO("Implement PVRSRV_MISC_INFO_FREEMEM_PRESENT"); + } + if_present(PVRSRV_MISC_INFO_TIMER_PRESENT) { + out->sMiscInfo.ui32StatePresent |= PVRSRV_MISC_INFO_TIMER_PRESENT; + out->sMiscInfo.pvSOCTimerRegisterKM = create_handle(1024, "PVRSRV_MISC_INFO_TIMER_PRESENT"); + out->sMiscInfo.hSOCTimerRegisterOSMemHandle = out->sMiscInfo.pvSOCTimerRegisterKM; + } else { + out->sMiscInfo.pvSOCTimerRegisterKM = IMG_NULL; + out->sMiscInfo.hSOCTimerRegisterOSMemHandle = IMG_NULL; + } + if_present(PVRSRV_MISC_INFO_CLOCKGATE_PRESENT) { + out->sMiscInfo.ui32StatePresent |= PVRSRV_MISC_INFO_CLOCKGATE_PRESENT; + SOFT_TODO("Returning clock gate registers that may be incorrect, get real data from hw"); + out->sMiscInfo.pvSOCClockGateRegs = 0x0; + out->sMiscInfo.ui32SOCClockGateRegsSize = 0x0; + } + if_present(PVRSRV_MISC_INFO_GLOBALEVENTOBJECT_PRESENT) { + out->sMiscInfo.ui32StatePresent |= PVRSRV_MISC_INFO_GLOBALEVENTOBJECT_PRESENT; + SOFT_TODO("Returning global event object that may not be correct, get real data from hw"); + strcpy(out->sMiscInfo.sGlobalEventObject.szName, "GEOEMU"); + out->sMiscInfo.sGlobalEventObject.hOSEventKM = create_handle(1024, "PVRSRV_MISC_INFO_GLOBALEVENTOBJECT_PRESENT"); + } + if_present(PVRSRV_MISC_INFO_CPUCACHEOP_PRESENT) { + TODO("Implement PVRSRV_MISC_INFO_CPUCACHEOP_PRESENT"); + } + if_present(PVRSRV_MISC_INFO_RESET_PRESENT) { + TODO("Implement PVRSRV_MISC_INFO_RESET_PRESENT"); + } + if_present(PVRSRV_MISC_INFO_GET_REF_COUNT_PRESENT) { + TODO("Implement PVRSRV_MISC_INFO_GET_REF_COUNT_PRESENT"); + } + if_present(PVRSRV_MISC_INFO_GET_PAGE_SIZE_PRESENT) { + TODO("Implement PVRSRV_MISC_INFO_GET_PAGE_SIZE_PRESENT"); + } + if_present(PVRSRV_MISC_INFO_FORCE_SWAP_TO_SYSTEM_PRESENT) { + TODO("Implement PVRSRV_MISC_INFO_FORCE_SWAP_TO_SYSTEM_PRESENT"); + } + + out->eError = PVRSRV_OK; +#undef if_present +} + static bool pvrsrv_ioctl(int fd, PVRSRV_BRIDGE_PACKAGE *bridge_package) { int ioctl_nr = _IOC_NR(bridge_package->ui32BridgeID); LOG(">>> pvr_ioctl(%s)(0x%x)\n", pvrsrv_ioctl_names[ioctl_nr], bridge_package->ui32BridgeID); @@ -401,6 +464,26 @@ static bool pvrsrv_ioctl(int fd, PVRSRV_BRIDGE_PACKAGE *bridge_package) { out->bMUnmap = false; break; } + case _IOC_NR(PVRSRV_BRIDGE_GET_MISC_INFO): { + PVRSRV_BRIDGE_IN_GET_MISC_INFO *in = bridge_package->pvParamIn; + PVRSRV_BRIDGE_OUT_GET_MISC_INFO *out = bridge_package->pvParamOut; + get_bridge_misc(in, out); + break; + } + case _IOC_NR(PVRSRV_BRIDGE_EVENT_OBJECT_OPEN): { + PVRSRV_BRIDGE_IN_EVENT_OBJECT_OPEN *in = bridge_package->pvParamIn; + PVRSRV_BRIDGE_OUT_EVENT_OBJECT_OPEN *out = bridge_package->pvParamOut; + out->eError = PVRSRV_OK; + out->hOSEvent = in->sEventObject.hOSEventKM; + break; + } + case _IOC_NR(PVRSRV_BRIDGE_GET_DEVMEM_HEAPINFO): { + PVRSRV_BRIDGE_OUT_GET_DEVMEM_HEAPINFO *out = bridge_package->pvParamOut; + out->eError = PVRSRV_OK; + out->ui32ClientHeapCount = sizeof(pvr_heaps)/sizeof(*pvr_heaps); + memcpy(out->sHeapInfo, pvr_heaps, sizeof(pvr_heaps)); + break; + } case _IOC_NR(PVRSRV_BRIDGE_DISCONNECT_SERVICES): case _IOC_NR(PVRSRV_BRIDGE_SGX_RELEASECLIENTINFO): case _IOC_NR(PVRSRV_BRIDGE_CLOSE_DISPCLASS_DEVICE): -- cgit