diff options
Diffstat (limited to 'meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system')
16 files changed, 1202 insertions, 0 deletions
diff --git a/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/Add-riscv64-support.patch b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/Add-riscv64-support.patch new file mode 100644 index 0000000000..9fd0fa792c --- /dev/null +++ b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/Add-riscv64-support.patch @@ -0,0 +1,653 @@ +From: Guo Ren <guoren@linux.alibaba.com> +Date: Wed, 29 Jun 2022 16:46:46 +0800 +Subject: Add riscv64 support + +This patch contains the dwarf unwind support for 64bit risc-v. + + * DwarfCfa.cpp (cfa_def_cfa_register): setup register if CFA_REG is + not setup for riscv64 + * Elf.cpp (GetRelPc): convert offset to virtual address for riscv64. + * ElfInterface.cpp (GetVirtAddrFromOffset): New for riscv64. + * RegsRiscv64.cpp (StepIfSignalHandler): Fix signal frame check. + libunwindstack/include/unwindstack/ + * ElfInterface.h (GetVirtAddrFromOffset): New for riscv64. + libunwindstack/tests/ + * DwarfCfaTest.cpp (cfa_def_cfa_register): ok for riscv64. + * RegsStepIfSignalHandlerTest.cpp (riscv64_step_if_signal_handler): Fix + testcase for riscv64 + +Test: Builds. +Test: All unit tests pass. + +Signed-off-by: Guo Ren <guoren@linux.alibaba.com> +Signed-off-by: Lifang Xia <lifang_xia@linux.alibaba.com> +Signed-off-by: Mao Han <han_mao@linux.alibaba.com> +Change-Id: Ib21ddf23cc83f332af202df7bffcaceec16063e0 +--- +Upstream-Status: Pending + + system/core/libunwindstack/Android.bp | 1 + + system/core/libunwindstack/Elf.cpp | 2 + + system/core/libunwindstack/Regs.cpp | 10 ++ + system/core/libunwindstack/RegsRiscv64.cpp | 156 +++++++++++++++++++++ + .../core/libunwindstack/include/unwindstack/Elf.h | 5 + + .../include/unwindstack/MachineRiscv64.h | 59 ++++++++ + .../include/unwindstack/RegsGetLocal.h | 43 ++++++ + .../include/unwindstack/RegsRiscv64.h | 59 ++++++++ + .../include/unwindstack/UcontextRiscv64.h | 80 +++++++++++ + .../include/unwindstack/UserRiscv64.h | 37 +++++ + system/core/libunwindstack/tools/unwind.cpp | 3 + + .../core/libunwindstack/tools/unwind_symbols.cpp | 3 + + 12 files changed, 458 insertions(+) + create mode 100644 system/core/libunwindstack/RegsRiscv64.cpp + create mode 100644 system/core/libunwindstack/include/unwindstack/MachineRiscv64.h + create mode 100644 system/core/libunwindstack/include/unwindstack/RegsRiscv64.h + create mode 100644 system/core/libunwindstack/include/unwindstack/UcontextRiscv64.h + create mode 100644 system/core/libunwindstack/include/unwindstack/UserRiscv64.h + +diff --git a/system/core/libunwindstack/Android.bp b/system/core/libunwindstack/Android.bp +index 3695f72..f1f9c68 100644 +--- a/system/core/libunwindstack/Android.bp ++++ b/system/core/libunwindstack/Android.bp +@@ -70,6 +70,7 @@ cc_library { + "RegsArm64.cpp", + "RegsX86.cpp", + "RegsX86_64.cpp", ++ "RegsRiscv64.cpp", + "RegsMips.cpp", + "RegsMips64.cpp", + "Unwinder.cpp", +diff --git a/system/core/libunwindstack/Elf.cpp b/system/core/libunwindstack/Elf.cpp +index f01b092..3c2088b 100644 +--- a/system/core/libunwindstack/Elf.cpp ++++ b/system/core/libunwindstack/Elf.cpp +@@ -290,6 +290,8 @@ ElfInterface* Elf::CreateInterfaceFromMemory(Memory* memory) { + arch_ = ARCH_X86_64; + } else if (e_machine == EM_MIPS) { + arch_ = ARCH_MIPS64; ++ } else if (e_machine == EM_RISCV) { ++ arch_ = ARCH_RISCV64; + } else { + // Unsupported. + ALOGI("64 bit elf that is neither aarch64 nor x86_64 nor mips64: e_machine = %d\n", +diff --git a/system/core/libunwindstack/Regs.cpp b/system/core/libunwindstack/Regs.cpp +index c7dec52..447a554 100644 +--- a/system/core/libunwindstack/Regs.cpp ++++ b/system/core/libunwindstack/Regs.cpp +@@ -27,12 +27,14 @@ + #include <unwindstack/RegsArm64.h> + #include <unwindstack/RegsMips.h> + #include <unwindstack/RegsMips64.h> ++#include <unwindstack/RegsRiscv64.h> + #include <unwindstack/RegsX86.h> + #include <unwindstack/RegsX86_64.h> + #include <unwindstack/UserArm.h> + #include <unwindstack/UserArm64.h> + #include <unwindstack/UserMips.h> + #include <unwindstack/UserMips64.h> ++#include <unwindstack/UserRiscv64.h> + #include <unwindstack/UserX86.h> + #include <unwindstack/UserX86_64.h> + +@@ -67,6 +69,8 @@ Regs* Regs::RemoteGet(pid_t pid) { + return RegsMips::Read(buffer.data()); + case sizeof(mips64_user_regs): + return RegsMips64::Read(buffer.data()); ++ case sizeof(riscv64_user_regs): ++ return RegsRiscv64::Read(buffer.data()); + } + return nullptr; + } +@@ -85,6 +89,8 @@ Regs* Regs::CreateFromUcontext(ArchEnum arch, void* ucontext) { + return RegsMips::CreateFromUcontext(ucontext); + case ARCH_MIPS64: + return RegsMips64::CreateFromUcontext(ucontext); ++ case ARCH_RISCV64: ++ return RegsRiscv64::CreateFromUcontext(ucontext); + case ARCH_UNKNOWN: + default: + return nullptr; +@@ -104,6 +110,8 @@ ArchEnum Regs::CurrentArch() { + return ARCH_MIPS; + #elif defined(__mips__) && defined(__LP64__) + return ARCH_MIPS64; ++#elif defined(__riscv) ++ return ARCH_RISCV64; + #else + abort(); + #endif +@@ -123,6 +131,8 @@ Regs* Regs::CreateFromLocal() { + regs = new RegsMips(); + #elif defined(__mips__) && defined(__LP64__) + regs = new RegsMips64(); ++#elif defined(__riscv) ++ regs = new RegsRiscv64(); + #else + abort(); + #endif +diff --git a/system/core/libunwindstack/RegsRiscv64.cpp b/system/core/libunwindstack/RegsRiscv64.cpp +new file mode 100644 +index 0000000..887762a +--- /dev/null ++++ b/system/core/libunwindstack/RegsRiscv64.cpp +@@ -0,0 +1,156 @@ ++/* ++ * Copyright (C) 2022 The Android Open Source Project ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#include <stdint.h> ++#include <string.h> ++ ++#include <functional> ++ ++#include <unwindstack/Elf.h> ++#include <unwindstack/MachineRiscv64.h> ++#include <unwindstack/MapInfo.h> ++#include <unwindstack/Memory.h> ++#include <unwindstack/RegsRiscv64.h> ++#include <unwindstack/UcontextRiscv64.h> ++#include <unwindstack/UserRiscv64.h> ++ ++namespace unwindstack { ++ ++RegsRiscv64::RegsRiscv64() ++ : RegsImpl<uint64_t>(RISCV64_REG_MAX, Location(LOCATION_REGISTER, RISCV64_REG_RA)) {} ++ ++ArchEnum RegsRiscv64::Arch() { ++ return ARCH_RISCV64; ++} ++ ++uint64_t RegsRiscv64::pc() { ++ return regs_[RISCV64_REG_PC]; ++} ++ ++uint64_t RegsRiscv64::sp() { ++ return regs_[RISCV64_REG_SP]; ++} ++ ++void RegsRiscv64::set_pc(uint64_t pc) { ++ regs_[RISCV64_REG_PC] = pc; ++} ++ ++void RegsRiscv64::set_sp(uint64_t sp) { ++ regs_[RISCV64_REG_SP] = sp; ++} ++ ++uint64_t RegsRiscv64::GetPcAdjustment(uint64_t rel_pc, Elf*) { ++ if (rel_pc < 8) { ++ return 0; ++ } ++ // For now, just assume no compact branches ++ return 8; ++} ++ ++bool RegsRiscv64::SetPcFromReturnAddress(Memory*) { ++ uint64_t ra = regs_[RISCV64_REG_RA]; ++ if (regs_[RISCV64_REG_PC] == ra) { ++ return false; ++ } ++ ++ regs_[RISCV64_REG_PC] = ra; ++ return true; ++} ++ ++void RegsRiscv64::IterateRegisters(std::function<void(const char*, uint64_t)> fn) { ++ fn("pc", regs_[RISCV64_REG_PC]); ++ fn("ra", regs_[RISCV64_REG_RA]); ++ fn("sp", regs_[RISCV64_REG_SP]); ++ fn("gp", regs_[RISCV64_REG_GP]); ++ fn("tp", regs_[RISCV64_REG_TP]); ++ fn("t0", regs_[RISCV64_REG_T0]); ++ fn("t1", regs_[RISCV64_REG_T1]); ++ fn("t2", regs_[RISCV64_REG_T2]); ++ fn("t3", regs_[RISCV64_REG_T3]); ++ fn("t4", regs_[RISCV64_REG_T4]); ++ fn("t5", regs_[RISCV64_REG_T5]); ++ fn("t6", regs_[RISCV64_REG_T6]); ++ fn("s0", regs_[RISCV64_REG_S0]); ++ fn("s1", regs_[RISCV64_REG_S1]); ++ fn("s2", regs_[RISCV64_REG_S2]); ++ fn("s3", regs_[RISCV64_REG_S3]); ++ fn("s4", regs_[RISCV64_REG_S4]); ++ fn("s5", regs_[RISCV64_REG_S5]); ++ fn("s6", regs_[RISCV64_REG_S6]); ++ fn("s7", regs_[RISCV64_REG_S7]); ++ fn("s8", regs_[RISCV64_REG_S8]); ++ fn("s9", regs_[RISCV64_REG_S9]); ++ fn("s10", regs_[RISCV64_REG_S10]); ++ fn("s11", regs_[RISCV64_REG_S11]); ++ fn("a0", regs_[RISCV64_REG_A0]); ++ fn("a1", regs_[RISCV64_REG_A1]); ++ fn("a2", regs_[RISCV64_REG_A2]); ++ fn("a3", regs_[RISCV64_REG_A3]); ++ fn("a4", regs_[RISCV64_REG_A4]); ++ fn("a5", regs_[RISCV64_REG_A5]); ++ fn("a6", regs_[RISCV64_REG_A6]); ++ fn("a7", regs_[RISCV64_REG_A7]); ++} ++ ++Regs* RegsRiscv64::Read(void* remote_data) { ++ riscv64_user_regs* user = reinterpret_cast<riscv64_user_regs*>(remote_data); ++ ++ RegsRiscv64* regs = new RegsRiscv64(); ++ memcpy(regs->RawData(), &user->regs[0], RISCV64_REG_MAX * sizeof(uint64_t)); ++ // uint64_t* reg_data = reinterpret_cast<uint64_t*>(regs->RawData()); ++ return regs; ++} ++ ++Regs* RegsRiscv64::CreateFromUcontext(void* ucontext) { ++ riscv64_ucontext_t* riscv64_ucontext = reinterpret_cast<riscv64_ucontext_t*>(ucontext); ++ ++ RegsRiscv64* regs = new RegsRiscv64(); ++ memcpy(regs->RawData(), &riscv64_ucontext->uc_mcontext.__gregs[0], ++ RISCV64_REG_MAX * sizeof(uint64_t)); ++ return regs; ++} ++ ++bool RegsRiscv64::StepIfSignalHandler(uint64_t elf_offset, Elf* elf, Memory* process_memory) { ++ uint64_t data; ++ Memory* elf_memory = elf->memory(); ++ // Read from elf memory since it is usually more expensive to read from ++ // process memory. ++ if (!elf_memory->ReadFully(elf_offset, &data, sizeof(data))) { ++ return false; ++ } ++ // Look for the kernel sigreturn function. ++ // __kernel_rt_sigreturn: ++ // li a7, __NR_rt_sigreturn ++ // scall ++ ++ const uint8_t li_scall[] = {0x93, 0x08, 0xb0, 0x08, 0x73, 0x00, 0x00, 0x00}; ++ if (memcmp(&data, &li_scall, 8) != 0) { ++ return false; ++ } ++ ++ // SP + sizeof(siginfo_t) + uc_mcontext offset + PC offset. ++ if (!process_memory->ReadFully(regs_[RISCV64_REG_SP] + 0x80 + 0xb0 + 0x00, regs_.data(), ++ sizeof(uint64_t) * (RISCV64_REG_MAX))) { ++ return false; ++ } ++ return true; ++} ++ ++Regs* RegsRiscv64::Clone() { ++ return new RegsRiscv64(*this); ++} ++ ++} // namespace unwindstack +diff --git a/system/core/libunwindstack/include/unwindstack/Elf.h b/system/core/libunwindstack/include/unwindstack/Elf.h +index 472ed92..88fa0ff 100644 +--- a/system/core/libunwindstack/include/unwindstack/Elf.h ++++ b/system/core/libunwindstack/include/unwindstack/Elf.h +@@ -32,6 +32,10 @@ + #define EM_AARCH64 183 + #endif + ++#if !defined(EM_RISCV) ++#define EM_RISCV 243 ++#endif ++ + namespace unwindstack { + + // Forward declaration. +@@ -46,6 +50,7 @@ enum ArchEnum : uint8_t { + ARCH_X86_64, + ARCH_MIPS, + ARCH_MIPS64, ++ ARCH_RISCV64, + }; + + class Elf { +diff --git a/system/core/libunwindstack/include/unwindstack/MachineRiscv64.h b/system/core/libunwindstack/include/unwindstack/MachineRiscv64.h +new file mode 100644 +index 0000000..397e680 +--- /dev/null ++++ b/system/core/libunwindstack/include/unwindstack/MachineRiscv64.h +@@ -0,0 +1,59 @@ ++/* ++ * Copyright (C) 2022 The Android Open Source Project ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#pragma once ++ ++#include <stdint.h> ++ ++namespace unwindstack { ++ ++enum Riscv64Reg : uint16_t { ++ RISCV64_REG_PC, ++ RISCV64_REG_RA, ++ RISCV64_REG_SP, ++ RISCV64_REG_GP, ++ RISCV64_REG_TP, ++ RISCV64_REG_T0, ++ RISCV64_REG_T1, ++ RISCV64_REG_T2, ++ RISCV64_REG_S0, ++ RISCV64_REG_S1, ++ RISCV64_REG_A0, ++ RISCV64_REG_A1, ++ RISCV64_REG_A2, ++ RISCV64_REG_A3, ++ RISCV64_REG_A4, ++ RISCV64_REG_A5, ++ RISCV64_REG_A6, ++ RISCV64_REG_A7, ++ RISCV64_REG_S2, ++ RISCV64_REG_S3, ++ RISCV64_REG_S4, ++ RISCV64_REG_S5, ++ RISCV64_REG_S6, ++ RISCV64_REG_S7, ++ RISCV64_REG_S8, ++ RISCV64_REG_S9, ++ RISCV64_REG_S10, ++ RISCV64_REG_S11, ++ RISCV64_REG_T3, ++ RISCV64_REG_T4, ++ RISCV64_REG_T5, ++ RISCV64_REG_T6, ++ RISCV64_REG_MAX, ++}; ++ ++} // namespace unwindstack +diff --git a/system/core/libunwindstack/include/unwindstack/RegsGetLocal.h b/system/core/libunwindstack/include/unwindstack/RegsGetLocal.h +index f0b5e3a..698eba2 100644 +--- a/system/core/libunwindstack/include/unwindstack/RegsGetLocal.h ++++ b/system/core/libunwindstack/include/unwindstack/RegsGetLocal.h +@@ -81,6 +81,49 @@ inline __attribute__((__always_inline__)) void AsmGetRegs(void* reg_data) { + : "x12", "x13", "memory"); + } + ++#elif defined(__riscv) ++ ++inline __attribute__((__always_inline__)) void AsmGetRegs(void* reg_data) { ++ asm volatile( ++ "1:\n" ++ "sd ra, 8(%[base])\n" ++ "sd sp, 16(%[base])\n" ++ "sd gp, 24(%[base])\n" ++ "sd tp, 32(%[base])\n" ++ "sd t0, 40(%[base])\n" ++ "sd t1, 48(%[base])\n" ++ "sd t2, 56(%[base])\n" ++ "sd s0, 64(%[base])\n" ++ "sd s1, 72(%[base])\n" ++ "sd a0, 80(%[base])\n" ++ "sd a1, 88(%[base])\n" ++ "sd a2, 96(%[base])\n" ++ "sd a3, 104(%[base])\n" ++ "sd a4, 112(%[base])\n" ++ "sd a5, 120(%[base])\n" ++ "sd a6, 128(%[base])\n" ++ "sd a7, 136(%[base])\n" ++ "sd s2, 144(%[base])\n" ++ "sd s3, 152(%[base])\n" ++ "sd s4, 160(%[base])\n" ++ "sd s5, 168(%[base])\n" ++ "sd s6, 176(%[base])\n" ++ "sd s7, 184(%[base])\n" ++ "sd s8, 192(%[base])\n" ++ "sd s9, 200(%[base])\n" ++ "sd s10, 208(%[base])\n" ++ "sd s11, 216(%[base])\n" ++ "sd t3, 224(%[base])\n" ++ "sd t4, 232(%[base])\n" ++ "sd t5, 240(%[base])\n" ++ "sd t6, 248(%[base])\n" ++ "la t1, 1b\n" ++ "sd t1, 0(%[base])\n" ++ : [base] "+r"(reg_data) ++ : ++ : "t1", "memory"); ++} ++ + #elif defined(__i386__) || defined(__x86_64__) || defined(__mips__) + + extern "C" void AsmGetRegs(void* regs); +diff --git a/system/core/libunwindstack/include/unwindstack/RegsRiscv64.h b/system/core/libunwindstack/include/unwindstack/RegsRiscv64.h +new file mode 100644 +index 0000000..eb09397 +--- /dev/null ++++ b/system/core/libunwindstack/include/unwindstack/RegsRiscv64.h +@@ -0,0 +1,59 @@ ++/* ++ * Copyright (C) 2022 The Android Open Source Project ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#pragma once ++ ++#include <stdint.h> ++ ++#include <functional> ++ ++#include <unwindstack/Elf.h> ++#include <unwindstack/Regs.h> ++ ++namespace unwindstack { ++ ++// Forward declarations. ++class Memory; ++ ++class RegsRiscv64 : public RegsImpl<uint64_t> { ++ public: ++ RegsRiscv64(); ++ virtual ~RegsRiscv64() = default; ++ ++ ArchEnum Arch() override final; ++ ++ uint64_t GetPcAdjustment(uint64_t rel_pc, Elf* elf) override; ++ ++ bool SetPcFromReturnAddress(Memory* process_memory) override; ++ ++ bool StepIfSignalHandler(uint64_t elf_offset, Elf* elf, Memory* process_memory) override; ++ ++ void IterateRegisters(std::function<void(const char*, uint64_t)>) override final; ++ ++ uint64_t pc() override; ++ uint64_t sp() override; ++ ++ void set_pc(uint64_t pc) override; ++ void set_sp(uint64_t sp) override; ++ ++ Regs* Clone() override final; ++ ++ static Regs* Read(void* data); ++ ++ static Regs* CreateFromUcontext(void* ucontext); ++}; ++ ++} // namespace unwindstack +diff --git a/system/core/libunwindstack/include/unwindstack/UcontextRiscv64.h b/system/core/libunwindstack/include/unwindstack/UcontextRiscv64.h +new file mode 100644 +index 0000000..c6c82b1 +--- /dev/null ++++ b/system/core/libunwindstack/include/unwindstack/UcontextRiscv64.h +@@ -0,0 +1,80 @@ ++/* ++ * Copyright (C) 2014 The Android Open Source Project ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * * Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * * Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in ++ * the documentation and/or other materials provided with the ++ * distribution. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ++ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, ++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, ++ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS ++ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED ++ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, ++ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT ++ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ++ * SUCH DAMAGE. ++ */ ++ ++#pragma once ++ ++#include <sys/cdefs.h> ++ ++typedef uint64_t __riscv_mc_gp_state[32]; // unsigned long ++ ++struct __riscv_mc_f_ext_state { ++ uint32_t __f[32]; ++ uint32_t __fcsr; ++}; ++ ++struct __riscv_mc_d_ext_state { ++ uint64_t __f[32]; ++ uint32_t __fcsr; ++}; ++ ++struct __riscv_mc_q_ext_state { ++ uint64_t __f[64] __attribute__((__aligned__(16))); ++ uint32_t __fcsr; ++ uint32_t __reserved[3]; ++}; ++ ++union __riscv_mc_fp_state { ++ struct __riscv_mc_f_ext_state __f; ++ struct __riscv_mc_d_ext_state __d; ++ struct __riscv_mc_q_ext_state __q; ++}; ++ ++struct __riscv_stack_t { ++ uint64_t ss_sp; ++ int32_t ss_flags; ++ uint64_t ss_size; ++}; ++ ++struct riscv64_sigset_t { ++ uint64_t sig; // unsigned long ++}; ++ ++struct riscv64_mcontext_t { ++ __riscv_mc_gp_state __gregs; ++ union __riscv_mc_fp_state __fpregs; ++}; ++ ++struct riscv64_ucontext_t { ++ uint64_t uc_flags; // unsigned long ++ struct riscv64_ucontext_t* uc_link; ++ __riscv_stack_t uc_stack; ++ riscv64_sigset_t uc_sigmask; ++ /* The kernel adds extra padding here to allow sigset_t to grow. */ ++ int8_t __padding[128 - sizeof(riscv64_sigset_t)]; // char ++ riscv64_mcontext_t uc_mcontext; ++}; +diff --git a/system/core/libunwindstack/include/unwindstack/UserRiscv64.h b/system/core/libunwindstack/include/unwindstack/UserRiscv64.h +new file mode 100644 +index 0000000..1e91228 +--- /dev/null ++++ b/system/core/libunwindstack/include/unwindstack/UserRiscv64.h +@@ -0,0 +1,37 @@ ++/* ++ * Copyright (C) 2016 The Android Open Source Project ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * * Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * * Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in ++ * the documentation and/or other materials provided with the ++ * distribution. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ++ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, ++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, ++ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS ++ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED ++ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, ++ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT ++ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ++ * SUCH DAMAGE. ++ */ ++ ++#pragma once ++ ++namespace unwindstack { ++ ++struct riscv64_user_regs { ++ uint64_t regs[32]; ++}; ++ ++} // namespace unwindstack +diff --git a/system/core/libunwindstack/tools/unwind.cpp b/system/core/libunwindstack/tools/unwind.cpp +index 1812e50..ae20891 100644 +--- a/system/core/libunwindstack/tools/unwind.cpp ++++ b/system/core/libunwindstack/tools/unwind.cpp +@@ -83,6 +83,9 @@ void DoUnwind(pid_t pid) { + case unwindstack::ARCH_MIPS64: + printf("mips64"); + break; ++ case unwindstack::ARCH_RISCV64: ++ printf("riscv64"); ++ break; + default: + printf("unknown\n"); + return; +diff --git a/system/core/libunwindstack/tools/unwind_symbols.cpp b/system/core/libunwindstack/tools/unwind_symbols.cpp +index 8df2284..976db56 100644 +--- a/system/core/libunwindstack/tools/unwind_symbols.cpp ++++ b/system/core/libunwindstack/tools/unwind_symbols.cpp +@@ -77,6 +77,9 @@ int main(int argc, char** argv) { + case EM_AARCH64: + printf("ABI: arm64\n"); + break; ++ case EM_RISCV: ++ printf("ABI: riscv64\n"); ++ break; + case EM_386: + printf("ABI: x86\n"); + break; diff --git a/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/Added-missing-headers.patch b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/Added-missing-headers.patch new file mode 100644 index 0000000000..d827d7d3c2 --- /dev/null +++ b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/Added-missing-headers.patch @@ -0,0 +1,46 @@ +Upstream-Status: Pending + +Description: Added missing headers causing compile errors +Author: Umang Parmar <umangjparmar@gmail.com> +Forwarded: not-needed + +--- a/system/core/adb/sysdeps/posix/network.cpp ++++ b/system/core/adb/sysdeps/posix/network.cpp +@@ -22,6 +22,7 @@ + #include <sys/socket.h> + + #include <string> ++#include <cstring> + + #include <android-base/logging.h> + #include <android-base/stringprintf.h> +--- a/system/core/base/file.cpp ++++ b/system/core/base/file.cpp +@@ -26,6 +26,7 @@ + #include <sys/stat.h> + #include <sys/types.h> + #include <unistd.h> ++#include <cstring> + + #include <memory> + #include <mutex> +--- a/system/core/libbacktrace/BacktraceMap.cpp ++++ b/system/core/libbacktrace/BacktraceMap.cpp +@@ -21,6 +21,7 @@ + #include <stdint.h> + #include <sys/types.h> + #include <unistd.h> ++#include <algorithm> + + #include <log/log.h> + +--- a/system/core/libbacktrace/UnwindStackMap.cpp ++++ b/system/core/libbacktrace/UnwindStackMap.cpp +@@ -20,6 +20,7 @@ + + #include <string> + #include <vector> ++#include <algorithm> + + #include <backtrace/BacktraceMap.h> + #include <unwindstack/Elf.h> diff --git a/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/Nonnull.patch b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/Nonnull.patch new file mode 100644 index 0000000000..54bd52c61a --- /dev/null +++ b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/Nonnull.patch @@ -0,0 +1,22 @@ +Upstream-Status: Pending + +Description: Bring Clang's _Nonnull keyword to GCC +Author: Kai-Chung Yan +Forwarded: not-needed +--- a/system/core/adb/sysdeps.h ++++ b/system/core/adb/sysdeps.h +@@ -40,11 +40,12 @@ + #include "sysdeps/network.h" + #include "sysdeps/stat.h" + ++#define _Nonnull ++#define _Nullable ++ + #ifdef _WIN32 + + // Clang-only nullability specifiers +-#define _Nonnull +-#define _Nullable + + #include <ctype.h> + #include <direct.h> diff --git a/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/Vector-cast.patch b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/Vector-cast.patch new file mode 100644 index 0000000000..b2881e0213 --- /dev/null +++ b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/Vector-cast.patch @@ -0,0 +1,16 @@ +Upstream-Status: Pending + +Description: Fix the weird error by GCC7 that fails to match the correct parent method. +Author: Kai-Chung Yan +Forwarded: not-needed +--- a/system/core/libutils/include/utils/Vector.h ++++ b/system/core/libutils/include/utils/Vector.h +@@ -256,7 +256,7 @@ + + template<class TYPE> inline + const Vector<TYPE>& Vector<TYPE>::operator = (const Vector<TYPE>& rhs) const { +- VectorImpl::operator = (static_cast<const VectorImpl&>(rhs)); ++ VectorImpl::operator = (rhs); + return *this; + } + diff --git a/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/add-missing-headers.patch b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/add-missing-headers.patch new file mode 100644 index 0000000000..681d2c6553 --- /dev/null +++ b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/add-missing-headers.patch @@ -0,0 +1,43 @@ +Upstream-Status: Pending + +Forwarded: not-needed +--- a/system/core/fs_mgr/liblp/reader.cpp ++++ b/system/core/fs_mgr/liblp/reader.cpp +@@ -22,6 +22,7 @@ + #include <unistd.h> + + #include <functional> ++#include <cstring> + + #include <android-base/file.h> + #include <android-base/unique_fd.h> +--- a/system/core/fs_mgr/liblp/writer.cpp ++++ b/system/core/fs_mgr/liblp/writer.cpp +@@ -21,6 +21,7 @@ + #include <unistd.h> + + #include <string> ++#include <cstring> + + #include <android-base/file.h> + #include <android-base/unique_fd.h> +--- a/system/core/liblog/logger_write.cpp ++++ b/system/core/liblog/logger_write.cpp +@@ -27,6 +27,7 @@ + #include <android/set_abort_message.h> + #endif + ++#include <mutex> + #include <shared_mutex> + + #include <android-base/errno_restorer.h> +--- a/system/core/libziparchive/zip_archive_stream_entry.cc ++++ b/system/core/libziparchive/zip_archive_stream_entry.cc +@@ -23,6 +23,7 @@ + #include <sys/types.h> + #include <unistd.h> + ++#include <limits> + #include <memory> + #include <vector> + diff --git a/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/fix-attribute-issue-with-gcc.patch b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/fix-attribute-issue-with-gcc.patch new file mode 100644 index 0000000000..441031f536 --- /dev/null +++ b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/fix-attribute-issue-with-gcc.patch @@ -0,0 +1,19 @@ +Upstream-Status: Pending + +Description: remove clang-ism +Forwarded: not-needed + +--- a/system/core/base/include/android-base/logging.h ++++ b/system/core/base/include/android-base/logging.h +@@ -451,10 +451,7 @@ + // -Wno-user-defined-warnings to CPPFLAGS. + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wgcc-compat" +-#define OSTREAM_STRING_POINTER_USAGE_WARNING \ +- __attribute__((diagnose_if(true, "Unexpected logging of string pointer", "warning"))) +-inline OSTREAM_STRING_POINTER_USAGE_WARNING +-std::ostream& operator<<(std::ostream& stream, const std::string* string_pointer) { ++inline std::ostream& operator<<(std::ostream& stream, const std::string* string_pointer) { + return stream << static_cast<const void*>(string_pointer); + } + #pragma clang diagnostic pop diff --git a/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/fix-build-on-non-x86.patch b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/fix-build-on-non-x86.patch new file mode 100644 index 0000000000..b1caa60c4a --- /dev/null +++ b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/fix-build-on-non-x86.patch @@ -0,0 +1,26 @@ +Upstream-Status: Pending + +Description: non-x86 arches do not have PAGE_SIZE +Forwarded: not-needed +--- a/system/core/base/cmsg.cpp ++++ b/system/core/base/cmsg.cpp +@@ -33,7 +33,8 @@ + const std::vector<int>& fds) { + size_t cmsg_space = CMSG_SPACE(sizeof(int) * fds.size()); + size_t cmsg_len = CMSG_LEN(sizeof(int) * fds.size()); +- if (cmsg_space >= PAGE_SIZE) { ++ size_t pagesize = static_cast<size_t>(sysconf(_SC_PAGE_SIZE)); ++ if (cmsg_space >= pagesize) { + errno = ENOMEM; + return -1; + } +@@ -75,7 +76,8 @@ + fds->clear(); + + size_t cmsg_space = CMSG_SPACE(sizeof(int) * max_fds); +- if (cmsg_space >= PAGE_SIZE) { ++ size_t pagesize = static_cast<size_t>(sysconf(_SC_PAGE_SIZE)); ++ if (cmsg_space >= pagesize) { + errno = ENOMEM; + return -1; + } diff --git a/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/fix-gettid-exception-declaration.patch b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/fix-gettid-exception-declaration.patch new file mode 100644 index 0000000000..5f24d0b4a0 --- /dev/null +++ b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/fix-gettid-exception-declaration.patch @@ -0,0 +1,26 @@ +Upstream-Status: Pending + +Description: get libcutils building +Forwarded: not-needed +--- a/system/core/libcutils/include/cutils/threads.h ++++ b/system/core/libcutils/include/cutils/threads.h +@@ -33,7 +33,7 @@ + // Deprecated: use android::base::GetThreadId instead, which doesn't truncate on Mac/Windows. + // + +-extern pid_t gettid(); ++extern pid_t gettid(void) __THROW; + + // + // Deprecated: use `_Thread_local` in C or `thread_local` in C++. +--- a/system/core/libcutils/threads.cpp ++++ b/system/core/libcutils/threads.cpp +@@ -33,7 +33,7 @@ + + // No definition needed for Android because we'll just pick up bionic's copy. + #ifndef __ANDROID__ +-pid_t gettid() { ++pid_t gettid(void) __THROW { + #if defined(__APPLE__) + uint64_t tid; + pthread_threadid_np(NULL, &tid); diff --git a/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/fix-standard-namespace-errors.patch b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/fix-standard-namespace-errors.patch new file mode 100644 index 0000000000..4380308f13 --- /dev/null +++ b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/fix-standard-namespace-errors.patch @@ -0,0 +1,24 @@ +Upstream-Status: Pending + +Description: Add missing 'std::' scope identifiers. +Forwarded: not-needed +--- a/system/core/libunwindstack/include/unwindstack/DwarfMemory.h ++++ b/system/core/libunwindstack/include/unwindstack/DwarfMemory.h +@@ -29,7 +29,7 @@ + DwarfMemory(Memory* memory) : memory_(memory) {} + virtual ~DwarfMemory() = default; + +- bool ReadBytes(void* dst, size_t num_bytes); ++ bool ReadBytes(void* dst, std::size_t num_bytes); + + template <typename SignedType> + bool ReadSigned(uint64_t* value); +@@ -39,7 +39,7 @@ + bool ReadSLEB128(int64_t* value); + + template <typename AddressType> +- size_t GetEncodedSize(uint8_t encoding); ++ std::size_t GetEncodedSize(uint8_t encoding); + + bool AdjustEncodedValue(uint8_t encoding, uint64_t* value); + diff --git a/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/hard-code-build-number.patch b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/hard-code-build-number.patch new file mode 100644 index 0000000000..4d7323bd2f --- /dev/null +++ b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/hard-code-build-number.patch @@ -0,0 +1,46 @@ +Upstream-Status: Pending + +Description: just hard code rather than deal with circular deps +Forwarded: not-needed +--- a/system/core/adb/adb.cpp ++++ b/system/core/adb/adb.cpp +@@ -44,8 +44,6 @@ + #include <android-base/parsenetaddress.h> + #include <android-base/stringprintf.h> + #include <android-base/strings.h> +-#include <build/version.h> +-#include <platform_tools_version.h> + + #include "adb_auth.h" + #include "adb_io.h" +@@ -69,7 +67,7 @@ + "Version %s-%s\n" + "Installed as %s\n", + ADB_VERSION_MAJOR, ADB_VERSION_MINOR, ADB_SERVER_VERSION, +- PLATFORM_TOOLS_VERSION, android::build::GetBuildNumber().c_str(), ++ PLATFORM_TOOLS_VERSION, "debian", + android::base::GetExecutablePath().c_str()); + } + +--- a/system/core/fastboot/fastboot.cpp ++++ b/system/core/fastboot/fastboot.cpp +@@ -59,10 +59,8 @@ + #include <android-base/stringprintf.h> + #include <android-base/strings.h> + #include <android-base/unique_fd.h> +-#include <build/version.h> + #include <libavb/libavb.h> + #include <liblp/liblp.h> +-#include <platform_tools_version.h> + #include <sparse/sparse.h> + #include <ziparchive/zip_archive.h> + +@@ -1680,7 +1678,7 @@ + setvbuf(stdout, nullptr, _IONBF, 0); + setvbuf(stderr, nullptr, _IONBF, 0); + } else if (name == "version") { +- fprintf(stdout, "fastboot version %s-%s\n", PLATFORM_TOOLS_VERSION, android::build::GetBuildNumber().c_str()); ++ fprintf(stdout, "fastboot version %s-%s\n", PLATFORM_TOOLS_VERSION, "debian"); + fprintf(stdout, "Installed as %s\n", android::base::GetExecutablePath().c_str()); + return 0; + #if !defined(_WIN32) diff --git a/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/libusb-header-path.patch b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/libusb-header-path.patch new file mode 100644 index 0000000000..122bd70e7d --- /dev/null +++ b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/libusb-header-path.patch @@ -0,0 +1,18 @@ +Upstream-Status: Pending + +Description: libusb.h comes from different location +Author: Umang Parmar <umangjparmar@gmail.com> +Forwarded: not-needed +Last-Update: 2018-05-26 + +--- a/system/core/adb/client/usb_libusb.cpp ++++ b/system/core/adb/client/usb_libusb.cpp +@@ -30,7 +30,7 @@ + #include <thread> + #include <unordered_map> + +-#include <libusb/libusb.h> ++#include <libusb-1.0/libusb.h> + + #include <android-base/file.h> + #include <android-base/logging.h> diff --git a/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/move-log-file-to-proper-dir.patch b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/move-log-file-to-proper-dir.patch new file mode 100644 index 0000000000..e8494ab433 --- /dev/null +++ b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/move-log-file-to-proper-dir.patch @@ -0,0 +1,20 @@ +Upstream-Status: Pending + +Description: Update log file directory. +Author: Umang Parmar <umangjparmar@gmail.com> +Last Updated: 2018-05-17 + +--- a/system/core/adb/adb_utils.cpp ++++ b/system/core/adb/adb_utils.cpp +@@ -339,6 +339,11 @@ + + return temp_path_utf8 + log_name; + #else ++ std::string log_dir = android::base::StringPrintf("/run/user/%u/adb.log", getuid()); ++ struct stat st = {0}; ++ if (stat(log_dir.c_str(), &st) == 0) { ++ return log_dir; ++ } + const char* tmp_dir = getenv("TMPDIR"); + if (tmp_dir == nullptr) tmp_dir = "/tmp"; + return android::base::StringPrintf("%s/adb.%u.log", tmp_dir, getuid()); diff --git a/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/simg_dump-python3.patch b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/simg_dump-python3.patch new file mode 100644 index 0000000000..6664dc2aa5 --- /dev/null +++ b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/simg_dump-python3.patch @@ -0,0 +1,64 @@ +Description: Port simg_dump to Python 3. +Author: Antonio Russo <antonio.e.russo@gmail.com> +Forwarded: not-needed +Last-Update: 2019-01-05 +Origin: https://bugs.debian.org/945646 + +--- +Upstream-Status: Pending + +Index: android-platform-tools/system/core/libsparse/simg_dump.py +=================================================================== +--- android-platform-tools.orig/system/core/libsparse/simg_dump.py ++++ android-platform-tools/system/core/libsparse/simg_dump.py +@@ -1,4 +1,4 @@ +-#! /usr/bin/env python ++#! /usr/bin/env python3 + + # Copyright (C) 2012 The Android Open Source Project + # +@@ -14,7 +14,7 @@ + # See the License for the specific language governing permissions and + # limitations under the License. + +-from __future__ import print_function ++ + import csv + import getopt + import hashlib +@@ -47,7 +47,7 @@ def main(): + opts, args = getopt.getopt(sys.argv[1:], + "vsc:", + ["verbose", "showhash", "csvfile"]) +- except getopt.GetoptError, e: ++ except getopt.GetoptError as e: + print(e) + usage(me) + for o, a in opts: +@@ -66,7 +66,7 @@ def main(): + usage(me) + + if csvfilename: +- csvfile = open(csvfilename, "wb") ++ csvfile = open(csvfilename, "w", newline='') + csvwriter = csv.writer(csvfile) + + output = verbose or csvfilename or showhash +@@ -121,7 +121,7 @@ def main(): + "output offset", "output blocks", "type", "hash"]) + + offset = 0 +- for i in xrange(1, total_chunks + 1): ++ for i in range(1, total_chunks + 1): + header_bin = FH.read(12) + header = struct.unpack("<2H2I", header_bin) + chunk_type = header[0] +@@ -160,7 +160,7 @@ def main(): + if showhash: + h = hashlib.sha1() + data = fill_bin * (blk_sz / 4); +- for block in xrange(chunk_sz): ++ for block in range(chunk_sz): + h.update(data) + curhash = h.hexdigest() + elif chunk_type == 0xCAC3: diff --git a/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/stdatomic.patch b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/stdatomic.patch new file mode 100644 index 0000000000..e11f3cc783 --- /dev/null +++ b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/stdatomic.patch @@ -0,0 +1,66 @@ +Upstream-Status: Pending + +Description: Fix incompatibility between <stdatomic.h> and <atomic> + This 2 headers combined will cause errors for both GCC and Clang. This patch + makes sure only one of them is present at any time. +Bug: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60932 +Bug: https://reviews.llvm.org/D45470 +--- a/system/core/libcutils/include/cutils/trace.h ++++ b/system/core/libcutils/include/cutils/trace.h +@@ -18,7 +18,14 @@ + #define _LIBS_CUTILS_TRACE_H + + #include <inttypes.h> ++#ifdef __cplusplus ++#include <atomic> ++using std::atomic_bool; ++using std::atomic_load_explicit; ++using std::memory_order_acquire; ++#else + #include <stdatomic.h> ++#endif + #include <stdbool.h> + #include <stdint.h> + #include <stdio.h> +--- a/system/core/libcutils/include/cutils/atomic.h ++++ b/system/core/libcutils/include/cutils/atomic.h +@@ -19,7 +19,23 @@ + + #include <stdint.h> + #include <sys/types.h> ++#ifdef __cplusplus ++#include <atomic> ++using std::atomic_compare_exchange_strong_explicit; ++using std::atomic_fetch_add_explicit; ++using std::atomic_fetch_or_explicit; ++using std::atomic_fetch_sub_explicit; ++using std::atomic_int_least32_t; ++using std::atomic_load_explicit; ++using std::atomic_store_explicit; ++using std::atomic_thread_fence; ++using std::memory_order::memory_order_acquire; ++using std::memory_order::memory_order_relaxed; ++using std::memory_order::memory_order_release; ++using std::memory_order::memory_order_seq_cst; ++#else + #include <stdatomic.h> ++#endif + + #ifndef ANDROID_ATOMIC_INLINE + #define ANDROID_ATOMIC_INLINE static inline +--- a/system/core/liblog/logger.h ++++ b/system/core/liblog/logger.h +@@ -16,7 +16,13 @@ + + #pragma once + ++#ifdef __cplusplus ++#include <atomic> ++using std::atomic_int; ++using std::atomic_uintptr_t; ++#else + #include <stdatomic.h> ++#endif + #include <sys/cdefs.h> + + #include <log/log.h> diff --git a/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/stub-out-fastdeploy.patch b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/stub-out-fastdeploy.patch new file mode 100644 index 0000000000..d86ef230f7 --- /dev/null +++ b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/stub-out-fastdeploy.patch @@ -0,0 +1,95 @@ +Upstream-Status: Pending + +Description: Defer packaging fastdeploy with adb for 29.x.x tags. +Forwarded: not-needed +--- a/system/core/adb/client/commandline.cpp ++++ b/system/core/adb/client/commandline.cpp +@@ -59,7 +59,6 @@ + #include "bugreport.h" + #include "client/file_sync_client.h" + #include "commandline.h" +-#include "fastdeploy.h" + #include "services.h" + #include "shell_protocol.h" + #include "sysdeps/chrono.h" +--- a/system/core/adb/client/adb_install.cpp ++++ b/system/core/adb/client/adb_install.cpp +@@ -35,7 +35,6 @@ + #include "adb_utils.h" + #include "client/file_sync_client.h" + #include "commandline.h" +-#include "fastdeploy.h" + + static constexpr int kFastDeployMinApi = 24; + +@@ -167,14 +166,6 @@ + } + + if (use_fastdeploy) { +- auto metadata = extract_metadata(file); +- if (metadata.has_value()) { +- // pass all but 1st (command) and last (apk path) parameters through to pm for +- // session creation +- std::vector<const char*> pm_args{argv + 1, argv + argc - 1}; +- auto patchFd = install_patch(pm_args.size(), pm_args.data()); +- return stream_patch(file, std::move(metadata.value()), std::move(patchFd)); +- } + } + + struct stat sb; +@@ -267,16 +258,6 @@ + argv[last_apk] = apk_dest.c_str(); /* destination name, not source location */ + + if (use_fastdeploy) { +- auto metadata = extract_metadata(apk_file[0]); +- if (metadata.has_value()) { +- auto patchFd = apply_patch_on_device(apk_dest.c_str()); +- int status = stream_patch(apk_file[0], std::move(metadata.value()), std::move(patchFd)); +- +- result = pm_command(argc, argv); +- delete_device_file(apk_dest); +- +- return status; +- } + } + + if (do_sync_push(apk_file, apk_dest.c_str(), false)) { +@@ -292,7 +273,6 @@ + InstallMode installMode = INSTALL_DEFAULT; + bool use_fastdeploy = false; + bool is_reinstall = false; +- FastDeploy_AgentUpdateStrategy agent_update_strategy = FastDeploy_AgentUpdateDifferentVersion; + + for (int i = 1; i < argc; i++) { + if (!strcmp(argv[i], "--streaming")) { +@@ -313,13 +293,10 @@ + use_fastdeploy = false; + } else if (!strcmp(argv[i], "--force-agent")) { + processedArgIndicies.push_back(i); +- agent_update_strategy = FastDeploy_AgentUpdateAlways; + } else if (!strcmp(argv[i], "--date-check-agent")) { + processedArgIndicies.push_back(i); +- agent_update_strategy = FastDeploy_AgentUpdateNewerTimeStamp; + } else if (!strcmp(argv[i], "--version-check-agent")) { + processedArgIndicies.push_back(i); +- agent_update_strategy = FastDeploy_AgentUpdateDifferentVersion; + } + } + +@@ -331,13 +308,11 @@ + error_exit("Attempting to use streaming install on unsupported device"); + } + +- if (use_fastdeploy && get_device_api_level() < kFastDeployMinApi) { +- printf("Fast Deploy is only compatible with devices of API version %d or higher, " +- "ignoring.\n", +- kFastDeployMinApi); ++ if (use_fastdeploy) { ++ printf("Fast Deploy is unavailable in this build of adb, " ++ "ignoring.\n"); + use_fastdeploy = false; + } +- fastdeploy_set_agent_update_strategy(agent_update_strategy); + + std::vector<const char*> passthrough_argv; + for (int i = 0; i < argc; i++) { diff --git a/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/throw-exception-on-unknown-os.patch b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/throw-exception-on-unknown-os.patch new file mode 100644 index 0000000000..70e732131f --- /dev/null +++ b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/debian/system/core/throw-exception-on-unknown-os.patch @@ -0,0 +1,18 @@ +Upstream-Status: Pending + +Description: Turn #error into exceptions + So the library can be built on non-Linux platforms too, although can't + guarauntee its functionality regarding that piece of code. +Forwarded: not-needed +--- a/system/core/base/file.cpp ++++ b/system/core/base/file.cpp +@@ -422,7 +422,8 @@ + path[PATH_MAX - 1] = 0; + return path; + #else +-#error unknown OS ++#include <stdexcept> ++ throw std::runtime_error(std::string("Unknown OS!")); + #endif + } + |