/* * include/linux/sec_debug.h * * COPYRIGHT(C) 2006-2018 Samsung Electronics Co., Ltd. All Right Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #ifndef SEC_DEBUG_H #define SEC_DEBUG_H #include #include #include #include #include #include #include #include #define __SEC_DEBUG_SCHED_LOG_INDIRECT #include #undef __SEC_DEBUG_SCHED_LOG_INDIRECT #define IRQ_ENTRY 0x4945 #define IRQ_EXIT 0x4958 #define SOFTIRQ_ENTRY 0x5345 #define SOFTIRQ_EXIT 0x5358 #define SCM_ENTRY 0x5555 #define SCM_EXIT 0x6666 #define SEC_DEBUG_MODEM_SEPARATE_EN 0xEAEAEAEA #define SEC_DEBUG_MODEM_SEPARATE_DIS 0xDEADDEAD #define RESET_EXTRA_INFO_SIZE 1024 enum sec_debug_upload_cause_t { UPLOAD_CAUSE_INIT = 0xCAFEBABE, UPLOAD_CAUSE_KERNEL_PANIC = 0x000000C8, UPLOAD_CAUSE_POWER_LONG_PRESS = 0x00000085, UPLOAD_CAUSE_FORCED_UPLOAD = 0x00000022, UPLOAD_CAUSE_USER_FORCED_UPLOAD = 0x00009890, UPLOAD_CAUSE_CP_ERROR_FATAL = 0x000000CC, UPLOAD_CAUSE_MDM_ERROR_FATAL = 0x000000EE, UPLOAD_CAUSE_USER_FAULT = 0x0000002F, UPLOAD_CAUSE_HSIC_DISCONNECTED = 0x000000DD, UPLOAD_CAUSE_MODEM_RST_ERR = 0x000000FC, UPLOAD_CAUSE_RIVA_RST_ERR = 0x000000FB, UPLOAD_CAUSE_LPASS_RST_ERR = 0x000000FA, UPLOAD_CAUSE_DSPS_RST_ERR = 0x000000FD, UPLOAD_CAUSE_PERIPHERAL_ERR = 0x000000FF, UPLOAD_CAUSE_NON_SECURE_WDOG_BARK = 0x00000DBA, UPLOAD_CAUSE_NON_SECURE_WDOG_BITE = 0x00000DBE, UPLOAD_CAUSE_POWER_THERMAL_RESET = 0x00000075, UPLOAD_CAUSE_SECURE_WDOG_BITE = 0x00005DBE, UPLOAD_CAUSE_BUS_HANG = 0x000000B5, #if defined(CONFIG_SEC_QUEST) UPLOAD_CAUSE_QUEST_CRYPTO = 0x00000ACF, UPLOAD_CAUSE_QUEST_ICACHE = 0x00000ACA, UPLOAD_CAUSE_QUEST_CACHECOHERENCY = 0x00000ACC, UPLOAD_CAUSE_QUEST_SUSPEND = 0x00000A3E, UPLOAD_CAUSE_QUEST_VDDMIN = 0x00000ADD, UPLOAD_CAUSE_QUEST_QMESADDR = 0x00000A29, UPLOAD_CAUSE_QUEST_QMESACACHE = 0x00000AED, UPLOAD_CAUSE_QUEST_PMIC = 0x00000AB8, UPLOAD_CAUSE_QUEST_UFS = 0x00000AF5, UPLOAD_CAUSE_QUEST_SDCARD = 0x00000A7C, UPLOAD_CAUSE_QUEST_SENSOR = 0x00000A9C, UPLOAD_CAUSE_QUEST_GFX = 0x00000A5F, UPLOAD_CAUSE_QUEST_QDAF_FAIL = 0x00000A9D, UPLOAD_CAUSE_QUEST_FAIL = 0x00000A65, UPLOAD_CAUSE_QUEST_DDR_TEST_MAIN = 0x00000A35, UPLOAD_CAUSE_QUEST_DDR_TEST_CAL = 0x00000A37, UPLOAD_CAUSE_QUEST_DDR_TEST_SMD = 0x00000A3F, #endif }; enum sec_restart_reason_t { RESTART_REASON_NORMAL = 0x0, RESTART_REASON_BOOTLOADER = 0x77665500, RESTART_REASON_REBOOT = 0x77665501, RESTART_REASON_RECOVERY = 0x77665502, RESTART_REASON_RTC = 0x77665503, RESTART_REASON_DMVERITY_CORRUPTED = 0x77665508, RESTART_REASON_DMVERITY_ENFORCE = 0x77665509, RESTART_REASON_KEYS_CLEAR = 0x7766550a, RESTART_REASON_SEC_DEBUG_MODE = 0x776655ee, RESTART_REASON_END = 0xffffffff, }; #define UPLOAD_MSG_USER_FAULT "User Fault" #define UPLOAD_MSG_CRASH_KEY "Crash Key" #define UPLOAD_MSG_USER_CRASH_KEY "User Crash Key" #define UPLOAD_MSG_LONG_KEY_PRESS "Long Key Press" #ifdef CONFIG_SEC_DEBUG DECLARE_PER_CPU(struct sec_debug_core_t, sec_debug_core_reg); DECLARE_PER_CPU(struct sec_debug_mmu_reg_t, sec_debug_mmu_reg); DECLARE_PER_CPU(enum sec_debug_upload_cause_t, sec_debug_upload_cause); static inline void sec_debug_save_context(void) { unsigned long flags; unsigned int cpu = smp_processor_id(); local_irq_save(flags); sec_debug_save_mmu_reg(&per_cpu(sec_debug_mmu_reg, cpu)); sec_debug_save_core_reg(&per_cpu(sec_debug_core_reg, cpu)); pr_emerg("(%s) context saved(CPU:%d)\n", __func__, cpu); local_irq_restore(flags); flush_cache_all(); } void simulate_msm_thermal_bite(void); extern void sec_debug_set_upload_cause(enum sec_debug_upload_cause_t type); extern enum sec_debug_upload_cause_t sec_debug_get_upload_cause(void); extern void sec_debug_prepare_for_wdog_bark_reset(void); extern int sec_debug_init(void); extern int sec_debug_dump_stack(void); extern void sec_debug_hw_reset(void); extern void sec_getlog_supply_fbinfo(void *p_fb, u32 res_x, u32 res_y, u32 bpp, u32 frames); extern void sec_getlog_supply_meminfo(u32 size0, u32 addr0, u32 size1, u32 addr1); extern void sec_getlog_supply_loggerinfo(void *p_main, void *p_radio, void *p_events, void *p_system); extern void sec_getlog_supply_kloginfo(void *klog_buf); extern void sec_gaf_supply_rqinfo(unsigned short curr_offset, unsigned short rq_offset); extern bool sec_debug_is_enabled(void); extern unsigned int sec_debug_level(void); extern int sec_debug_is_modem_separate_debug_ssr(void); extern int silent_log_panic_handler(void); extern void sec_debug_print_model(struct seq_file *m, const char *cpu_name); extern void sec_debug_update_dload_mode(const int restart_mode, const int in_panic); extern void sec_debug_update_restart_reason(const char *cmd, const int in_panic); extern void sec_debug_set_thermal_upload(void); #ifdef CONFIG_POWER_RESET_QCOM /* from 'msm-poweroff.c' */ extern void set_dload_mode(int on); #endif #else /* CONFIG_SEC_DEBUG */ static inline void sec_debug_save_context(void) {} static inline void sec_debug_set_upload_cause( enum sec_debug_upload_cause_t type) {} static enum sec_debug_upload_cause_t sec_debug_get_upload_cause(void) { return UPLOAD_CAUSE_INIT; } static inline void sec_debug_prepare_for_wdog_bark_reset(void) {} static inline int sec_debug_init(void) { return 0; } static inline int sec_debug_dump_stack(void) { return 0; } static inline void sec_getlog_supply_fbinfo(void *p_fb, u32 res_x, u32 res_y, u32 bpp, u32 frames) {} static inline void sec_getlog_supply_meminfo(u32 size0, u32 addr0, u32 size1, u32 addr1) {} #define sec_getlog_supply_loggerinfo(p_main, p_radio, p_events, p_system) static inline void sec_getlog_supply_kloginfo(void *klog_buf) {} static inline void sec_gaf_supply_rqinfo(unsigned short curr_offset, unsigned short rq_offset) {} static inline bool sec_debug_is_enabled(void) { return false; } static inline unsigned int sec_debug_level(void) {return 0; } static inline int sec_debug_is_modem_separate_debug_ssr(void) { return SEC_DEBUG_MODEM_SEPARATE_DIS; } static inline void sec_debug_hw_reset(void) {} static inline void emerg_pet_watchdog(void) {} static inline void sec_debug_set_rr(u32 reason) {} static inline u32 sec_debug_get_rr(void) { return 0; } static inline void sec_debug_print_model( struct seq_file *m, const char *cpu_name) {} static inline void sec_debug_update_dload_mode(const int restart_mode, const int in_panic) {} static inline void sec_debug_update_restart_reason(const char *cmd, const int in_panic) {} static inline void sec_debug_set_thermal_upload(void) {} #endif /* CONFIG_SEC_DEBUG */ #ifdef CONFIG_SEC_PERIPHERAL_SECURE_CHK extern void sec_peripheral_secure_check_fail(void); #else static inline void sec_peripheral_secure_check_fail(void) {} #endif #ifdef CONFIG_SEC_LOG_LAST_KMSG extern void sec_set_reset_extra_info(char *last_kmsg_buffer, unsigned last_kmsg_size); #else static inline void sec_set_reset_extra_info(char *last_kmsg_buffer, unsigned last_kmsg_size) {} #endif /* CONFIG_SEC_LOG_LAST_KMSG */ #ifdef CONFIG_SEC_FILE_LEAK_DEBUG extern void sec_debug_EMFILE_error_proc(void); #else static inline void sec_debug_EMFILE_error_proc(void) {} #endif /* CONFIG_SEC_FILE_LEAK_DEBUG */ #ifdef CONFIG_SEC_SSR_DEBUG_LEVEL_CHK extern int sec_debug_is_enabled_for_ssr(void); #else static inline int sec_debug_is_enabled_for_ssr(void) { return 0; } #endif /* CONFIG_SEC_SSR_DEBUG_LEVEL_CHK */ /* for sec debug level */ #define KERNEL_SEC_DEBUG_LEVEL_LOW (0x574F4C44) #define KERNEL_SEC_DEBUG_LEVEL_MID (0x44494D44) #define KERNEL_SEC_DEBUG_LEVEL_HIGH (0x47494844) #define ANDROID_DEBUG_LEVEL_LOW 0x4f4c #define ANDROID_DEBUG_LEVEL_MID 0x494d #define ANDROID_DEBUG_LEVEL_HIGH 0x4948 #define ANDROID_CP_DEBUG_ON 0x5500 #define ANDROID_CP_DEBUG_OFF 0x55ff extern int ssr_panic_handler_for_sec_dbg(void); extern void emerg_pet_watchdog(void); #define LOCAL_CONFIG_PRINT_EXTRA_INFO #ifdef CONFIG_SEC_DEBUG_DOUBLE_FREE extern void *kfree_hook(void *p, void *caller); #endif typedef enum { USER_UPLOAD_CAUSE_MIN = 1, USER_UPLOAD_CAUSE_SMPL = USER_UPLOAD_CAUSE_MIN, /* RESET_REASON_SMPL */ USER_UPLOAD_CAUSE_WTSR, /* RESET_REASON_WTSR */ USER_UPLOAD_CAUSE_WATCHDOG, /* RESET_REASON_WATCHDOG */ USER_UPLOAD_CAUSE_PANIC, /* RESET_REASON_PANIC */ USER_UPLOAD_CAUSE_MANUAL_RESET, /* RESET_REASON_MANUAL_RESET */ USER_UPLOAD_CAUSE_POWER_RESET, /* RESET_REASON_POWER_RESET */ USER_UPLOAD_CAUSE_REBOOT, /* RESET_REASON_REBOOT */ USER_UPLOAD_CAUSE_BOOTLOADER_REBOOT,/* RESET_REASON_BOOTLOADER_REBOOT */ USER_UPLOAD_CAUSE_POWER_ON, /* RESET_REASON_POWER_ON */ USER_UPLOAD_CAUSE_THERMAL, /* RESET_REASON_THERMAL_RESET */ USER_UPLOAD_CAUSE_UNKNOWN, /* RESET_REASON_UNKNOWN */ USER_UPLOAD_CAUSE_MAX = USER_UPLOAD_CAUSE_UNKNOWN, } user_upload_cause_t; #ifdef CONFIG_TOUCHSCREEN_DUMP_MODE struct tsp_dump_callbacks { void (*inform_dump)(void); }; #endif #ifdef CONFIG_SEC_DEBUG_PWDT #define SEC_DEBUG_MAX_PWDT_RESTART_CNT 20 //200 seconds #define SEC_DEBUG_MAX_PWDT_SYNC_CNT 40 //400 seconds #define SEC_DEBUG_MAX_PWDT_INIT_CNT 200 //2000 seconds extern void sec_debug_check_pwdt(void); extern unsigned int is_verifiedboot_state(void); #endif extern unsigned int is_boot_recovery(void); extern unsigned int is_boot_lpm(void); extern int set_reduced_sdi_mode(void); #endif /* SEC_DEBUG_H */