Loading llkd/libllkd.cpp +20 −6 Original line number Original line Diff line number Diff line Loading @@ -510,8 +510,10 @@ bool llkWriteStringToFileConfirm(const std::string& string, const std::string& f return android::base::Trim(content) == string; return android::base::Trim(content) == string; } } void llkPanicKernel(bool dump, pid_t tid, const char* state) __noreturn; void llkPanicKernel(bool dump, pid_t tid, const char* state, void llkPanicKernel(bool dump, pid_t tid, const char* state) { const std::string& message = "") __noreturn; void llkPanicKernel(bool dump, pid_t tid, const char* state, const std::string& message) { if (!message.empty()) LOG(ERROR) << message; auto sysrqTriggerFd = llkFileToWriteFd("/proc/sysrq-trigger"); auto sysrqTriggerFd = llkFileToWriteFd("/proc/sysrq-trigger"); if (sysrqTriggerFd < 0) { if (sysrqTriggerFd < 0) { // DYB // DYB Loading @@ -524,14 +526,24 @@ void llkPanicKernel(bool dump, pid_t tid, const char* state) { if (dump) { if (dump) { // Show all locks that are held // Show all locks that are held android::base::WriteStringToFd("d", sysrqTriggerFd); android::base::WriteStringToFd("d", sysrqTriggerFd); // Show all waiting tasks android::base::WriteStringToFd("w", sysrqTriggerFd); // This can trigger hardware watchdog, that is somewhat _ok_. // This can trigger hardware watchdog, that is somewhat _ok_. // But useless if pstore configured for <256KB, low ram devices ... // But useless if pstore configured for <256KB, low ram devices ... if (llkEnableSysrqT) { if (llkEnableSysrqT) { android::base::WriteStringToFd("t", sysrqTriggerFd); android::base::WriteStringToFd("t", sysrqTriggerFd); // Show all locks that are held (in case 't' overflows ramoops) android::base::WriteStringToFd("d", sysrqTriggerFd); // Show all waiting tasks (in case 't' overflows ramoops) android::base::WriteStringToFd("w", sysrqTriggerFd); } } ::usleep(200000); // let everything settle ::usleep(200000); // let everything settle } } llkWriteStringToFile("SysRq : Trigger a crash : 'livelock,"s + state + "'\n", "/dev/kmsg"); // SysRq message matches kernel format, and propagates through bootstat // ultimately to the boot reason into panic,livelock,<state>. llkWriteStringToFile(message + (message.empty() ? "" : "\n") + "SysRq : Trigger a crash : 'livelock,"s + state + "'\n", "/dev/kmsg"); android::base::WriteStringToFd("c", sysrqTriggerFd); android::base::WriteStringToFd("c", sysrqTriggerFd); // NOTREACHED // NOTREACHED // DYB // DYB Loading Loading @@ -1092,10 +1104,12 @@ milliseconds llkCheck(bool checkRunning) { } } } } // We are here because we have confirmed kernel live-lock // We are here because we have confirmed kernel live-lock LOG(ERROR) << state << ' ' << llkFormat(procp->count) << ' ' << ppid << "->" << pid const auto message = state + " "s + llkFormat(procp->count) + " " + << "->" << tid << ' ' << procp->getComm() << " [panic]"; std::to_string(ppid) + "->" + std::to_string(pid) + "->" + std::to_string(tid) + " " + procp->getComm() + " [panic]"; llkPanicKernel(true, tid, llkPanicKernel(true, tid, (state == 'Z') ? "zombie" : (state == 'D') ? "driver" : "sleeping"); (state == 'Z') ? "zombie" : (state == 'D') ? "driver" : "sleeping", message); } } LOG(VERBOSE) << "+closedir()"; LOG(VERBOSE) << "+closedir()"; } } Loading Loading
llkd/libllkd.cpp +20 −6 Original line number Original line Diff line number Diff line Loading @@ -510,8 +510,10 @@ bool llkWriteStringToFileConfirm(const std::string& string, const std::string& f return android::base::Trim(content) == string; return android::base::Trim(content) == string; } } void llkPanicKernel(bool dump, pid_t tid, const char* state) __noreturn; void llkPanicKernel(bool dump, pid_t tid, const char* state, void llkPanicKernel(bool dump, pid_t tid, const char* state) { const std::string& message = "") __noreturn; void llkPanicKernel(bool dump, pid_t tid, const char* state, const std::string& message) { if (!message.empty()) LOG(ERROR) << message; auto sysrqTriggerFd = llkFileToWriteFd("/proc/sysrq-trigger"); auto sysrqTriggerFd = llkFileToWriteFd("/proc/sysrq-trigger"); if (sysrqTriggerFd < 0) { if (sysrqTriggerFd < 0) { // DYB // DYB Loading @@ -524,14 +526,24 @@ void llkPanicKernel(bool dump, pid_t tid, const char* state) { if (dump) { if (dump) { // Show all locks that are held // Show all locks that are held android::base::WriteStringToFd("d", sysrqTriggerFd); android::base::WriteStringToFd("d", sysrqTriggerFd); // Show all waiting tasks android::base::WriteStringToFd("w", sysrqTriggerFd); // This can trigger hardware watchdog, that is somewhat _ok_. // This can trigger hardware watchdog, that is somewhat _ok_. // But useless if pstore configured for <256KB, low ram devices ... // But useless if pstore configured for <256KB, low ram devices ... if (llkEnableSysrqT) { if (llkEnableSysrqT) { android::base::WriteStringToFd("t", sysrqTriggerFd); android::base::WriteStringToFd("t", sysrqTriggerFd); // Show all locks that are held (in case 't' overflows ramoops) android::base::WriteStringToFd("d", sysrqTriggerFd); // Show all waiting tasks (in case 't' overflows ramoops) android::base::WriteStringToFd("w", sysrqTriggerFd); } } ::usleep(200000); // let everything settle ::usleep(200000); // let everything settle } } llkWriteStringToFile("SysRq : Trigger a crash : 'livelock,"s + state + "'\n", "/dev/kmsg"); // SysRq message matches kernel format, and propagates through bootstat // ultimately to the boot reason into panic,livelock,<state>. llkWriteStringToFile(message + (message.empty() ? "" : "\n") + "SysRq : Trigger a crash : 'livelock,"s + state + "'\n", "/dev/kmsg"); android::base::WriteStringToFd("c", sysrqTriggerFd); android::base::WriteStringToFd("c", sysrqTriggerFd); // NOTREACHED // NOTREACHED // DYB // DYB Loading Loading @@ -1092,10 +1104,12 @@ milliseconds llkCheck(bool checkRunning) { } } } } // We are here because we have confirmed kernel live-lock // We are here because we have confirmed kernel live-lock LOG(ERROR) << state << ' ' << llkFormat(procp->count) << ' ' << ppid << "->" << pid const auto message = state + " "s + llkFormat(procp->count) + " " + << "->" << tid << ' ' << procp->getComm() << " [panic]"; std::to_string(ppid) + "->" + std::to_string(pid) + "->" + std::to_string(tid) + " " + procp->getComm() + " [panic]"; llkPanicKernel(true, tid, llkPanicKernel(true, tid, (state == 'Z') ? "zombie" : (state == 'D') ? "driver" : "sleeping"); (state == 'Z') ? "zombie" : (state == 'D') ? "driver" : "sleeping", message); } } LOG(VERBOSE) << "+closedir()"; LOG(VERBOSE) << "+closedir()"; } } Loading