stack_info
static inline struct stack_info stackinfo_get_efi(void)
return (struct stack_info) {
static inline struct stack_info stackinfo_get_irq(void)
return (struct stack_info) {
struct stack_info info = stackinfo_get_irq();
static inline struct stack_info stackinfo_get_task(const struct task_struct *tsk)
return (struct stack_info) {
struct stack_info info = stackinfo_get_task(tsk);
static inline struct stack_info stackinfo_get_overflow(void)
return (struct stack_info) {
static inline struct stack_info stackinfo_get_sdei_normal(void)
return (struct stack_info) {
static inline struct stack_info stackinfo_get_sdei_critical(void)
return (struct stack_info) {
struct stack_info *info,
struct stack_info tmp;
struct stack_info *info;
struct stack_info stack;
struct stack_info *stacks;
static inline struct stack_info stackinfo_get_unknown(void)
return (struct stack_info) {
static inline bool stackinfo_on_stack(const struct stack_info *info,
static struct stack_info *unwind_find_stack(struct unwind_state *state,
struct stack_info *info = &state->stack;
struct stack_info *info;
struct stack_info *info;
struct stack_info *info;
struct stack_info stacks[] = {
struct stack_info stacks[] = {
static struct stack_info stackinfo_get_overflow(void)
return (struct stack_info) {
static struct stack_info stackinfo_get_hyp(void)
return (struct stack_info) {
struct stack_info stacks[] = {
static struct stack_info stackinfo_get_overflow(void)
return (struct stack_info) {
static struct stack_info stackinfo_get_overflow_kern_va(void)
return (struct stack_info) {
static struct stack_info stackinfo_get_hyp(void)
return (struct stack_info) {
static struct stack_info stackinfo_get_hyp_kern_va(void)
return (struct stack_info) {
struct stack_info stack_hyp, stack_kern;
bool in_irq_stack(unsigned long stack, struct stack_info *info);
bool in_task_stack(unsigned long stack, struct task_struct *task, struct stack_info *info);
int get_stack_info(unsigned long stack, struct task_struct *task, struct stack_info *info);
struct stack_info stack_info;
return state->stack_info.type == STACK_TYPE_UNKNOWN;
get_stack_info(state->sp, state->task, &state->stack_info);
bool in_irq_stack(unsigned long stack, struct stack_info *info)
struct stack_info *info)
struct stack_info *info)
struct stack_info *info = &state->stack_info;
static inline bool on_stack(struct stack_info *info, unsigned long addr, size_t len)
struct stack_info *info = &state->stack_info;
struct stack_info *info = &state->stack_info;
state->stack_info.type = STACK_TYPE_UNKNOWN;
struct stack_info *info = &state->stack_info;
struct stack_info *info = &state->stack_info;
state->stack_info.type = STACK_TYPE_UNKNOWN;
struct stack_info boot_stack = { STACK_TYPE_TASK, (unsigned long)_stack_start,
struct stack_info *info, unsigned long *visit_mask);
static inline bool on_stack(struct stack_info *info,
struct stack_info stack_info;
return state->stack_info.type == STACK_TYPE_UNKNOWN;
static inline bool in_stack(unsigned long sp, struct stack_info *info,
struct stack_info *info)
static bool in_irq_stack(unsigned long sp, struct stack_info *info)
static bool in_nodat_stack(unsigned long sp, struct stack_info *info)
static bool in_mcck_stack(unsigned long sp, struct stack_info *info)
static bool in_restart_stack(unsigned long sp, struct stack_info *info)
struct stack_info *info, unsigned long *visit_mask)
if (state.stack_info.type != STACK_TYPE_TASK) {
if (state.stack_info.type != STACK_TYPE_TASK)
state->stack_info.type = STACK_TYPE_UNKNOWN;
struct stack_info *info = &state->stack_info;
if (on_stack(&state->stack_info, first_frame, sizeof(struct stack_frame))) {
(sp > state->stack_info.end - sizeof(struct stack_frame));
struct stack_info *info = &state->stack_info;
return state->stack_info.type == STACK_TYPE_IRQ &&
state->stack_info.end - sizeof(struct pt_regs) == (unsigned long)regs &&
struct stack_info *info = &state->stack_info;
stack_type_name(state.stack_info.type),
struct stack_info *info);
bool in_entry_stack(unsigned long *stack, struct stack_info *info);
struct stack_info *info, unsigned long *visit_mask);
struct stack_info *info);
bool get_stack_guard_info(unsigned long *stack, struct stack_info *info)
static inline bool on_stack(struct stack_info *info, void *addr, size_t len)
struct stack_info *info);
struct stack_info stack_info;
return state->stack_info.type == STACK_TYPE_UNKNOWN;
static void show_regs_if_on_stack(struct stack_info *info, struct pt_regs *regs,
struct stack_info stack_info = {0};
for (; stack; stack = stack_info.next_sp) {
if (get_stack_info(stack, task, &stack_info, &visit_mask)) {
if (get_stack_info(stack, task, &stack_info, &visit_mask))
stack_name = stack_type_name(stack_info.type);
show_regs_if_on_stack(&stack_info, regs, partial, log_lvl);
for (; stack < stack_info.end; stack++) {
show_regs_if_on_stack(&stack_info, regs, partial, log_lvl);
struct stack_info *info)
bool noinstr in_entry_stack(unsigned long *stack, struct stack_info *info)
struct stack_info *info, unsigned long *visit_mask)
static bool in_hardirq_stack(unsigned long *stack, struct stack_info *info)
static bool in_softirq_stack(unsigned long *stack, struct stack_info *info)
static bool in_doublefault_stack(unsigned long *stack, struct stack_info *info)
static __always_inline bool in_irq_stack(unsigned long *stack, struct stack_info *info)
struct stack_info *info)
struct stack_info *info, unsigned long *visit_mask)
static __always_inline bool in_exception_stack(unsigned long *stack, struct stack_info *info)
struct stack_info info;
struct stack_info *info)
struct stack_info info;
struct stack_info *info = &state->stack_info;
if (state->orig_sp && state->stack_info.type == prev_type &&
struct stack_info stack_info = {0};
state->stack_info.type = STACK_TYPE_UNKNOWN;
state->stack_info.type = STACK_TYPE_UNKNOWN;
get_stack_info(bp, state->task, &state->stack_info,
(!on_stack(&state->stack_info, first_frame, sizeof(long)) ||
state->stack_info.type, state->stack_info.next_sp,
sp = PTR_ALIGN(stack_info.next_sp, sizeof(long))) {
if (get_stack_info(sp, state->task, &stack_info, &visit_mask))
for (; sp < stack_info.end; sp++) {
struct stack_info *info = &state->stack_info;
get_stack_info(first_frame, state->task, &state->stack_info,
(!on_stack(&state->stack_info, first_frame, sizeof(long)) ||
struct stack_info *info = &state->stack_info;
enum stack_type prev_type = state->stack_info.type;
struct stack_info stack_info = {0};
state->stack_info.type, state->stack_info.next_sp,
sp = PTR_ALIGN(stack_info.next_sp, sizeof(long))) {
if (get_stack_info(sp, state->task, &stack_info, &visit_mask))
if (state->stack_info.type == prev_type &&
for (; sp < stack_info.end; sp++) {
on_stack(&state->stack_info, (void *)state->sp, sizeof(long)) &&
state->stack_info.type = STACK_TYPE_UNKNOWN;
&state->stack_info, &state->stack_mask)) {
if (get_stack_info(next_page, state->task, &state->stack_info,
(!on_stack(&state->stack_info, first_frame, sizeof(long)) ||
state->stack_info.type = STACK_TYPE_UNKNOWN;
struct stack_info info;
struct btc_stack_info *stack_info = &btcoexist->stack_info;
((stack_info->profile_notified) ? "Yes" : "No"),
stack_info->hci_version);
"SCO/HID/PAN/A2DP", stack_info->sco_exist,
stack_info->hid_exist, stack_info->pan_exist,
stack_info->a2dp_exist);
struct btc_stack_info *stack_info = &btcoexist->stack_info;
((stack_info->profile_notified) ? "Yes" : "No"),
stack_info->hci_version);
struct btc_stack_info *stack_info = &btcoexist->stack_info;
if (stack_info->num_of_hid >= 2) {
struct btc_stack_info *stack_info = &btcoexist->stack_info;
((stack_info->profile_notified) ? "Yes" : "No"),
stack_info->hci_version);
struct btc_stack_info *stack_info = &btcoexist->stack_info;
((stack_info->profile_notified) ? "Yes" : "No"),
stack_info->hci_version);
struct btc_stack_info *stack_info = &btcoexist->stack_info;
((stack_info->profile_notified) ? "Yes" : "No"),
stack_info->hci_version);
struct btc_stack_info *stack_info = &btcoexist->stack_info;
stack_info->profile_notified ? "Yes" : "No",
stack_info->hci_version);
struct btc_stack_info *stack_info = &btcoexist->stack_info;
((stack_info->profile_notified) ? "Yes" : "No"),
stack_info->hci_version);
if (stack_info->profile_notified) {
stack_info->sco_exist, stack_info->hid_exist,
stack_info->pan_exist, stack_info->a2dp_exist);
btcoexist->stack_info.profile_notified = false;
btcoexist->stack_info.min_bt_rssi = bt_rssi;
struct btc_stack_info stack_info;