Use `ucontext_t` instead of `ucontext`
authorAndroid Tools Maintainers <android-tools-devel@lists.alioth.debian.org>
Fri, 20 Jan 2023 08:36:41 +0000 (08:36 +0000)
committerRoger Shimizu <rosh@debian.org>
Fri, 20 Jan 2023 08:36:41 +0000 (08:36 +0000)
Forwarded: not-needed

Both Bionic and glibc define a struct called `ucontext_t` but only Bionic
defines an alias `ucontext_t`. Let's use the more standardized one.

Gbp-Pq: Topic art
Gbp-Pq: Name ucontext.patch

art/runtime/arch/arm/fault_handler_arm.cc
art/runtime/arch/arm/instruction_set_features_arm.cc
art/runtime/arch/arm64/fault_handler_arm64.cc
art/runtime/arch/mips/fault_handler_mips.cc
art/runtime/arch/mips64/fault_handler_mips64.cc
art/runtime/arch/x86/fault_handler_x86.cc
art/runtime/native_stack_dump.cc

index 4e7d64ccfa10c89cf67b89ae303ba8fd60f0ad9f..7a11c642f464cb3e56f8f6c513a00d4b3d710a14 100644 (file)
@@ -51,7 +51,7 @@ void FaultManager::GetMethodAndReturnPcAndSp(siginfo_t* siginfo ATTRIBUTE_UNUSED
                                              uintptr_t* out_return_pc,
                                              uintptr_t* out_sp,
                                              bool* out_is_stack_overflow) {
-  struct ucontext* uc = reinterpret_cast<struct ucontext*>(context);
+  struct ucontext_t* uc = reinterpret_cast<struct ucontext_t*>(context);
   struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext);
   *out_sp = static_cast<uintptr_t>(sc->arm_sp);
   VLOG(signals) << "sp: " << std::hex << *out_sp;
@@ -104,7 +104,7 @@ bool NullPointerHandler::Action(int sig ATTRIBUTE_UNUSED, siginfo_t* info, void*
   // register in order to find the mapping.
 
   // Need to work out the size of the instruction that caused the exception.
-  struct ucontext *uc = reinterpret_cast<struct ucontext*>(context);
+  struct ucontext_t *uc = reinterpret_cast<struct ucontext_t*>(context);
   struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext);
   uint8_t* ptr = reinterpret_cast<uint8_t*>(sc->arm_pc);
   uint32_t instr_size = GetInstructionSize(ptr);
@@ -137,7 +137,7 @@ bool SuspensionHandler::Action(int sig ATTRIBUTE_UNUSED, siginfo_t* info ATTRIBU
       + Thread::ThreadSuspendTriggerOffset<PointerSize::k32>().Int32Value();
   uint16_t checkinst2 = 0x6800;
 
-  struct ucontext* uc = reinterpret_cast<struct ucontext*>(context);
+  struct ucontext_t* uc = reinterpret_cast<struct ucontext_t*>(context);
   struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext);
   uint8_t* ptr2 = reinterpret_cast<uint8_t*>(sc->arm_pc);
   uint8_t* ptr1 = ptr2 - 4;
@@ -202,7 +202,7 @@ bool SuspensionHandler::Action(int sig ATTRIBUTE_UNUSED, siginfo_t* info ATTRIBU
 
 bool StackOverflowHandler::Action(int sig ATTRIBUTE_UNUSED, siginfo_t* info ATTRIBUTE_UNUSED,
                                   void* context) {
-  struct ucontext* uc = reinterpret_cast<struct ucontext*>(context);
+  struct ucontext_t* uc = reinterpret_cast<struct ucontext_t*>(context);
   struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext);
   VLOG(signals) << "stack overflow handler with sp at " << std::hex << &uc;
   VLOG(signals) << "sigcontext: " << std::hex << sc;
index fdf4dbd7bebc8cd795b7daa30c64e36a0a01f098..4df8f26bae6ea404d1029ce449b576948ec7ba40 100644 (file)
@@ -223,8 +223,9 @@ static void bad_instr_handle(int signo ATTRIBUTE_UNUSED,
                             siginfo_t* si ATTRIBUTE_UNUSED,
                             void* data) {
 #if defined(__arm__)
-  struct ucontext *uc = (struct ucontext *)data;
-  struct sigcontext *sc = &uc->uc_mcontext;
+  struct ucontext_t *uc = (struct ucontext_t *)data;
+  // See the starting chunk of `FaultManager::GetMethodAndReturnPcAndSp()` in `fault_handler_arm.cc`
+  struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext);
   sc->arm_r0 = 0;     // Set R0 to #0 to signal error.
   sc->arm_pc += 4;    // Skip offending instruction.
 #else
index c139e21d05f3b330b0fd609036b26d53a8e7bbb4..9447fb1449e52c612a1065f0c28c691f68ebec57 100644 (file)
@@ -44,7 +44,7 @@ void FaultManager::GetMethodAndReturnPcAndSp(siginfo_t* siginfo ATTRIBUTE_UNUSED
                                              uintptr_t* out_return_pc,
                                              uintptr_t* out_sp,
                                              bool* out_is_stack_overflow) {
-  struct ucontext *uc = reinterpret_cast<struct ucontext *>(context);
+  struct ucontext_t *uc = reinterpret_cast<struct ucontext_t *>(context);
   struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext);
   *out_sp = static_cast<uintptr_t>(sc->sp);
   VLOG(signals) << "sp: " << *out_sp;
@@ -82,7 +82,7 @@ bool NullPointerHandler::Action(int sig ATTRIBUTE_UNUSED, siginfo_t* info, void*
   // PC at the point of call.  For Null checks we insert a GC map that is immediately after
   // the load/store instruction that might cause the fault.
 
-  struct ucontext *uc = reinterpret_cast<struct ucontext*>(context);
+  struct ucontext_t *uc = reinterpret_cast<struct ucontext_t*>(context);
   struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext);
 
   // Push the gc map location to the stack and pass the fault address in LR.
@@ -111,7 +111,7 @@ bool SuspensionHandler::Action(int sig ATTRIBUTE_UNUSED, siginfo_t* info ATTRIBU
       (Thread::ThreadSuspendTriggerOffset<PointerSize::k64>().Int32Value() << 7);
   uint32_t checkinst2 = 0xf9400000;
 
-  struct ucontext *uc = reinterpret_cast<struct ucontext *>(context);
+  struct ucontext_t *uc = reinterpret_cast<struct ucontext_t *>(context);
   struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext);
   uint8_t* ptr2 = reinterpret_cast<uint8_t*>(sc->pc);
   uint8_t* ptr1 = ptr2 - 4;
@@ -157,7 +157,7 @@ bool SuspensionHandler::Action(int sig ATTRIBUTE_UNUSED, siginfo_t* info ATTRIBU
 
 bool StackOverflowHandler::Action(int sig ATTRIBUTE_UNUSED, siginfo_t* info ATTRIBUTE_UNUSED,
                                   void* context) {
-  struct ucontext *uc = reinterpret_cast<struct ucontext *>(context);
+  struct ucontext_t *uc = reinterpret_cast<struct ucontext_t *>(context);
   struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext);
   VLOG(signals) << "stack overflow handler with sp at " << std::hex << &uc;
   VLOG(signals) << "sigcontext: " << std::hex << sc;
index f55df9251766de5b133a10a8a35cc57ce0dd0b33..1663ca34adea883129ed9433f2cffa22222384c5 100644 (file)
@@ -43,7 +43,7 @@ void FaultManager::GetMethodAndReturnPcAndSp(siginfo_t* siginfo,
                                              uintptr_t* out_return_pc,
                                              uintptr_t* out_sp,
                                              bool* out_is_stack_overflow) {
-  struct ucontext* uc = reinterpret_cast<struct ucontext*>(context);
+  struct ucontext_t* uc = reinterpret_cast<struct ucontext_t*>(context);
   struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext);
   *out_sp = static_cast<uintptr_t>(sc->sc_regs[mips::SP]);
   VLOG(signals) << "sp: " << *out_sp;
@@ -82,7 +82,7 @@ bool NullPointerHandler::Action(int sig ATTRIBUTE_UNUSED, siginfo_t* info, void*
   // PC at the point of call.  For Null checks we insert a GC map that is immediately after
   // the load/store instruction that might cause the fault.
 
-  struct ucontext *uc = reinterpret_cast<struct ucontext*>(context);
+  struct ucontext_t *uc = reinterpret_cast<struct ucontext_t*>(context);
   struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext);
 
   // Decrement $sp by the frame size of the kSaveEverything method and store
@@ -117,7 +117,7 @@ bool SuspensionHandler::Action(int sig ATTRIBUTE_UNUSED, siginfo_t* info ATTRIBU
 // to the overflow region below the protected region.
 
 bool StackOverflowHandler::Action(int sig ATTRIBUTE_UNUSED, siginfo_t* info, void* context) {
-  struct ucontext* uc = reinterpret_cast<struct ucontext*>(context);
+  struct ucontext_t* uc = reinterpret_cast<struct ucontext_t*>(context);
   struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext);
   VLOG(signals) << "stack overflow handler with sp at " << std::hex << &uc;
   VLOG(signals) << "sigcontext: " << std::hex << sc;
index ff53fa69655a57157e8bccc794acc261e1b6676b..dfc42b1abf31d990adbea74c42f45f9dbc1ebccb 100644 (file)
@@ -44,7 +44,7 @@ void FaultManager::GetMethodAndReturnPcAndSp(siginfo_t* siginfo,
                                              uintptr_t* out_return_pc,
                                              uintptr_t* out_sp,
                                              bool* out_is_stack_overflow) {
-  struct ucontext* uc = reinterpret_cast<struct ucontext*>(context);
+  struct ucontext_t* uc = reinterpret_cast<struct ucontext_t*>(context);
   struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext);
   *out_sp = static_cast<uintptr_t>(sc->sc_regs[mips64::SP]);
   VLOG(signals) << "sp: " << *out_sp;
@@ -84,7 +84,7 @@ bool NullPointerHandler::Action(int sig ATTRIBUTE_UNUSED, siginfo_t* info, void*
   // PC at the point of call.  For Null checks we insert a GC map that is immediately after
   // the load/store instruction that might cause the fault.
 
-  struct ucontext *uc = reinterpret_cast<struct ucontext*>(context);
+  struct ucontext_t *uc = reinterpret_cast<struct ucontext_t*>(context);
   struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext);
 
   // Decrement $sp by the frame size of the kSaveEverything method and store
@@ -119,7 +119,7 @@ bool SuspensionHandler::Action(int sig ATTRIBUTE_UNUSED, siginfo_t* info ATTRIBU
 // to the overflow region below the protected region.
 
 bool StackOverflowHandler::Action(int sig ATTRIBUTE_UNUSED, siginfo_t* info, void* context) {
-  struct ucontext* uc = reinterpret_cast<struct ucontext*>(context);
+  struct ucontext_t* uc = reinterpret_cast<struct ucontext_t*>(context);
   struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext);
   VLOG(signals) << "stack overflow handler with sp at " << std::hex << &uc;
   VLOG(signals) << "sigcontext: " << std::hex << sc;
index 3a08ec5cd1161c7805f51d139f1c7e2a19983836..9e0ede7f2b2d653a1b9e8ecec6a21f0991bb3b70 100644 (file)
@@ -282,7 +282,7 @@ void FaultManager::GetMethodAndReturnPcAndSp(siginfo_t* siginfo, void* context,
                                              uintptr_t* out_return_pc,
                                              uintptr_t* out_sp,
                                              bool* out_is_stack_overflow) {
-  struct ucontext* uc = reinterpret_cast<struct ucontext*>(context);
+  struct ucontext_t* uc = reinterpret_cast<struct ucontext_t*>(context);
   *out_sp = static_cast<uintptr_t>(uc->CTX_ESP);
   VLOG(signals) << "sp: " << std::hex << *out_sp;
   if (*out_sp == 0) {
@@ -329,7 +329,7 @@ bool NullPointerHandler::Action(int, siginfo_t* sig, void* context) {
   if (!IsValidImplicitCheck(sig)) {
     return false;
   }
-  struct ucontext *uc = reinterpret_cast<struct ucontext*>(context);
+  struct ucontext_t *uc = reinterpret_cast<struct ucontext_t*>(context);
   uint8_t* pc = reinterpret_cast<uint8_t*>(uc->CTX_EIP);
   uint8_t* sp = reinterpret_cast<uint8_t*>(uc->CTX_ESP);
 
@@ -385,7 +385,7 @@ bool SuspensionHandler::Action(int, siginfo_t*, void* context) {
 #endif
   uint8_t checkinst2[] = {0x85, 0x00};
 
-  struct ucontext *uc = reinterpret_cast<struct ucontext*>(context);
+  struct ucontext_t *uc = reinterpret_cast<struct ucontext_t*>(context);
   uint8_t* pc = reinterpret_cast<uint8_t*>(uc->CTX_EIP);
   uint8_t* sp = reinterpret_cast<uint8_t*>(uc->CTX_ESP);
 
@@ -441,7 +441,7 @@ bool SuspensionHandler::Action(int, siginfo_t*, void* context) {
 // address for the previous method is on the stack at ESP.
 
 bool StackOverflowHandler::Action(int, siginfo_t* info, void* context) {
-  struct ucontext *uc = reinterpret_cast<struct ucontext*>(context);
+  struct ucontext_t *uc = reinterpret_cast<struct ucontext_t*>(context);
   uintptr_t sp = static_cast<uintptr_t>(uc->CTX_ESP);
 
   uintptr_t fault_addr = reinterpret_cast<uintptr_t>(info->si_addr);
index 74d9033b151d2ccf9a22b1c7c3b98d3ff2ef65dc..08d6a2fbc217270a5b1ad52bef9d4222db4e32a5 100644 (file)
@@ -38,6 +38,7 @@
 #include <stdlib.h>
 #include <sys/time.h>
 #include <sys/types.h>
+#include <sys/ucontext.h>
 
 #include "android-base/file.h"
 #include "android-base/stringprintf.h"
@@ -334,7 +335,7 @@ void DumpNativeStack(std::ostream& os,
   }
   std::unique_ptr<Backtrace> backtrace(Backtrace::Create(BACKTRACE_CURRENT_PROCESS, tid, map));
   backtrace->SetSkipFrames(skip_frames);
-  if (!backtrace->Unwind(0, reinterpret_cast<ucontext*>(ucontext_ptr))) {
+  if (!backtrace->Unwind(0, reinterpret_cast<ucontext_t*>(ucontext_ptr))) {
     os << prefix << "(backtrace::Unwind failed for thread " << tid
        << ": " <<  backtrace->GetErrorString(backtrace->GetError()) << ")" << std::endl;
     return;