Look at real operating systems to see how they size memory. (9)

色々なドキュメントを流し読みして r2 レジスタに_Flattened Device Tree (FDT)_なポインタが格納されているのは理解した。で、setup.c の setup_arch 手続きの以下の部分で云々な模様。

void __init setup_arch(char **cmdline_p)
{
    struct machine_desc *mdesc;

    unwind_init();

    setup_processor();
    mdesc = setup_machine_fdt(__atags_pointer);
    if (!mdesc)
        mdesc = setup_machine_tags(machine_arch_type);

ええと、__atags_pointer って調べたような気もするが。
あったぞ。

./kernel/head-common.S:115:    .long    __atags_pointer            @ r6

ちなみに r6 レジスタですが、start_kernel を呼び出す __mmap_switched 手続きの最後らへんで r2 から r6 に退避されております。

    str    r2, [r6]            @ Save atags pointer
    bic    r4, r0, #CR_A            @ Clear 'A' bit
    stmia    r7, {r0, r4}            @ Save control register values
    b    start_kernel
ENDPROC(__mmap_switched)

で、setup_machine_fdt 手続きの中で of_scan_flat_dt 手続きを使ってメモリ容量の検出を行なっているはず。以下なブロックなソレは確認必要か。

    /* Retrieve various information from the /chosen node */
    of_scan_flat_dt(early_init_dt_scan_chosen, boot_command_line);
    /* Initialize {size,address}-cells info */
    of_scan_flat_dt(early_init_dt_scan_root, NULL);
    /* Setup memory, calling early_init_dt_add_memory_arch */
    of_scan_flat_dt(early_init_dt_scan_memory, NULL);

ここ、色んな意味でポイント高いんですがハードルも高いな。