Now About Social Code
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLucas Fryzek <lucas.fryzek@fryzekconcepts.com>2024-07-20 23:32:00 +0100
committerLucas Fryzek <lucas.fryzek@fryzekconcepts.com>2024-07-20 23:32:00 +0100
commit4193a0967c0b1cdc48c30204d442f9c48f1436a6 (patch)
tree04e3620ccdf031a0e6dd154b37d29771a1f5542b
parent28ed58081b2961cae41e87eeb77a2d41dc9f0532 (diff)
drvemu: Implement more ioctls for gles test to init
-rw-r--r--src/drvemu.c85
1 files changed, 84 insertions, 1 deletions
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):