aboutsummaryrefslogtreecommitdiff
path: root/src/device/oprom/realmode/x86_asm.S
diff options
context:
space:
mode:
authorSubrata Banik <subrata.banik@intel.com>2019-07-12 16:43:17 +0530
committerPatrick Georgi <pgeorgi@google.com>2019-07-18 16:12:05 +0000
commitc76bfac088021df631364a092fe12449ba916e30 (patch)
treefa18cf6e820943a8844b36e03934013bb6e34c40 /src/device/oprom/realmode/x86_asm.S
parent8950cfb66f8f1fd4b047fbef2347134be0aeacec (diff)
device/oprom/realmode: Add vbe return status support as per VBE spec 3.0
Existing coreboot oprom implementation relies on user selected vesa mode through CONFIG_FRAMEBUFFER_VESA_MODE Kconfig option and expects that all oprom might support user selected vesa mode. Take an example: Enabling AMD external radeon PCIE graphics card on ICLRVP with default vesa mode 0x118. Unable to get valid X and Y resolution after executing vbe_get_mode_info() with 0x4118, return data buffer shows 0x0 resolution. It causes further hang while trying to draw bmpblk image at depthcharge. This patch checks for output register AH in all vbe function (0x3 and 0x4f00/1/2) and die() if returns error. Change-Id: Iacd2ce468e038a14424f029df3a0adec3e5fa15c Signed-off-by: Subrata Banik <subrata.banik@intel.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/33737 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Patrick Georgi <pgeorgi@google.com>
Diffstat (limited to 'src/device/oprom/realmode/x86_asm.S')
-rw-r--r--src/device/oprom/realmode/x86_asm.S23
1 files changed, 22 insertions, 1 deletions
diff --git a/src/device/oprom/realmode/x86_asm.S b/src/device/oprom/realmode/x86_asm.S
index 87348cdc22..ec82e53ec5 100644
--- a/src/device/oprom/realmode/x86_asm.S
+++ b/src/device/oprom/realmode/x86_asm.S
@@ -43,6 +43,10 @@ __idt_handler_size:
.globl __realmode_code
__realmode_code:
+/* Realmode function return. */
+__realmode_ret = RELOCATED(.)
+ .long 0
+
/* Realmode IDT pointer structure. */
__realmode_idt = RELOCATED(.)
.word 1023 /* 16 bit limit */
@@ -167,6 +171,13 @@ __lcall_instr = RELOCATED(.)
.word 0x0000, 0x0000
/* ************************************ */
+ /*
+ * Here is end of real mode call and time to go back to protected mode.
+ * Before that its better to store current eax into some memory address
+ * so that context persist in protected mode too.
+ */
+ mov %eax, __realmode_ret
+
/* If we got here, we are just about done.
* Need to get back to protected mode.
*/
@@ -196,7 +207,8 @@ __lcall_instr = RELOCATED(.)
popa
/* and exit */
- // TODO return AX from OPROM call
+ /* return AX from OPROM call */
+ mov __realmode_ret, %eax
ret
.globl __realmode_interrupt
@@ -291,6 +303,13 @@ __realmode_interrupt:
__intXX_instr = RELOCATED(.)
.byte 0xcd, 0x00 /* This becomes intXX */
+ /*
+ * Here is end of real mode call and time to go back to protected mode.
+ * Before that its better to store current eax into some memory address
+ * so that context persist in protected mode too.
+ */
+ mov %eax, __realmode_ret
+
/* Ok, the job is done, now go back to protected mode coreboot */
movl %cr0, %eax
orl $PE, %eax
@@ -314,6 +333,8 @@ __intXX_instr = RELOCATED(.)
movl __stack, %esp
popf
popa
+ /* return AX from OPROM call */
+ mov __realmode_ret, %eax
ret
/* This is the 16-bit interrupt entry point called by the IDT stub code.