<p>Patrick Rudolph has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/29578">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">mb/emulation/qemu-i440fx|q35: Switch to C_ENVIRONMENT_BOOTBLOCK<br><br>Useful for testing stuff in C_ENVIRONMENT_BOOTBLOCK, like<br>VBOOT with separate verstage.<br><br>Change-Id: Ibf341002c36d868b9b44c8b37381fa78ae5c4381<br>Signed-off-by: Patrick Rudolph <siro@das-labor.org><br>---<br>M src/cpu/qemu-x86/Kconfig<br>M src/cpu/qemu-x86/Makefile.inc<br>A src/cpu/qemu-x86/bootblock.c<br>R src/cpu/qemu-x86/cache_as_ram_bootblock.S<br>M src/mainboard/emulation/qemu-i440fx/Kconfig<br>M src/mainboard/emulation/qemu-i440fx/Makefile.inc<br>M src/mainboard/emulation/qemu-i440fx/romstage.c<br>M src/mainboard/emulation/qemu-q35/Kconfig<br>M src/mainboard/emulation/qemu-q35/romstage.c<br>9 files changed, 85 insertions(+), 58 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/78/29578/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/cpu/qemu-x86/Kconfig b/src/cpu/qemu-x86/Kconfig</span><br><span>index ab8e1a9..70cce9b 100644</span><br><span>--- a/src/cpu/qemu-x86/Kconfig</span><br><span>+++ b/src/cpu/qemu-x86/Kconfig</span><br><span>@@ -21,3 +21,4 @@</span><br><span>   select ARCH_RAMSTAGE_X86_32</span><br><span>  select SMP</span><br><span>   select UDELAY_TSC</span><br><span style="color: hsl(120, 100%, 40%);">+     select C_ENVIRONMENT_BOOTBLOCK</span><br><span>diff --git a/src/cpu/qemu-x86/Makefile.inc b/src/cpu/qemu-x86/Makefile.inc</span><br><span>index 288eea6..8ddaa81 100644</span><br><span>--- a/src/cpu/qemu-x86/Makefile.inc</span><br><span>+++ b/src/cpu/qemu-x86/Makefile.inc</span><br><span>@@ -12,6 +12,8 @@</span><br><span> ## GNU General Public License for more details.</span><br><span> ##</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+bootblock-y += cache_as_ram_bootblock.S</span><br><span style="color: hsl(120, 100%, 40%);">+bootblock-y += bootblock.c</span><br><span> ramstage-y += qemu.c</span><br><span> subdirs-y += ../x86/mtrr</span><br><span> subdirs-y += ../x86/lapic</span><br><span>diff --git a/src/cpu/qemu-x86/bootblock.c b/src/cpu/qemu-x86/bootblock.c</span><br><span>new file mode 100644</span><br><span>index 0000000..2a4c028</span><br><span>--- /dev/null</span><br><span>+++ b/src/cpu/qemu-x86/bootblock.c</span><br><span>@@ -0,0 +1,21 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#include <bootblock_common.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <cpu/x86/msr.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <cpu/x86/mtrr.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <console/console.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <cpu/x86/bist.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+asmlinkage void bootblock_c_entry_bist(uint64_t base_timestamp, uint32_t bist);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+asmlinkage void bootblock_c_entry_bist(uint64_t base_timestamp, uint32_t bist)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  post_code(0x05);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Halt if there was a built in self test failure */</span><br><span style="color: hsl(120, 100%, 40%);">+  if (bist) {</span><br><span style="color: hsl(120, 100%, 40%);">+           console_init();</span><br><span style="color: hsl(120, 100%, 40%);">+               report_bist_failure(bist);</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Call lib/bootblock.c main */</span><br><span style="color: hsl(120, 100%, 40%);">+       bootblock_main_with_timestamp(base_timestamp, NULL, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/mainboard/emulation/qemu-i440fx/cache_as_ram.inc b/src/cpu/qemu-x86/cache_as_ram_bootblock.S</span><br><span>similarity index 67%</span><br><span>rename from src/mainboard/emulation/qemu-i440fx/cache_as_ram.inc</span><br><span>rename to src/cpu/qemu-x86/cache_as_ram_bootblock.S</span><br><span>index d36341c..9b9f070 100644</span><br><span>--- a/src/mainboard/emulation/qemu-i440fx/cache_as_ram.inc</span><br><span>+++ b/src/cpu/qemu-x86/cache_as_ram_bootblock.S</span><br><span>@@ -20,8 +20,8 @@</span><br><span> </span><br><span> #define CPU_PHYSMASK_HI  (1 << (CONFIG_CPU_ADDR_BITS - 32) - 1)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  /* Save the BIST result. */</span><br><span style="color: hsl(0, 100%, 40%);">-     movl    %eax, %ebp</span><br><span style="color: hsl(120, 100%, 40%);">+.global bootblock_pre_c_entry</span><br><span style="color: hsl(120, 100%, 40%);">+bootblock_pre_c_entry:</span><br><span> </span><br><span> cache_as_ram:</span><br><span>       post_code(0x20)</span><br><span>@@ -37,27 +37,32 @@</span><br><span>         * of big ramstages. The ramstage will load its own %esp so</span><br><span>   * there is no harm in using this value.</span><br><span>      */</span><br><span style="color: hsl(0, 100%, 40%);">-     movl    $0xa0000, %eax</span><br><span style="color: hsl(120, 100%, 40%);">+        movl    $(CONFIG_DCACHE_RAM_BASE + CONFIG_DCACHE_RAM_SIZE), %eax</span><br><span>     movl    %eax, %esp</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* Restore the BIST result. */</span><br><span style="color: hsl(0, 100%, 40%);">-  movl    %ebp, %eax</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Align the stack and keep aligned for call to bootblock_c_entry() */</span><br><span style="color: hsl(120, 100%, 40%);">+        and     $0xfffffff0, %esp</span><br><span>    movl    %esp, %ebp</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Clear the cache memory region. This will also clear CAR GLOBAL */</span><br><span style="color: hsl(120, 100%, 40%);">+  movl    $CONFIG_DCACHE_RAM_BASE, %esi</span><br><span style="color: hsl(120, 100%, 40%);">+ movl    %esi, %edi</span><br><span style="color: hsl(120, 100%, 40%);">+    movl    $(CONFIG_DCACHE_RAM_SIZE >> 2), %ecx</span><br><span style="color: hsl(120, 100%, 40%);">+    xorl    %eax, %eax</span><br><span style="color: hsl(120, 100%, 40%);">+    rep     stosl</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Restore the BIST result and timestamps. */</span><br><span style="color: hsl(120, 100%, 40%);">+ movd    %mm0, %ebx</span><br><span style="color: hsl(120, 100%, 40%);">+    movd    %mm1, %eax</span><br><span style="color: hsl(120, 100%, 40%);">+    movd    %mm2, %edx</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  pushl   %ebx</span><br><span style="color: hsl(120, 100%, 40%);">+  pushl   %edx</span><br><span>         pushl   %eax</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-before_romstage:</span><br><span style="color: hsl(120, 100%, 40%);">+before_c_entry:</span><br><span>    post_code(0x29)</span><br><span style="color: hsl(0, 100%, 40%);">- /* Call romstage.c main function. */</span><br><span style="color: hsl(0, 100%, 40%);">-    call    romstage_main</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   post_code(0x30)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-__main:</span><br><span style="color: hsl(0, 100%, 40%);">-  post_code(POST_PREPARE_RAMSTAGE)</span><br><span style="color: hsl(0, 100%, 40%);">-        cld                     /* Clear direction flag. */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     call    copy_and_run</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+  call    bootblock_c_entry_bist</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Never returns */</span><br><span> .Lhlt:</span><br><span>        post_code(POST_DEAD_CODE)</span><br><span>    hlt</span><br><span>diff --git a/src/mainboard/emulation/qemu-i440fx/Kconfig b/src/mainboard/emulation/qemu-i440fx/Kconfig</span><br><span>index fc56ab6..0b113cc 100644</span><br><span>--- a/src/mainboard/emulation/qemu-i440fx/Kconfig</span><br><span>+++ b/src/mainboard/emulation/qemu-i440fx/Kconfig</span><br><span>@@ -12,6 +12,7 @@</span><br><span>     select BOARD_ROMSIZE_KB_256</span><br><span>  select MAINBOARD_HAS_NATIVE_VGA_INIT</span><br><span>         select MAINBOARD_FORCE_NATIVE_VGA_INIT</span><br><span style="color: hsl(120, 100%, 40%);">+        select BOOTBLOCK_CONSOLE</span><br><span> </span><br><span> config MAINBOARD_DIR</span><br><span>         string</span><br><span>@@ -25,12 +26,23 @@</span><br><span>         int</span><br><span>  default 6</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+# Skip the first 64KiB as coreboot table pointer is installed</span><br><span style="color: hsl(120, 100%, 40%);">+# at address 0</span><br><span> config DCACHE_RAM_BASE</span><br><span>       hex</span><br><span style="color: hsl(0, 100%, 40%);">-     default 0xd0000</span><br><span style="color: hsl(120, 100%, 40%);">+       default 0x10000</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+# Memory at 0xa0000 decodes to VGA</span><br><span> config DCACHE_RAM_SIZE</span><br><span>    hex</span><br><span style="color: hsl(0, 100%, 40%);">-     default 0x10000</span><br><span style="color: hsl(120, 100%, 40%);">+       default 0x90000</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+config DCACHE_BSP_STACK_SIZE</span><br><span style="color: hsl(120, 100%, 40%);">+       hex</span><br><span style="color: hsl(120, 100%, 40%);">+   default 0x4000</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+config C_ENV_BOOTBLOCK_SIZE</span><br><span style="color: hsl(120, 100%, 40%);">+ hex</span><br><span style="color: hsl(120, 100%, 40%);">+   default 0x4000</span><br><span> </span><br><span> endif # BOARD_EMULATION_QEMU_X86_I440FX</span><br><span>diff --git a/src/mainboard/emulation/qemu-i440fx/Makefile.inc b/src/mainboard/emulation/qemu-i440fx/Makefile.inc</span><br><span>index c986667..38e5237 100644</span><br><span>--- a/src/mainboard/emulation/qemu-i440fx/Makefile.inc</span><br><span>+++ b/src/mainboard/emulation/qemu-i440fx/Makefile.inc</span><br><span>@@ -1,4 +1,4 @@</span><br><span style="color: hsl(0, 100%, 40%);">-cpu_incs-y += $(src)/mainboard/emulation/qemu-i440fx/cache_as_ram.inc</span><br><span style="color: hsl(120, 100%, 40%);">+romstage-y += romstage.c</span><br><span> ramstage-y += northbridge.c</span><br><span> ramstage-y += fw_cfg.c</span><br><span> romstage-y += memory.c</span><br><span>diff --git a/src/mainboard/emulation/qemu-i440fx/romstage.c b/src/mainboard/emulation/qemu-i440fx/romstage.c</span><br><span>index 9530621..3432a00 100644</span><br><span>--- a/src/mainboard/emulation/qemu-i440fx/romstage.c</span><br><span>+++ b/src/mainboard/emulation/qemu-i440fx/romstage.c</span><br><span>@@ -16,30 +16,17 @@</span><br><span> #include <stdint.h></span><br><span> #include <cbmem.h></span><br><span> #include <console/console.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <cpu/x86/bist.h></span><br><span> #include <cpu/intel/romstage.h></span><br><span> #include <timestamp.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <delay.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <cpu/x86/lapic.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <program_loading.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void *asmlinkage romstage_main(unsigned long bist)</span><br><span style="color: hsl(120, 100%, 40%);">+asmlinkage void car_stage_entry(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  int cbmem_was_initted;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  /* init_timer(); */</span><br><span style="color: hsl(0, 100%, 40%);">-     post_code(0x05);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>     console_init();</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     /* Halt if there was a built in self test failure */</span><br><span style="color: hsl(0, 100%, 40%);">-    report_bist_failure(bist);</span><br><span style="color: hsl(120, 100%, 40%);">+    cbmem_recovery(0);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  cbmem_was_initted = !cbmem_recovery(0);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- timestamp_init(timestamp_get());</span><br><span>     timestamp_add_now(TS_START_ROMSTAGE);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       /* Emulation uses fixed low stack during ramstage. */</span><br><span style="color: hsl(0, 100%, 40%);">-   return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  run_ramstage();</span><br><span> }</span><br><span>diff --git a/src/mainboard/emulation/qemu-q35/Kconfig b/src/mainboard/emulation/qemu-q35/Kconfig</span><br><span>index 10b5a93..5aee4ec 100644</span><br><span>--- a/src/mainboard/emulation/qemu-q35/Kconfig</span><br><span>+++ b/src/mainboard/emulation/qemu-q35/Kconfig</span><br><span>@@ -11,6 +11,7 @@</span><br><span>        select BOARD_ROMSIZE_KB_2048</span><br><span>         select MAINBOARD_HAS_NATIVE_VGA_INIT</span><br><span>         select MAINBOARD_FORCE_NATIVE_VGA_INIT</span><br><span style="color: hsl(120, 100%, 40%);">+        select BOOTBLOCK_CONSOLE</span><br><span> </span><br><span> config MAINBOARD_DIR</span><br><span>         string</span><br><span>@@ -28,17 +29,28 @@</span><br><span>         hex</span><br><span>  default 0xb0000000</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+# Skip the first 64KiB as coreboot table pointer is installed</span><br><span style="color: hsl(120, 100%, 40%);">+# at address 0</span><br><span> config DCACHE_RAM_BASE</span><br><span>      hex</span><br><span style="color: hsl(0, 100%, 40%);">-     default 0xd0000</span><br><span style="color: hsl(120, 100%, 40%);">+       default 0x10000</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+# Memory at 0xa0000 decodes to VGA</span><br><span> config DCACHE_RAM_SIZE</span><br><span>    hex</span><br><span style="color: hsl(0, 100%, 40%);">-     default 0x10000</span><br><span style="color: hsl(120, 100%, 40%);">+       default 0x90000</span><br><span> </span><br><span> # Do not show IFD/blob options since QEMU doesn't care</span><br><span> config HAVE_INTEL_FIRMWARE</span><br><span>      bool</span><br><span>         default n</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+config DCACHE_BSP_STACK_SIZE</span><br><span style="color: hsl(120, 100%, 40%);">+   hex</span><br><span style="color: hsl(120, 100%, 40%);">+   default 0x4000</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+config C_ENV_BOOTBLOCK_SIZE</span><br><span style="color: hsl(120, 100%, 40%);">+ hex</span><br><span style="color: hsl(120, 100%, 40%);">+   default 0x4000</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> endif # BOARD_EMULATION_QEMU_X86_Q35</span><br><span>diff --git a/src/mainboard/emulation/qemu-q35/romstage.c b/src/mainboard/emulation/qemu-q35/romstage.c</span><br><span>index deb94af..38ae0ca 100644</span><br><span>--- a/src/mainboard/emulation/qemu-q35/romstage.c</span><br><span>+++ b/src/mainboard/emulation/qemu-q35/romstage.c</span><br><span>@@ -16,32 +16,19 @@</span><br><span> #include <stdint.h></span><br><span> #include <cbmem.h></span><br><span> #include <console/console.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <southbridge/intel/i82801ix/i82801ix.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <cpu/x86/bist.h></span><br><span> #include <cpu/intel/romstage.h></span><br><span> #include <timestamp.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <delay.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <cpu/x86/lapic.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <southbridge/intel/i82801ix/i82801ix.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <program_loading.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void * asmlinkage romstage_main(unsigned long bist)</span><br><span style="color: hsl(120, 100%, 40%);">+asmlinkage void car_stage_entry(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     int cbmem_was_initted;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  /* init_timer(); */</span><br><span style="color: hsl(0, 100%, 40%);">-     post_code(0x05);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>     i82801ix_early_init();</span><br><span>       console_init();</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     /* Halt if there was a built in self test failure */</span><br><span style="color: hsl(0, 100%, 40%);">-    report_bist_failure(bist);</span><br><span style="color: hsl(120, 100%, 40%);">+    cbmem_recovery(0);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  cbmem_was_initted = !cbmem_recovery(0);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- timestamp_init(timestamp_get());</span><br><span>     timestamp_add_now(TS_START_ROMSTAGE);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       /* Emulation uses fixed low stack during ramstage. */</span><br><span style="color: hsl(0, 100%, 40%);">-   return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  run_ramstage();</span><br><span> }</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/29578">change 29578</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://review.coreboot.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://review.coreboot.org/29578"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: coreboot </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Ibf341002c36d868b9b44c8b37381fa78ae5c4381 </div>
<div style="display:none"> Gerrit-Change-Number: 29578 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Patrick Rudolph <siro@das-labor.org> </div>