|  | /* | 
|  | * 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 |