A rotina announce_and_cleanup
não usa seu parâmetro fake
, exceto para imprimir a "(execução falsa para rastreio)" ou não. Em particular, ele não é passado para as funções que chama depois de printf()
.
O comentário de parâmetro para fake
diz que não-zero significa fazer tudo, exceto inicializar, e a diferença em printf()
não pode ser a causa disso.
Se você olhar para onde announce_and_cleanup()
está sendo chamado, então fake
pode ser um pouco mais claro (do mesmo arquivo que você vincula):
248/* Subcommand: GO */
249static void boot_jump_linux(bootm_headers_t *images, int flag)
250{
251#ifdef CONFIG_ARM64
252 void (*kernel_entry)(void *fdt_addr);
253 int fake = (flag & BOOTM_STATE_OS_FAKE_GO);
254
255 kernel_entry = (void (*)(void *fdt_addr))images->ep;
256
257 debug("## Transferring control to Linux (at address %lx)...\n",
258 (ulong) kernel_entry);
259 bootstage_mark(BOOTSTAGE_ID_RUN_OS);
260
261 announce_and_cleanup(fake);
262
263 if (!fake)
264 kernel_entry(images->ft_addr);
265#else
266 unsigned long machid = gd->bd->bi_arch_number;
267 char *s;
268 void (*kernel_entry)(int zero, int arch, uint params);
269 unsigned long r2;
270 int fake = (flag & BOOTM_STATE_OS_FAKE_GO);
271
272 kernel_entry = (void (*)(int, int, uint))images->ep;
273
274 s = getenv("machid");
275 if (s) {
276 strict_strtoul(s, 16, &machid);
277 printf("Using machid 0x%lx from environment\n", machid);
278 }
279
280 debug("## Transferring control to Linux (at address %08lx)" \
281 "...\n", (ulong) kernel_entry);
282 bootstage_mark(BOOTSTAGE_ID_RUN_OS);
283 announce_and_cleanup(fake);
284
285 if (IMAGE_ENABLE_OF_LIBFDT && images->ft_len)
286 r2 = (unsigned long)images->ft_addr;
287 else
288 r2 = gd->bd->bi_boot_params;
289
290 if (!fake)
291 kernel_entry(0, machid, r2);
292#endif
293}
se o falso for diferente de zero para announce_and_cleanup()
, o kernel_entry()
nunca será chamado e o fluxo de controle do programa não será transferido para o kernel carregado.