static int hang_detect_thread(void *arg) { /* unsigned long flags; */ struct sched_param param = {.sched_priority = RTPM_PRIO_WDT }; LOGE("[Hang_Detect] hang_detect thread starts.\n"); sched_setscheduler(current, SCHED_FIFO, ¶m); while (1) { if ((1 == hd_detect_enabled) && (FindTaskByName("system_server") != -1)) { LOGE("[Hang_Detect] hang_detect thread counts down %d:%d.\n", hang_detect_counter, hd_timeout); if (hang_detect_counter <= 0) { ShowStatus(); } if (hang_detect_counter == 0) { LOGE("[Hang_Detect] we should triger HWT ...\n"); if(aee_mode!=AEE_MODE_CUSTOMER_USER) { aee_kernel_warning_api(__FILE__, __LINE__, DB_OPT_NE_JBT_TRACES|DB_OPT_DISPLAY_HANG_DUMP, "\nCRDISPATCH_KEY:SS Hang\n","we triger HWT "); msleep(30 * 1000); } else //only Customer user load trigger HWT { aee_kernel_exception_api(__FILE__, __LINE__, DB_OPT_NE_JBT_TRACES|DB_OPT_DISPLAY_HANG_DUMP, "\nCRDISPATCH_KEY:SS Hang\n","we triger HWT "); msleep(30 * 1000); local_irq_disable(); while (1); BUG(); } } hang_detect_counter--; } else { /* incase of system_server restart, we give 2 mins more.(4*HD_INTER) */ if (1 == hd_detect_enabled) { hang_detect_counter = hd_timeout + 4; hd_detect_enabled = 0; } LOGE("[Hang_Detect] hang_detect disabled.\n"); } msleep((HD_INTER) * 1000); } return 0; }
static int hang_detect_thread(void *arg) { /* unsigned long flags; */ struct sched_param param = { .sched_priority = RTPM_PRIO_WDT}; LOGE("[Hang_Detect] hang_detect thread starts.\n"); sched_setscheduler(current, SCHED_FIFO, ¶m); while (1) { if ((1==hd_detect_enabled) && (FindTaskByName("system_server")!=-1)) { LOGE("[Hang_Detect] hang_detect thread counts down %d:%d.\n", hang_detect_counter, hd_timeout); if (hang_detect_counter<=0) { ShowStatus () ; } if (hang_detect_counter==0) { LOGE("[Hang_Detect] we should triger HWT ... \n") ; #ifdef CONFIG_MT_ENG_BUILD aee_kernel_warning("\nCRDISPATCH_KEY:SS Hang\n", "we triger HWT"); msleep (10*1000) ; #else aee_kernel_warning("\nCRDISPATCH_KEY:SS Hang\n", "we triger HWT"); msleep (10*1000) ; local_irq_disable () ; while (1); BUG () ; #endif } hang_detect_counter -- ; } else { /* incase of system_server restart, we give 2 mins more.(4*HD_INTER) */ if (1==hd_detect_enabled) { hang_detect_counter = hd_timeout + 4 ; hd_detect_enabled = 0 ; } LOGE("[Hang_Detect] hang_detect disabled.\n") ; } msleep((HD_INTER) * 1000); } return 0 ; }
int aee_kernel_wdt_kick_api(int kinterval) { int ret = 0; #ifdef CONFIG_MTK_AEE_POWERKEY_HANG_DETECT if (pwk_start_monitor && (get_boot_mode() == NORMAL_BOOT) && (FindTaskByName("system_server") != -1)) { /* Only in normal_boot! */ LOGE("Press powerkey!! g_boot_mode=%d,wdt_kick_status=0x%x,tickTimes=0x%x,g_kinterval=%d,RT[%lld]\n", get_boot_mode(), wdt_kick_status, hwt_kick_times, kinterval, sched_clock()); hwt_kick_times++; if ((kinterval * hwt_kick_times > 180)) /* only monitor 3 min */ { pwk_start_monitor = 0; /* check all modules is ok~~~ */ if ((wdt_kick_status & (WDT_SETBY_Display | WDT_SETBY_SF)) != (WDT_SETBY_Display | WDT_SETBY_SF)) { if(aee_mode!=AEE_MODE_CUSTOMER_USER) //disable for display not ready { //ShowStatus(); /* catch task kernel bt */ //LOGE("[WDK] Powerkey Tick fail,kick_status 0x%08x,RT[%lld]\n ", // wdt_kick_status, sched_clock()); //aee_kernel_warning_api(__FILE__, __LINE__, DB_OPT_NE_JBT_TRACES|DB_OPT_DISPLAY_HANG_DUMP, "\nCRDISPATCH_KEY:UI Hang(Powerkey)\n", // "Powerkey Monitor"); //msleep(30 * 1000); } else { //ShowStatus(); /* catch task kernel bt */ //LOGE("[WDK] Powerkey Tick fail,kick_status 0x%08x,RT[%lld]\n ", // wdt_kick_status, sched_clock()); //aee_kernel_exception_api(__FILE__, __LINE__, DB_OPT_NE_JBT_TRACES|DB_OPT_DISPLAY_HANG_DUMP, "\nCRDISPATCH_KEY:UI Hang(Powerkey)\n", // "Powerkey Monitor"); //msleep(30 * 1000); //ret = WDT_PWK_HANG_FORCE_HWT; /* trigger HWT */ } } } if ((wdt_kick_status & (WDT_SETBY_Display | WDT_SETBY_SF)) == (WDT_SETBY_Display | WDT_SETBY_SF)) { pwk_start_monitor = 0; LOGE("[WDK] Powerkey Tick ok,kick_status 0x%08x,RT[%lld]\n ", wdt_kick_status, sched_clock()); } } #endif return ret; }
int aee_kernel_wdt_kick_api(int kinterval) { int ret=0; #ifdef CONFIG_MTK_AEE_POWERKEY_HANG_DETECT if (pwk_start_monitor && (get_boot_mode() == NORMAL_BOOT) && (FindTaskByName("system_server") != -1)) { /* Only in normal_boot! */ LOGE("Press powerkey!! g_boot_mode=%d,wdt_kick_status=0x%x,tickTimes=0x%x,g_kinterval=%d,RT[%lld]\n",get_boot_mode(),wdt_kick_status,hwt_kick_times,kinterval,sched_clock()); hwt_kick_times++; if ((kinterval * hwt_kick_times > 180)) /* only monitor 3 min */ { pwk_start_monitor=0; /* check all modules is ok~~~ */ if ((wdt_kick_status & (WDT_SETBY_Display | WDT_SETBY_SF)) != (WDT_SETBY_Display | WDT_SETBY_SF)) { #ifdef CONFIG_MT_ENG_BUILD ShowStatus(); /* catch task kernel bt */ LOGE("[WDK] Powerkey Tick fail,kick_status 0x%08x,RT[%lld]\n ", wdt_kick_status, sched_clock()); aee_kernel_warning("\nCRDISPATCH_KEY:UI Hang(Powerkey)\n", "Powerkey Monitor"); #else ShowStatus(); /* catch task kernel bt */ LOGE("[WDK] Powerkey Tick fail,kick_status 0x%08x,RT[%lld]\n ", wdt_kick_status, sched_clock()); ret = WDT_PWK_HANG_FORCE_HWT; /* trigger HWT */ #endif } } if ((wdt_kick_status & (WDT_SETBY_Display | WDT_SETBY_SF)) == (WDT_SETBY_Display | WDT_SETBY_SF)) { pwk_start_monitor=0; LOGE("[WDK] Powerkey Tick ok,kick_status 0x%08x,RT[%lld]\n ", wdt_kick_status, sched_clock()); } } #endif return ret; }