Now About Social Code
summaryrefslogtreecommitdiff
path: root/drvemu.c
diff options
context:
space:
mode:
Diffstat (limited to 'drvemu.c')
-rw-r--r--drvemu.c100
1 files changed, 91 insertions, 9 deletions
diff --git a/drvemu.c b/drvemu.c
index 5499675..5d8f407 100644
--- a/drvemu.c
+++ b/drvemu.c
@@ -33,7 +33,10 @@
#include <pvr_drm_shared.h>
#include <sgxconfig.h>
#include <sgx_mkif_km.h>
-//#include <pvr_drm.h>
+#include <sgx_options.h>
+
+#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);