Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

powerpc: Make ppc_md.{halt, restart} __noreturn

powernv marks it's halt and restart calls as __noreturn. However,
ppc_md does not have this annotation. Add the annotation to ppc_md,
and then to every halt/restart function that is missing it.

Additionally, I have verified that all of these functions do not
return. Occasionally I have added a spin loop to be sure.

Signed-off-by: Daniel Axtens <dja@axtens.net>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>

authored by

Daniel Axtens and committed by
Michael Ellerman
95ec77c0 62c2c5cf

+60 -55
+2 -2
arch/powerpc/include/asm/machdep.h
··· 111 111 /* To setup PHBs when using automatic OF platform driver for PCI */ 112 112 int (*pci_setup_phb)(struct pci_controller *host); 113 113 114 - void (*restart)(char *cmd); 115 - void (*halt)(void); 114 + void __noreturn (*restart)(char *cmd); 115 + void __noreturn (*halt)(void); 116 116 void (*panic)(char *str); 117 117 void (*cpu_die)(void); 118 118
+1 -1
arch/powerpc/include/asm/mpc52xx.h
··· 275 275 extern void mpc52xx_map_common_devices(void); 276 276 extern int mpc52xx_set_psc_clkdiv(int psc_id, int clkdiv); 277 277 extern unsigned int mpc52xx_get_xtal_freq(struct device_node *node); 278 - extern void mpc52xx_restart(char *cmd); 278 + extern void __noreturn mpc52xx_restart(char *cmd); 279 279 280 280 /* mpc52xx_gpt.c */ 281 281 struct mpc52xx_gpt_priv;
+1 -1
arch/powerpc/include/asm/ppc4xx.h
··· 13 13 #ifndef __ASM_POWERPC_PPC4xx_H__ 14 14 #define __ASM_POWERPC_PPC4xx_H__ 15 15 16 - extern void ppc4xx_reset_system(char *cmd); 16 + extern void __noreturn ppc4xx_reset_system(char *cmd); 17 17 18 18 #endif /* __ASM_POWERPC_PPC4xx_H__ */
+2 -2
arch/powerpc/include/asm/rtas.h
··· 339 339 extern int rtas_call(int token, int, int, int *, ...); 340 340 void rtas_call_unlocked(struct rtas_args *args, int token, int nargs, 341 341 int nret, ...); 342 - extern void rtas_restart(char *cmd); 342 + extern void __noreturn rtas_restart(char *cmd); 343 343 extern void rtas_power_off(void); 344 - extern void rtas_halt(void); 344 + extern void __noreturn rtas_halt(void); 345 345 extern void rtas_os_term(char *str); 346 346 extern int rtas_get_sensor(int sensor, int index, int *state); 347 347 extern int rtas_get_sensor_fast(int sensor, int index, int *state);
+2 -2
arch/powerpc/kernel/rtas.c
··· 685 685 return rc; 686 686 } 687 687 688 - void rtas_restart(char *cmd) 688 + void __noreturn rtas_restart(char *cmd) 689 689 { 690 690 if (rtas_flash_term_hook) 691 691 rtas_flash_term_hook(SYS_RESTART); ··· 704 704 for (;;); 705 705 } 706 706 707 - void rtas_halt(void) 707 + void __noreturn rtas_halt(void) 708 708 { 709 709 if (rtas_flash_term_hook) 710 710 rtas_flash_term_hook(SYS_HALT);
+2 -2
arch/powerpc/platforms/44x/ppc476.c
··· 68 68 #define AVR_PWRCTL_RESET (0x02) 69 69 70 70 static struct i2c_client *avr_i2c_client; 71 - static void avr_halt_system(int pwrctl_flags) 71 + static void __noreturn avr_halt_system(int pwrctl_flags) 72 72 { 73 73 /* Request the AVR to reset the system */ 74 74 i2c_smbus_write_byte_data(avr_i2c_client, ··· 84 84 avr_halt_system(AVR_PWRCTL_PWROFF); 85 85 } 86 86 87 - static void avr_reset_system(char *cmd) 87 + static void __noreturn avr_reset_system(char *cmd) 88 88 { 89 89 avr_halt_system(AVR_PWRCTL_RESET); 90 90 }
+1 -1
arch/powerpc/platforms/512x/mpc512x.h
··· 18 18 extern int __init mpc5121_clk_init(void); 19 19 extern const char *mpc512x_select_psc_compat(void); 20 20 extern const char *mpc512x_select_reset_compat(void); 21 - extern void mpc512x_restart(char *cmd); 21 + extern void __noreturn mpc512x_restart(char *cmd); 22 22 23 23 #endif /* __MPC512X_H__ */
+1 -1
arch/powerpc/platforms/512x/mpc512x_shared.c
··· 47 47 of_node_put(np); 48 48 } 49 49 50 - void mpc512x_restart(char *cmd) 50 + void __noreturn mpc512x_restart(char *cmd) 51 51 { 52 52 if (reset_module_base) { 53 53 /* Enable software reset "RSTE" */
+1 -2
arch/powerpc/platforms/52xx/mpc52xx_common.c
··· 243 243 /** 244 244 * mpc52xx_restart: ppc_md->restart hook for mpc5200 using the watchdog timer 245 245 */ 246 - void 247 - mpc52xx_restart(char *cmd) 246 + void __noreturn mpc52xx_restart(char *cmd) 248 247 { 249 248 local_irq_disable(); 250 249
+1 -1
arch/powerpc/platforms/82xx/pq2.c
··· 22 22 23 23 #define RMR_CSRE 0x00000001 24 24 25 - void pq2_restart(char *cmd) 25 + void __noreturn pq2_restart(char *cmd) 26 26 { 27 27 local_irq_disable(); 28 28 setbits32(&cpm2_immr->im_clkrst.car_rmr, RMR_CSRE);
+1 -1
arch/powerpc/platforms/82xx/pq2.h
··· 1 1 #ifndef _PQ2_H 2 2 #define _PQ2_H 3 3 4 - void pq2_restart(char *cmd); 4 + void __noreturn pq2_restart(char *cmd); 5 5 6 6 #ifdef CONFIG_PCI 7 7 int pq2ads_pci_init_irq(void);
+1 -1
arch/powerpc/platforms/83xx/misc.c
··· 35 35 36 36 arch_initcall(mpc83xx_restart_init); 37 37 38 - void mpc83xx_restart(char *cmd) 38 + void __noreturn mpc83xx_restart(char *cmd) 39 39 { 40 40 #define RST_OFFSET 0x00000900 41 41 #define RST_PROT_REG 0x00000018
+1 -1
arch/powerpc/platforms/83xx/mpc83xx.h
··· 65 65 * mpc83xx_* files. Mostly for use by mpc83xx_setup 66 66 */ 67 67 68 - extern void mpc83xx_restart(char *cmd); 68 + extern void __noreturn mpc83xx_restart(char *cmd); 69 69 extern long mpc83xx_time_init(void); 70 70 extern int mpc837x_usb_cfg(void); 71 71 extern int mpc834x_usb_cfg(void);
+1 -1
arch/powerpc/platforms/85xx/ksi8560.c
··· 44 44 45 45 static void __iomem *cpld_base = NULL; 46 46 47 - static void machine_restart(char *cmd) 47 + static void __noreturn machine_restart(char *cmd) 48 48 { 49 49 if (cpld_base) 50 50 out_8(cpld_base + KSI8560_CPLD_RCR1, KSI8560_CPLD_RCR1_CPUHR);
+1 -1
arch/powerpc/platforms/85xx/mpc85xx_cds.c
··· 83 83 return PCIBIOS_SUCCESSFUL; 84 84 } 85 85 86 - static void mpc85xx_cds_restart(char *cmd) 86 + static void __noreturn mpc85xx_cds_restart(char *cmd) 87 87 { 88 88 struct pci_dev *dev; 89 89 u_char tmp;
+1 -1
arch/powerpc/platforms/8xx/m8xx_setup.c
··· 198 198 return; 199 199 } 200 200 201 - void mpc8xx_restart(char *cmd) 201 + void __noreturn mpc8xx_restart(char *cmd) 202 202 { 203 203 car8xx_t __iomem *clk_r = immr_map(im_clkrst); 204 204
+1 -1
arch/powerpc/platforms/8xx/mpc8xx.h
··· 11 11 #ifndef __MPC8xx_H 12 12 #define __MPC8xx_H 13 13 14 - extern void mpc8xx_restart(char *cmd); 14 + extern void __noreturn mpc8xx_restart(char *cmd); 15 15 extern void mpc8xx_calibrate_decr(void); 16 16 extern int mpc8xx_set_rtc_time(struct rtc_time *tm); 17 17 extern void mpc8xx_get_rtc_time(struct rtc_time *tm);
+1 -1
arch/powerpc/platforms/amigaone/setup.c
··· 123 123 } 124 124 machine_device_initcall(amigaone, request_isa_regions); 125 125 126 - void amigaone_restart(char *cmd) 126 + void __noreturn amigaone_restart(char *cmd) 127 127 { 128 128 local_irq_disable(); 129 129
+1 -1
arch/powerpc/platforms/chrp/setup.c
··· 239 239 of_node_put(np); 240 240 } 241 241 242 - static void briq_restart(char *cmd) 242 + static void __noreturn briq_restart(char *cmd) 243 243 { 244 244 local_irq_disable(); 245 245 if (briq_SPOR)
+1 -1
arch/powerpc/platforms/embedded6xx/c2k.c
··· 99 99 out_le32(mv64x60_gpp_reg_base + MV64x60_GPP_VALUE_SET, 0x00080004); 100 100 } 101 101 102 - static void c2k_restart(char *cmd) 102 + static void __noreturn c2k_restart(char *cmd) 103 103 { 104 104 c2k_reset_board(); 105 105 msleep(100);
+3 -3
arch/powerpc/platforms/embedded6xx/gamecube.c
··· 29 29 #include "usbgecko_udbg.h" 30 30 31 31 32 - static void gamecube_spin(void) 32 + static void __noreturn gamecube_spin(void) 33 33 { 34 34 /* spin until power button pressed */ 35 35 for (;;) 36 36 cpu_relax(); 37 37 } 38 38 39 - static void gamecube_restart(char *cmd) 39 + static void __noreturn gamecube_restart(char *cmd) 40 40 { 41 41 local_irq_disable(); 42 42 flipper_platform_reset(); ··· 49 49 gamecube_spin(); 50 50 } 51 51 52 - static void gamecube_halt(void) 52 + static void __noreturn gamecube_halt(void) 53 53 { 54 54 gamecube_restart(NULL); 55 55 }
+1 -1
arch/powerpc/platforms/embedded6xx/holly.c
··· 193 193 seq_printf(m, "machine\t\t: PPC750 GX/CL\n"); 194 194 } 195 195 196 - void holly_restart(char *cmd) 196 + void __noreturn holly_restart(char *cmd) 197 197 { 198 198 __be32 __iomem *ocn_bar1 = NULL; 199 199 unsigned long bar;
+3 -3
arch/powerpc/platforms/embedded6xx/linkstation.c
··· 100 100 extern void avr_uart_configure(void); 101 101 extern void avr_uart_send(const char); 102 102 103 - static void linkstation_restart(char *cmd) 103 + static void __noreturn linkstation_restart(char *cmd) 104 104 { 105 105 local_irq_disable(); 106 106 ··· 113 113 avr_uart_send('G'); /* "kick" */ 114 114 } 115 115 116 - static void linkstation_power_off(void) 116 + static void __noreturn linkstation_power_off(void) 117 117 { 118 118 local_irq_disable(); 119 119 ··· 127 127 /* NOTREACHED */ 128 128 } 129 129 130 - static void linkstation_halt(void) 130 + static void __noreturn linkstation_halt(void) 131 131 { 132 132 linkstation_power_off(); 133 133 /* NOTREACHED */
+1 -1
arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.c
··· 146 146 seq_printf(m, "vendor\t\t: Freescale Semiconductor\n"); 147 147 } 148 148 149 - void mpc7448_hpc2_restart(char *cmd) 149 + static void __noreturn mpc7448_hpc2_restart(char *cmd) 150 150 { 151 151 local_irq_disable(); 152 152
+1 -1
arch/powerpc/platforms/embedded6xx/mvme5100.c
··· 177 177 seq_puts(m, "Machine\t\t: MVME5100\n"); 178 178 } 179 179 180 - static void mvme5100_restart(char *cmd) 180 + static void __noreturn mvme5100_restart(char *cmd) 181 181 { 182 182 183 183 local_irq_disable();
+1 -1
arch/powerpc/platforms/embedded6xx/storcenter.c
··· 96 96 mpic_init(mpic); 97 97 } 98 98 99 - static void storcenter_restart(char *cmd) 99 + static void __noreturn storcenter_restart(char *cmd) 100 100 { 101 101 local_irq_disable(); 102 102
+3 -3
arch/powerpc/platforms/embedded6xx/wii.c
··· 112 112 return delta + bl; 113 113 } 114 114 115 - static void wii_spin(void) 115 + static void __noreturn wii_spin(void) 116 116 { 117 117 local_irq_disable(); 118 118 for (;;) ··· 160 160 } 161 161 } 162 162 163 - static void wii_restart(char *cmd) 163 + static void __noreturn wii_restart(char *cmd) 164 164 { 165 165 local_irq_disable(); 166 166 ··· 185 185 wii_spin(); 186 186 } 187 187 188 - static void wii_halt(void) 188 + static void __noreturn wii_halt(void) 189 189 { 190 190 if (ppc_md.restart) 191 191 ppc_md.restart(NULL);
+5 -3
arch/powerpc/platforms/maple/setup.c
··· 94 94 return result; 95 95 } 96 96 97 - static void maple_restart(char *cmd) 97 + static void __noreturn maple_restart(char *cmd) 98 98 { 99 99 unsigned int maple_nvram_base; 100 100 const unsigned int *maple_nvram_offset, *maple_nvram_command; ··· 119 119 for (;;) ; 120 120 fail: 121 121 printk(KERN_EMERG "Maple: Manual Restart Required\n"); 122 + for (;;) ; 122 123 } 123 124 124 - static void maple_power_off(void) 125 + static void __noreturn maple_power_off(void) 125 126 { 126 127 unsigned int maple_nvram_base; 127 128 const unsigned int *maple_nvram_offset, *maple_nvram_command; ··· 147 146 for (;;) ; 148 147 fail: 149 148 printk(KERN_EMERG "Maple: Manual Power-Down Required\n"); 149 + for (;;) ; 150 150 } 151 151 152 - static void maple_halt(void) 152 + static void __noreturn maple_halt(void) 153 153 { 154 154 maple_power_off(); 155 155 }
+1 -1
arch/powerpc/platforms/pasemi/setup.c
··· 62 62 static int nmi_virq = NO_IRQ; 63 63 64 64 65 - static void pas_restart(char *cmd) 65 + static void __noreturn pas_restart(char *cmd) 66 66 { 67 67 /* Need to put others cpu in hold loop so they're not sleeping */ 68 68 smp_send_stop();
+7 -5
arch/powerpc/platforms/powermac/setup.c
··· 383 383 } 384 384 385 385 #ifdef CONFIG_ADB_CUDA 386 - static void cuda_restart(void) 386 + static void __noreturn cuda_restart(void) 387 387 { 388 388 struct adb_request req; 389 389 ··· 392 392 cuda_poll(); 393 393 } 394 394 395 - static void cuda_shutdown(void) 395 + static void __noreturn cuda_shutdown(void) 396 396 { 397 397 struct adb_request req; 398 398 ··· 416 416 #define smu_shutdown() 417 417 #endif 418 418 419 - static void pmac_restart(char *cmd) 419 + static void __noreturn pmac_restart(char *cmd) 420 420 { 421 421 switch (sys_ctrler) { 422 422 case SYS_CTRLER_CUDA: ··· 430 430 break; 431 431 default: ; 432 432 } 433 + while (1) ; 433 434 } 434 435 435 - static void pmac_power_off(void) 436 + static void __noreturn pmac_power_off(void) 436 437 { 437 438 switch (sys_ctrler) { 438 439 case SYS_CTRLER_CUDA: ··· 447 446 break; 448 447 default: ; 449 448 } 449 + while (1) ; 450 450 } 451 451 452 - static void 452 + static void __noreturn 453 453 pmac_halt(void) 454 454 { 455 455 pmac_power_off();
+2 -2
arch/powerpc/platforms/ps3/setup.c
··· 80 80 lv1_pause(0); 81 81 } 82 82 83 - static void ps3_restart(char *cmd) 83 + static void __noreturn ps3_restart(char *cmd) 84 84 { 85 85 DBG("%s:%d cmd '%s'\n", __func__, __LINE__, cmd); 86 86 ··· 96 96 ps3_sys_manager_power_off(); /* never returns */ 97 97 } 98 98 99 - static void ps3_halt(void) 99 + static void __noreturn ps3_halt(void) 100 100 { 101 101 DBG("%s:%d\n", __func__, __LINE__); 102 102
+5 -3
arch/powerpc/sysdev/fsl_soc.c
··· 204 204 205 205 arch_initcall(setup_rstcr); 206 206 207 - void fsl_rstcr_restart(char *cmd) 207 + void __noreturn fsl_rstcr_restart(char *cmd) 208 208 { 209 209 local_irq_disable(); 210 210 if (rstcr) ··· 228 228 * to initiate a partition restart when we're running under the Freescale 229 229 * hypervisor. 230 230 */ 231 - void fsl_hv_restart(char *cmd) 231 + void __noreturn fsl_hv_restart(char *cmd) 232 232 { 233 233 pr_info("hv restart\n"); 234 234 fh_partition_restart(-1); 235 + while (1) ; 235 236 } 236 237 237 238 /* ··· 242 241 * function pointers, to shut down the partition when we're running under 243 242 * the Freescale hypervisor. 244 243 */ 245 - void fsl_hv_halt(void) 244 + void __noreturn fsl_hv_halt(void) 246 245 { 247 246 pr_info("hv exit\n"); 248 247 fh_partition_stop(-1); 248 + while (1) ; 249 249 } 250 250 #endif
+3 -3
arch/powerpc/sysdev/fsl_soc.h
··· 19 19 struct spi_board_info; 20 20 struct device_node; 21 21 22 - extern void fsl_rstcr_restart(char *cmd); 22 + extern void __noreturn fsl_rstcr_restart(char *cmd); 23 23 24 24 /* The different ports that the DIU can be connected to */ 25 25 enum fsl_diu_monitor_port { ··· 42 42 43 43 extern struct platform_diu_data_ops diu_ops; 44 44 45 - void fsl_hv_restart(char *cmd); 46 - void fsl_hv_halt(void); 45 + void __noreturn fsl_hv_restart(char *cmd); 46 + void __noreturn fsl_hv_halt(void); 47 47 48 48 #endif 49 49 #endif