| /* |
| * From Coreboot file device/oprom/realmode/x86.h |
| * |
| * Copyright (C) 2007 Advanced Micro Devices, Inc. |
| * Copyright (C) 2009-2010 coresystems GmbH |
| * |
| * SPDX-License-Identifier: GPL-2.0 |
| */ |
| |
| #ifndef _X86_LIB_BIOS_H |
| #define _X86_LIB_BIOS_H |
| |
| #include <linux/linkage.h> |
| |
| #define REALMODE_BASE 0x600 |
| |
| #ifdef __ASSEMBLY__ |
| |
| #define PTR_TO_REAL_MODE(x) (x - asm_realmode_code + REALMODE_BASE) |
| |
| #else |
| |
| /* Convert a symbol address to our real mode area */ |
| #define PTR_TO_REAL_MODE(sym)\ |
| (void *)(REALMODE_BASE + ((char *)&(sym) - (char *)&asm_realmode_code)) |
| |
| /* |
| * The following symbols cannot be used directly. They need to be fixed up |
| * to point to the correct address location after the code has been copied |
| * to REALMODE_BASE. Absolute symbols are not used because those symbols are |
| * relocated by U-Boot. |
| */ |
| extern unsigned char asm_realmode_call, __realmode_interrupt; |
| extern unsigned char asm_realmode_buffer; |
| |
| #define DOWNTO8(A) \ |
| union { \ |
| struct { \ |
| union { \ |
| struct { \ |
| uint8_t A##l; \ |
| uint8_t A##h; \ |
| } __packed; \ |
| uint16_t A##x; \ |
| } __packed; \ |
| uint16_t h##A##x; \ |
| } __packed; \ |
| uint32_t e##A##x; \ |
| } __packed; |
| |
| #define DOWNTO16(A) \ |
| union { \ |
| struct { \ |
| uint16_t A; \ |
| uint16_t h##A; \ |
| } __packed; \ |
| uint32_t e##A; \ |
| } __packed; |
| |
| struct eregs { |
| DOWNTO8(a); |
| DOWNTO8(c); |
| DOWNTO8(d); |
| DOWNTO8(b); |
| DOWNTO16(sp); |
| DOWNTO16(bp); |
| DOWNTO16(si); |
| DOWNTO16(di); |
| uint32_t vector; |
| uint32_t error_code; |
| uint32_t eip; |
| uint32_t cs; |
| uint32_t eflags; |
| }; |
| |
| struct realmode_idt { |
| u16 offset, cs; |
| }; |
| |
| void x86_exception(struct eregs *info); |
| |
| /* From x86_asm.S */ |
| extern unsigned char __idt_handler; |
| extern unsigned int __idt_handler_size; |
| extern unsigned char asm_realmode_code; |
| extern unsigned int asm_realmode_code_size; |
| |
| asmlinkage void (*realmode_call)(u32 addr, u32 eax, u32 ebx, u32 ecx, u32 edx, |
| u32 esi, u32 edi); |
| |
| asmlinkage void (*realmode_interrupt)(u32 intno, u32 eax, u32 ebx, u32 ecx, |
| u32 edx, u32 esi, u32 edi); |
| |
| int int10_handler(void); |
| int int12_handler(void); |
| int int16_handler(void); |
| int int1a_handler(void); |
| #endif /*__ASSEMBLY__ */ |
| |
| #endif |