aboutsummaryrefslogtreecommitdiff
path: root/src/cpu/x86
diff options
context:
space:
mode:
authorRaul E Rangel <rrangel@chromium.org>2018-06-25 14:22:27 -0600
committerMartin Roth <martinroth@google.com>2018-06-27 22:11:20 +0000
commit0140541f5003e173baac08f4719c285936795e76 (patch)
tree9e33e78dc15132b46af8a737a42b0cc223b5f3c8 /src/cpu/x86
parentdd549e117588472d11b10e0b1287a0e19377b844 (diff)
smm: Make local variables relative to ebp
This reduces the cognitive overhead of referencing locals via esp since it changes with every push. BUG=b:80539294 TEST=built and booted on grunt. Change-Id: Ib7eb98ce3483d4fc803696c1b2496d8384317536 Signed-off-by: Raul E Rangel <rrangel@chromium.org> Reviewed-on: https://review.coreboot.org/27225 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Martin Roth <martinroth@google.com>
Diffstat (limited to 'src/cpu/x86')
-rw-r--r--src/cpu/x86/smm/smm_stub.S23
1 files changed, 12 insertions, 11 deletions
diff --git a/src/cpu/x86/smm/smm_stub.S b/src/cpu/x86/smm/smm_stub.S
index 32435a04b5..ad15c6c72a 100644
--- a/src/cpu/x86/smm/smm_stub.S
+++ b/src/cpu/x86/smm/smm_stub.S
@@ -131,10 +131,14 @@ smm_trampoline32:
jmp 2f
1:
movl stack_size, %eax
- mul %ecx
+ mul %ecx /* %eax(stack_size) * %ecx(cpu) = %eax(offset) */
movl stack_top, %edx
- subl %eax, %edx
+ subl %eax, %edx /* global_stack_top - offset = stack_top */
mov %edx, %esp
+ mov %esp, %ebp
+
+ /* Allocate locals (fxsave) */
+ subl $0x4, %esp
/* calculate fxsave location */
mov fxsave_area, %edi
@@ -146,8 +150,7 @@ smm_trampoline32:
2:
/* Save location of fxsave area. */
- push %edi
- mov %esp, %ebp
+ mov %edi, -4(%ebp)
test %edi, %edi
jz 1f
@@ -165,20 +168,18 @@ smm_trampoline32:
/* Call into the c-based SMM relocation function with the platform
* parameters. Equivalent to:
- * struct arg = { c_handler_params, cpu_num, smm_runtime {;
+ * struct arg = { c_handler_params, cpu_num, smm_runtime };
* c_handler(&arg)
*/
push $(smm_runtime)
- push %ecx
- push c_handler_arg
- push %esp
+ push %ecx /* int cpu */
+ push c_handler_arg /* void *arg */
+ push %esp /* smm_module_params *arg (allocated on stack). */
mov c_handler, %eax
call *%eax
- /* Restore stack from call frame */
- mov %ebp, %esp
/* Retrieve fxsave location. */
- pop %edi
+ mov -4(%ebp), %edi
test %edi, %edi
jz 1f