From 06b98125680694daa946197e4ec0a8b81e9084cf Mon Sep 17 00:00:00 2001 From: Lucas Fryzek Date: Mon, 8 Jul 2024 21:53:33 +0100 Subject: Get more tracing working --- drvemu.c | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 91 insertions(+), 9 deletions(-) (limited to 'drvemu.c') diff --git a/drvemu.c b/drvemu.c index 5499675..5d8f407 100644 --- a/drvemu.c +++ b/drvemu.c @@ -33,7 +33,10 @@ #include #include #include -//#include +#include + +#define DRM_IOCTL_PVR_SRVKM DRM_IOWR(PVR_DRM_SRVKM_CMD, PVRSRV_BRIDGE_PACKAGE) +#include "pvr_ioctl.h" static int false_fd = 10241024; @@ -42,27 +45,101 @@ static int false_fd = 10241024; if(!orig_##func) \ orig_##func = dlsym(RTLD_NEXT, #func); -int open(const char *pathname, int flags, mode_t mode) { - printf("Called open on %s (%d)\n", pathname, flags); - PROLOG(open); - return orig_open(pathname, flags, mode); -} - int open64(const char *pathname, int flags, ...) { printf("Called open64 on %s (%d)\n", pathname, flags); PROLOG(open64); + int fd = orig_open64(pathname, flags); if (strcmp(pathname, "/dev/dri/renderD128") == 0) { printf("Spoofing FD!\n"); return false_fd; } + return fd; } +int fcntl(int fd, int op, int arg) { + printf("Called fcntl on %d\n", fd); + PROLOG(fcntl); + + if (fd == false_fd) + return 0; + + return orig_fcntl(fd, op, arg); +} + #define DEV_NAME "pvr" #define DEV_DATE "20110701" #define DEV_DESC "Imagination Technologies PVR DRM" +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; + info->uData.sSGXFeatures.ui32DDKBuild = 3759903; + info->uData.sSGXFeatures.ui32DDKVersion = (1 << 16) | (14 << 8); + break; + default: + printf("Unimplemented misc req %d\n", info->eRequest); + assert(false); + break; + } +} + +static bool pvrsrv_ioctl(int fd, PVRSRV_BRIDGE_PACKAGE *bridge_package) { + int ioctl_nr = _IOC_NR(bridge_package->ui32BridgeID); + printf(">>> pvr_ioctl(%s)(0x%x)\n", pvrsrv_ioctl_names[ioctl_nr], bridge_package->ui32BridgeID); + switch(ioctl_nr) { + case _IOC_NR(PVRSRV_BRIDGE_CONNECT_SERVICES): { + PVRSRV_BRIDGE_OUT_CONNECT_SERVICES *data = bridge_package->pvParamOut; + data->eError = PVRSRV_OK; + data->hKernelServices = (void*)0x2; + break; + } + case _IOC_NR(PVRSRV_BRIDGE_ENUM_DEVICES): { + PVRSRV_BRIDGE_OUT_ENUMDEVICE *out = bridge_package->pvParamOut; + out->eError = PVRSRV_OK; + out->ui32NumDevices = 1; + out->asDeviceIdentifier[0].eDeviceType = PVRSRV_DEVICE_TYPE_SGX; + out->asDeviceIdentifier[0].eDeviceClass = PVRSRV_DEVICE_CLASS_3D; + out->asDeviceIdentifier[0].ui32DeviceIndex = 0; + out->asDeviceIdentifier[0].pszPDumpDevName = NULL; + out->asDeviceIdentifier[0].pszPDumpRegName = NULL; + break; + } + case _IOC_NR(PVRSRV_BRIDGE_ACQUIRE_DEVICEINFO): { + PVRSRV_BRIDGE_OUT_ACQUIRE_DEVICEINFO *out = bridge_package->pvParamOut; + out->eError = PVRSRV_OK; + out->hDevCookie = (void*)0x1; + break; + } + case _IOC_NR(PVRSRV_BRIDGE_SGX_GETMISCINFO): { + printf("Get misc info!\n"); + PVRSRV_BRIDGE_IN_SGXGETMISCINFO *in = bridge_package->pvParamIn; + PVRSRV_BRIDGE_RETURN *out = bridge_package->pvParamOut; + out->eError = PVRSRV_OK; + get_misc_info(in->psMiscInfo); + break; + } +#if 0 + case _IOC_NR(PVRSRV_BRIDGE_SGX_DEVINITPART2): { + PVRSRV_BRIDGE_OUT_SGXDEVINITPART2 *out = bridge_package->pvParamOut; + out->eError = PVRSRV_OK; + out->ui32KMBuildOptions = SGX_BUILD_OPTIONS; + printf("Input size is 0x%x\n", bridge_package->ui32InBufferSize); + printf("Build options 0x%x\n", SGX_BUILD_OPTIONS); + //out->ui32KMBuildOptions = 0x36a118; + break; + } +#endif + default: + printf("Unimplemented pvrsrv ioctl %d, may be %s\n", ioctl_nr, pvrsrv_ioctl_names[ioctl_nr]); + assert(false); + break; + } + return false; +} + static bool spoof_ioctl(int fd, int request, void *ptr) { int ioctl_nr = _IOC_NR(request); switch(ioctl_nr) { @@ -108,10 +185,9 @@ static bool spoof_ioctl(int fd, int request, void *ptr) { printf(">>> ioctl(DRM_IOCTL_DROP_MASTER)\n"); return 0; case PVR_DRM_SRVKM_CMD: - printf("srv command 0x%x\n", PVR_DRM_SRVKM_CMD); //fwrite(ptr, 1, sizeof(PVRSRV_BRIDGE_PACKAGE), log_file); //PPRINT(stdout, ptr, PVRSRV_BRIDGE_PACKAGE); - //return pvrsrv_ioctl(fd, ptr); + return pvrsrv_ioctl(fd, ptr); break; case PVR_DRM_IS_MASTER_CMD: printf(">>> ioctl(PVR_DRM_IS_MASTER_CMD) 0x%x\n", PVR_DRM_SRVKM_CMD); @@ -147,6 +223,12 @@ int ioctl(int fd, int request, ...) { return orig_ioctl(fd, request, ptr); } +int open(const char *pathname, int flags, mode_t mode) { + printf("Called open on %s (%d)\n", pathname, flags); + PROLOG(open); + return orig_open(pathname, flags, mode); +} + int openat(int dirfd, const char *pathname, int flags, ...) { printf("Called openat on %s (%d) (%d)\n", pathname, dirfd, flags); PROLOG(openat); -- cgit