[coreboot] [PATCH] add proper "memory management" for high table area (aka CBMEM)
Peter Stuge
peter at stuge.se
Sun Oct 25 15:30:19 CET 2009
Stefan Reinauer wrote:
> CBMEM high table memory manager.
Nice.
> This code adds a very simple toc based memory manager for the high tables area.
> The purpose of this code is to make it simpler and more reliable to find
> certain data structures in memory. This will also make it possible to have ACPI
> S3 Resume working without an ugly hole at 31MB.
>
> Signed-off-by: Stefan Reinauer <stepan at coresystems.de>
Acked-by: Peter Stuge <peter at stuge.se>
Maybe name it CBMM instead?
> +++ src/include/cbmem.h (revision 0)
..
> +#if CONFIG_HAVE_ACPI_RESUME
> +#define HIGH_MEMORY_SIZE ( 1024 * 1024 )
> +#define HIGH_MEMORY_SAVE ( HIGH_MEMORY_SIZE - HIGH_MEMORY_TABLES )
> +#else
> +#define HIGH_MEMORY_SIZE HIGH_MEMORY_TABLES
> +#endif
Note that _HAVE_ in general is meant for when the port has a
capability. It does not mean that the user enabled the capability
during build. Now, ACPI resume is not currently configurable, and I
don't know if it should be, but it's good to be consistent with
naming.
> +++ src/lib/cbmem.c (revision 0)
..
> +// The CBMEM TOC reserves 512 bytes to keep
> +// the other entries somewhat aligned.
> +// Increase if MAX_CBMEM_ENTRIES exceeds 21
> +#define CBMEM_TOC_RESERVED 512
> +#define MAX_CBMEM_ENTRIES 16
It would be nice if only one of these was explicitly set, and the
other determined by the first.
#define MAX_CBMEM_ENTRIES 16
#define CBMEM_TOC_RESERVED ALIGN_UP(512, (MAX_CBMEM_ENTRIES * sizeof(struct cbmem_entry)))
Or something similar.
> +#define CBMEM_MAGIC 0x434f5245
Maybe CBMM rather than CORE? (with or without rename)
> +++ src/cpu/intel/model_6ex/cache_as_ram_disable.c (working copy)
..
> - {
> - /* Check value of esp to verify if we have enough rom for stack in Cache as RAM */
> - unsigned v_esp;
> - __asm__ volatile (
> - "movl %%esp, %0\n\t"
> - : "=a" (v_esp)
> - );
> - printk_spew("v_esp=%08x\r\n", v_esp);
> - }
> +#if CAR_DEBUG
> + /* Check value of esp to verify if we have enough rom for stack in Cache as RAM */
> + unsigned v_esp;
> + __asm__ volatile (
> + "movl %%esp, %0\n"
> + : "=a" (v_esp)
> + );
> + printk_spew("v_esp=%08x\n", v_esp);
> +#endif
I guess this is unrelated, but it looks benign.
> - if(cpu_reset==0) {
> -#define CLEAR_FIRST_1M_RAM 1
> -#include "cache_as_ram_post.c"
> - } else {
> #undef CLEAR_FIRST_1M_RAM
> #include "cache_as_ram_post.c"
> - }
Um?
> + /* For now: use rambase + 1MB - 64K (counting downwards) as stack. This
> + * makes sure that we stay completely within the 1M of memory we
> + * preserve with the memcpy above.
> + */
> +
> +#ifndef HIGH_MEMORY_SAVE
> +#define HIGH_MEMORY_SAVE ( (1024 - 64) * 1024 )
> +#endif
> +
> __asm__ volatile (
> - /* set new esp */ /* before CONFIG_RAMBASE */
> - "subl %0, %%ebp\n\t"
> - "subl %0, %%esp\n\t"
> - ::"a"( (CONFIG_DCACHE_RAM_BASE + CONFIG_DCACHE_RAM_SIZE)- CONFIG_RAMBASE )
> + "movl %0, %%ebp\n"
> + "movl %0, %%esp\n"
> + :: "a" (CONFIG_RAMBASE + HIGH_MEMORY_SAVE)
Uhm again? :)
> -#ifdef DEACTIVATE_CAR
> - print_debug("Deactivating CAR");
> -#include DEACTIVATE_CAR_FILE
> - print_debug(" - Done.\r\n");
> -#endif
I guess this happens elsewhere then?
> - /* We will not return */
> }
>
> - print_debug("sorry. parachute did not open.\r\n");
> + /* We will not return */
> + printk_debug("sorry. parachute did not open.\n");
> }
Better message please? :) And maybe a die() call?
> +++ src/cpu/intel/model_6fx/cache_as_ram_disable.c (working copy)
Same stuff as for model_6ex.
> +++ src/arch/i386/boot/tables.c (working copy)
..
> + /* Ok, this is a bit hacky still, because some day we want to have this
> + * completely dynamic. But right now we are setting fixed sizes.
> + * It's probably still better than the old high_table_base code because
> + * now at least we know when we have an overflow in the area.
Maybe make the reserved size determined completely at run time then?
> +#if CONFIG_HAVE_ACPI_RESUME
> + /* Let's prepare the ACPI S3 Resume area now already, so we can rely on
> + * it begin there during reboot time. We don't need the pointer, nor
> + * the result right now. If it fails, ACPI resume will be disabled.
> + */
> + cbmem_add(CBMEM_ID_RESUME, 1024 * (1024-64));
> +#endif
So one chunk is only reserved with ACPI_RESUME, but the size from
which reservations are made is always the same? That makes for some
unfortunate asymmetry when that space is almost full.
> + // Remove before sending upstream
> + cbmem_list();
Are we upstream? :)
> +++ src/boot/hardwaremain.c (working copy)
..
> + /* console_init() MUST PRECEDE ALL printk()! */
What about printk_*() ?
//Peter
More information about the coreboot
mailing list