Am Freitag, 17. Dezember 2010, um 15:08:38 schrieb Fengwei Zhang:
I would appreciate if someone could explain a little bit for me. CONFIG_DCACHE_RAM_BASE CONFIG_DCACHE_RAM_SIZE CONFIG_RAMTOP
DCACHE_RAM_BASE is the start address of the memory addresses that are used for CAR.
DCACHE_RAM_SIZE is the size of that region.
RAMTOP is the highest address of the memory region that coreboot will use in RAM.
In addition, why do we need to set new esp here? /* set new esp */ /* before CONFIG_RAMBASE */ "subl %0, %%esp\n\t"
::"a"( (CONFIG_DCACHE_RAM_BASE + CONFIG_DCACHE_RAM_SIZE)-
(CONFIG_RAMTOP) )
This moves the stack from CAR area to RAM.
While in CAR, the stack is laid out at the top end of CAR, growing downwards (ie. starting at DCACHE_RAM_BASE + DCACHE_RAM_SIZE). While in RAM, it starts at the top end of the ram area used for coreboot (RAMTOP).
Before that line the stack is copied from CAR to RAM, then esp is setup so it points to the same place in RAM that it pointed to in CAR (that's why we use sub, not mov). This setup doesn't allow returning from the current function (we don't adjust addresses on the stack), but it makes sure that local variables in the scope of the current function are still usable.
Hope this helps, Patrick