This is preparation for the next patch, which adds host-side symbolization capabilities to pbtombstone. Bug: 328531087 Change-Id: Id5813ae6b121af784643b1ed76084e49fdca118b
101 lines
2.4 KiB
C++
101 lines
2.4 KiB
C++
/*
|
|
* Copyright 2024, 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 "libdebuggerd/utility_host.h"
|
|
|
|
#include <sys/prctl.h>
|
|
|
|
#include <string>
|
|
|
|
#include <android-base/stringprintf.h>
|
|
|
|
using android::base::StringPrintf;
|
|
|
|
#ifndef PR_MTE_TAG_SHIFT
|
|
#define PR_MTE_TAG_SHIFT 3
|
|
#endif
|
|
|
|
#ifndef PR_MTE_TAG_MASK
|
|
#define PR_MTE_TAG_MASK (0xffffUL << PR_MTE_TAG_SHIFT)
|
|
#endif
|
|
|
|
#ifndef PR_MTE_TCF_ASYNC
|
|
#define PR_MTE_TCF_ASYNC (1UL << 2)
|
|
#endif
|
|
|
|
#ifndef PR_MTE_TCF_SYNC
|
|
#define PR_MTE_TCF_SYNC (1UL << 1)
|
|
#endif
|
|
|
|
#ifndef PR_PAC_APIAKEY
|
|
#define PR_PAC_APIAKEY (1UL << 0)
|
|
#endif
|
|
|
|
#ifndef PR_PAC_APIBKEY
|
|
#define PR_PAC_APIBKEY (1UL << 1)
|
|
#endif
|
|
|
|
#ifndef PR_PAC_APDAKEY
|
|
#define PR_PAC_APDAKEY (1UL << 2)
|
|
#endif
|
|
|
|
#ifndef PR_PAC_APDBKEY
|
|
#define PR_PAC_APDBKEY (1UL << 3)
|
|
#endif
|
|
|
|
#ifndef PR_PAC_APGAKEY
|
|
#define PR_PAC_APGAKEY (1UL << 4)
|
|
#endif
|
|
|
|
#ifndef PR_TAGGED_ADDR_ENABLE
|
|
#define PR_TAGGED_ADDR_ENABLE (1UL << 0)
|
|
#endif
|
|
|
|
#define DESCRIBE_FLAG(flag) \
|
|
if (value & flag) { \
|
|
desc += ", "; \
|
|
desc += #flag; \
|
|
value &= ~flag; \
|
|
}
|
|
|
|
static std::string describe_end(long value, std::string& desc) {
|
|
if (value) {
|
|
desc += StringPrintf(", unknown 0x%lx", value);
|
|
}
|
|
return desc.empty() ? "" : " (" + desc.substr(2) + ")";
|
|
}
|
|
|
|
std::string describe_tagged_addr_ctrl(long value) {
|
|
std::string desc;
|
|
DESCRIBE_FLAG(PR_TAGGED_ADDR_ENABLE);
|
|
DESCRIBE_FLAG(PR_MTE_TCF_SYNC);
|
|
DESCRIBE_FLAG(PR_MTE_TCF_ASYNC);
|
|
if (value & PR_MTE_TAG_MASK) {
|
|
desc += StringPrintf(", mask 0x%04lx", (value & PR_MTE_TAG_MASK) >> PR_MTE_TAG_SHIFT);
|
|
value &= ~PR_MTE_TAG_MASK;
|
|
}
|
|
return describe_end(value, desc);
|
|
}
|
|
|
|
std::string describe_pac_enabled_keys(long value) {
|
|
std::string desc;
|
|
DESCRIBE_FLAG(PR_PAC_APIAKEY);
|
|
DESCRIBE_FLAG(PR_PAC_APIBKEY);
|
|
DESCRIBE_FLAG(PR_PAC_APDAKEY);
|
|
DESCRIBE_FLAG(PR_PAC_APDBKEY);
|
|
DESCRIBE_FLAG(PR_PAC_APGAKEY);
|
|
return describe_end(value, desc);
|
|
}
|