ANDROID: android: Create debug_symbols driver

Introduce new API to expose symbols useful for debugging the GKI kernel.
Symbols exported from this driver would be difficult to maintain via the
traditional EXPORT_SYMBOL_GPL.

Bug: 199236943
Signed-off-by: Elliot Berman <eberman@codeaurora.org>
Signed-off-by: Prasad Sodagudi <psodagud@codeaurora.org>
Signed-off-by: Yogesh Lal <ylal@codeaurora.org>

Signed-off-by: Xuewen Yan <xuewen.yan@unisoc.com>
[ delete some unused symbols and add _text/_end ]

The commit bb732365f7 had build error,
so it was reverted. After fixed build error, restore the commit.

Bug: 287890135
Change-Id: I95bc8f4203791d6857e126d87519b892c81057b0
Signed-off-by: Xuewen Yan <xuewen.yan@unisoc.com>
This commit is contained in:
Xuewen Yan 2023-06-30 15:42:25 +08:00 committed by Matthias Männich
parent f54778f021
commit dfabd2e38b
4 changed files with 155 additions and 0 deletions

View file

@ -47,6 +47,17 @@ config ANDROID_BINDER_IPC_SELFTEST
exhaustively with combinations of various buffer sizes and
alignments.
config ANDROID_DEBUG_SYMBOLS
bool "Android Debug Symbols"
help
Enables export of debug symbols that are useful for offline debugging
of a kernel. These symbols would be used in vendor modules to find
addresses of the core kernel symbols for vendor extensions.
This driver is statically compiled into kernel and maintains all the
required symbol addresses for vendor modules and provides necessary
interface vendor modules.
config ANDROID_VENDOR_HOOKS
bool "Android Vendor Hooks"
depends on TRACEPOINTS

View file

@ -4,5 +4,6 @@ ccflags-y += -I$(src) # needed for trace events
obj-$(CONFIG_ANDROID_BINDERFS) += binderfs.o
obj-$(CONFIG_ANDROID_BINDER_IPC) += binder.o binder_alloc.o
obj-$(CONFIG_ANDROID_BINDER_IPC_SELFTEST) += binder_alloc_selftest.o
obj-$(CONFIG_ANDROID_DEBUG_SYMBOLS) += android_debug_symbols.o
obj-$(CONFIG_ANDROID_VENDOR_HOOKS) += vendor_hooks.o
obj-$(CONFIG_ANDROID_DEBUG_KINFO) += debug_kinfo.o

View file

@ -0,0 +1,96 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2021, The Linux Foundation. All rights reserved.
* Copyright (c) 2023, Unisoc (Shanghai) Technologies Co., Ltd
*/
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/android_debug_symbols.h>
#include <asm/sections.h>
#include <asm/stacktrace.h>
#include <linux/cma.h>
#include <linux/mm.h>
#include "../../mm/slab.h"
#include <linux/security.h>
struct ads_entry {
char *name;
void *addr;
};
#define _ADS_ENTRY(index, symbol) \
[index] = { .name = #symbol, .addr = (void *)symbol }
#define ADS_ENTRY(index, symbol) _ADS_ENTRY(index, symbol)
#define _ADS_PER_CPU_ENTRY(index, symbol) \
[index] = { .name = #symbol, .addr = (void *)&symbol }
#define ADS_PER_CPU_ENTRY(index, symbol) _ADS_PER_CPU_ENTRY(index, symbol)
/*
* This module maintains static array of symbol and address information.
* Add all required core kernel symbols and their addresses into ads_entries[] array,
* so that vendor modules can query and to find address of non-exported symbol.
*/
static const struct ads_entry ads_entries[ADS_END] = {
ADS_ENTRY(ADS_SDATA, _sdata),
ADS_ENTRY(ADS_BSS_END, __bss_stop),
ADS_ENTRY(ADS_PER_CPU_START, __per_cpu_start),
ADS_ENTRY(ADS_PER_CPU_END, __per_cpu_end),
ADS_ENTRY(ADS_TEXT, _text),
ADS_ENTRY(ADS_SEND, _end),
ADS_ENTRY(ADS_LINUX_BANNER, linux_banner),
ADS_ENTRY(ADS_TOTAL_CMA, &totalcma_pages),
ADS_ENTRY(ADS_SLAB_CACHES, &slab_caches),
ADS_ENTRY(ADS_SLAB_MUTEX, &slab_mutex),
};
/*
* ads_per_cpu_entries array contains all the per_cpu variable address information.
*/
static const struct ads_entry ads_per_cpu_entries[ADS_DEBUG_PER_CPU_END] = {
#ifdef CONFIG_ARM64
ADS_PER_CPU_ENTRY(ADS_IRQ_STACK_PTR, irq_stack_ptr),
#endif
#ifdef CONFIG_X86
ADS_PER_CPU_ENTRY(ADS_IRQ_STACK_PTR, hardirq_stack_ptr),
#endif
};
/*
* android_debug_symbol - Provide address inforamtion of debug symbol.
* @symbol: Index of debug symbol array.
*
* Return address of core kernel symbol on success and a negative errno will be
* returned in error cases.
*
*/
void *android_debug_symbol(enum android_debug_symbol symbol)
{
if (symbol >= ADS_END)
return ERR_PTR(-EINVAL);
return ads_entries[symbol].addr;
}
EXPORT_SYMBOL_NS_GPL(android_debug_symbol, MINIDUMP);
/*
* android_debug_per_cpu_symbol - Provide address inforamtion of per cpu debug symbol.
* @symbol: Index of per cpu debug symbol array.
*
* Return address of core kernel symbol on success and a negative errno will be
* returned in error cases.
*
*/
void *android_debug_per_cpu_symbol(enum android_debug_per_cpu_symbol symbol)
{
if (symbol >= ADS_DEBUG_PER_CPU_END)
return ERR_PTR(-EINVAL);
return ads_per_cpu_entries[symbol].addr;
}
EXPORT_SYMBOL_NS_GPL(android_debug_per_cpu_symbol, MINIDUMP);

View file

@ -0,0 +1,47 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2021, The Linux Foundation. All rights reserved.
* Copyright (c) 2023, Unisoc (Shanghai) Technologies Co., Ltd
*/
#ifndef _ANDROID_DEBUG_SYMBOLS_H
#define _ANDROID_DEBUG_SYMBOLS_H
enum android_debug_symbol {
ADS_SDATA = 0,
ADS_BSS_END,
ADS_PER_CPU_START,
ADS_PER_CPU_END,
ADS_TEXT,
ADS_SEND,
ADS_LINUX_BANNER,
ADS_TOTAL_CMA,
ADS_SLAB_CACHES,
ADS_SLAB_MUTEX,
ADS_END
};
enum android_debug_per_cpu_symbol {
ADS_IRQ_STACK_PTR = 0,
ADS_DEBUG_PER_CPU_END
};
#ifdef CONFIG_ANDROID_DEBUG_SYMBOLS
void *android_debug_symbol(enum android_debug_symbol symbol);
void *android_debug_per_cpu_symbol(enum android_debug_per_cpu_symbol symbol);
#else /* !CONFIG_ANDROID_DEBUG_SYMBOLS */
static inline void *android_debug_symbol(enum android_debug_symbol symbol)
{
return NULL;
}
static inline void *android_debug_per_cpu_symbol(enum android_debug_per_cpu_symbol symbol)
{
return NULL;
}
#endif /* CONFIG_ANDROID_DEBUG_SYMBOLS */
#endif /* _ANDROID_DEBUG_SYMBOLS_H */