diff options
author | 2019-02-25 10:04:25 +0000 | |
---|---|---|
committer | 2019-02-25 10:04:25 +0000 | |
commit | 613e49e99e456df7a2b34ec820319855516c47cc (patch) | |
tree | c7eca1074a0e7773a6a166e278d5e4c2c4ceb105 | |
parent | 6476974e1b9129f271554593fb610ea3336b751e (diff) | |
parent | bb4eaf622323f861300d5e3091d12113501a9000 (diff) |
Merge "Game Driver: add dumpsys interface to GpuService"
-rw-r--r-- | services/gpuservice/Android.bp | 2 | ||||
-rw-r--r-- | services/gpuservice/GpuService.cpp | 49 | ||||
-rw-r--r-- | services/gpuservice/GpuService.h | 29 |
3 files changed, 64 insertions, 16 deletions
diff --git a/services/gpuservice/Android.bp b/services/gpuservice/Android.bp index e21d8e779d..2e8571ac4d 100644 --- a/services/gpuservice/Android.bp +++ b/services/gpuservice/Android.bp @@ -29,6 +29,7 @@ cc_defaults { "frameworks/native/vulkan/include", ], shared_libs: [ + "libbase", "libbinder", "libcutils", "libgraphicsenv", @@ -37,6 +38,7 @@ cc_defaults { "libvulkan", ], static_libs: [ + "libserviceutils", "libvkjson", ], } diff --git a/services/gpuservice/GpuService.cpp b/services/gpuservice/GpuService.cpp index ed56c49764..70dd904541 100644 --- a/services/gpuservice/GpuService.cpp +++ b/services/gpuservice/GpuService.cpp @@ -18,8 +18,12 @@ #include "GpuService.h" +#include <android-base/stringprintf.h> +#include <binder/IPCThreadState.h> #include <binder/IResultReceiver.h> #include <binder/Parcel.h> +#include <binder/PermissionCache.h> +#include <private/android_filesystem_config.h> #include <utils/String8.h> #include <utils/Trace.h> @@ -27,11 +31,14 @@ namespace android { +using base::StringAppendF; namespace { - status_t cmd_help(int out); - status_t cmd_vkjson(int out, int err); -} +status_t cmdHelp(int out); +status_t cmdVkjson(int out, int err); +} // namespace + +const String16 sDump("android.permission.DUMP"); const char* const GpuService::SERVICE_NAME = "gpu"; @@ -66,28 +73,42 @@ status_t GpuService::shellCommand(int /*in*/, int out, int err, std::vector<Stri ALOGV(" arg[%zu]: '%s'", i, String8(args[i]).string()); if (args.size() >= 1) { - if (args[0] == String16("vkjson")) - return cmd_vkjson(out, err); - if (args[0] == String16("help")) - return cmd_help(out); + if (args[0] == String16("vkjson")) return cmdVkjson(out, err); + if (args[0] == String16("help")) return cmdHelp(out); } // no command, or unrecognized command - cmd_help(err); + cmdHelp(err); return BAD_VALUE; } +status_t GpuService::doDump(int fd, const Vector<String16>& /*args*/, bool /*asProto*/) { + std::string result; + + IPCThreadState* ipc = IPCThreadState::self(); + const int pid = ipc->getCallingPid(); + const int uid = ipc->getCallingUid(); + + if ((uid != AID_SHELL) && !PermissionCache::checkPermission(sDump, pid, uid)) { + StringAppendF(&result, "Permission Denial: can't dump gpu from pid=%d, uid=%d\n", pid, uid); + } else { + result.append("Hello world from dumpsys gpu.\n"); + } + + write(fd, result.c_str(), result.size()); + return NO_ERROR; +} + namespace { -status_t cmd_help(int out) { +status_t cmdHelp(int out) { FILE* outs = fdopen(out, "w"); if (!outs) { - ALOGE("vkjson: failed to create out stream: %s (%d)", strerror(errno), - errno); + ALOGE("vkjson: failed to create out stream: %s (%d)", strerror(errno), errno); return BAD_VALUE; } fprintf(outs, - "GPU Service commands:\n" - " vkjson dump Vulkan properties as JSON\n"); + "GPU Service commands:\n" + " vkjson dump Vulkan properties as JSON\n"); fclose(outs); return NO_ERROR; } @@ -98,7 +119,7 @@ void vkjsonPrint(FILE* out) { fputc('\n', out); } -status_t cmd_vkjson(int out, int /*err*/) { +status_t cmdVkjson(int out, int /*err*/) { FILE* outs = fdopen(out, "w"); if (!outs) { int errnum = errno; diff --git a/services/gpuservice/GpuService.h b/services/gpuservice/GpuService.h index 389e695a19..7216035cd9 100644 --- a/services/gpuservice/GpuService.h +++ b/services/gpuservice/GpuService.h @@ -20,13 +20,14 @@ #include <binder/IInterface.h> #include <cutils/compiler.h> #include <graphicsenv/IGpuService.h> +#include <serviceutils/PriorityDumper.h> #include <mutex> #include <vector> namespace android { -class GpuService : public BnGpuService { +class GpuService : public BnGpuService, public PriorityDumper { public: static const char* const SERVICE_NAME ANDROID_API; @@ -36,12 +37,36 @@ protected: status_t shellCommand(int in, int out, int err, std::vector<String16>& args) override; private: - // IGpuService interface + /* + * IGpuService interface + */ void setGpuStats(const std::string& driverPackageName, const std::string& driverVersionName, uint64_t driverVersionCode, int64_t driverBuildTime, const std::string& appPackageName, GraphicsEnv::Driver driver, bool isDriverLoaded, int64_t driverLoadingTime); + /* + * IBinder interface + */ + status_t dump(int fd, const Vector<String16>& args) override { return priorityDump(fd, args); } + + /* + * Debugging & dumpsys + */ + status_t dumpCritical(int fd, const Vector<String16>& /*args*/, bool asProto) override { + return doDump(fd, Vector<String16>(), asProto); + } + + status_t dumpAll(int fd, const Vector<String16>& args, bool asProto) override { + return doDump(fd, args, asProto); + } + + status_t doDump(int fd, const Vector<String16>& args, bool asProto); + + /* + * Attributes + */ + // GpuStats access must be protected by mStateLock std::mutex mStateLock; }; |