diff --git a/zipl/boot/libc.h b/zipl/boot/libc.h index 9cf3b485..f85f5a72 100644 --- a/zipl/boot/libc.h +++ b/zipl/boot/libc.h @@ -61,7 +61,7 @@ unsigned long get_zeroed_page(void); void free_page(unsigned long); void initialize(void); void libc_stop(unsigned long) __noreturn; -void start(void); +void __noreturn start(void); void pgm_check_handler(void); void pgm_check_handler_fn(void); void panic_notify(unsigned long reason); diff --git a/zipl/boot/stage2.c b/zipl/boot/stage2.c index 2353baf5..336713b5 100644 --- a/zipl/boot/stage2.c +++ b/zipl/boot/stage2.c @@ -75,15 +75,16 @@ out_free_page: } -static void execute(uint64_t psw) +static __noreturn void execute(uint64_t psw) { asm volatile( " lpsw %[psw]\n" : : [psw] "Q" (psw) : "cc" ); + __builtin_unreachable(); } -void start(void) +void __noreturn start(void) { struct stage2_descr stage2_descr; struct subchannel_id subchannel_id; diff --git a/zipl/boot/stage2dump.c b/zipl/boot/stage2dump.c index 9ba5d485..05fe290a 100644 --- a/zipl/boot/stage2dump.c +++ b/zipl/boot/stage2dump.c @@ -393,7 +393,7 @@ static void store_status(void) * Block followed by a valid checksum (as defined in lowcore.h and set * by ipl.c). In case of match use diag308 to IPL. */ -static void dump_exit(unsigned long code) +static __noreturn void dump_exit(unsigned long code) { struct ipib_info *ipib_info = (struct ipib_info *)&S390_lowcore.ipib; uint32_t ipib_len, csum; @@ -406,6 +406,7 @@ static void dump_exit(unsigned long code) libc_stop(code); diag308(DIAG308_SET, (void *) ipib_info->ipib); diag308(DIAG308_IPL, NULL); + __builtin_unreachable(); } /* @@ -420,7 +421,7 @@ void panic_notify(unsigned long code) /* * Create stand-alone dump */ -void start(void) +void __noreturn start(void) { init_early(); dt_device_parm_setup();