1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * From Coreboot file device/oprom/realmode/x86.h 4 * 5 * Copyright (C) 2007 Advanced Micro Devices, Inc. 6 * Copyright (C) 2009-2010 coresystems GmbH 7 */ 8 9 #ifndef _X86_LIB_BIOS_H 10 #define _X86_LIB_BIOS_H 11 12 #include <linux/linkage.h> 13 14 #define REALMODE_BASE 0x600 15 16 #ifdef __ASSEMBLY__ 17 18 #define PTR_TO_REAL_MODE(x) (x - asm_realmode_code + REALMODE_BASE) 19 20 #else 21 22 /* Convert a symbol address to our real mode area */ 23 #define PTR_TO_REAL_MODE(sym)\ 24 (void *)(REALMODE_BASE + ((char *)&(sym) - (char *)&asm_realmode_code)) 25 26 /* 27 * The following symbols cannot be used directly. They need to be fixed up 28 * to point to the correct address location after the code has been copied 29 * to REALMODE_BASE. Absolute symbols are not used because those symbols are 30 * relocated by U-Boot. 31 */ 32 extern unsigned char asm_realmode_call, __realmode_interrupt; 33 extern unsigned char asm_realmode_buffer; 34 35 #define DOWNTO8(A) \ 36 union { \ 37 struct { \ 38 union { \ 39 struct { \ 40 uint8_t A##l; \ 41 uint8_t A##h; \ 42 } __packed; \ 43 uint16_t A##x; \ 44 } __packed; \ 45 uint16_t h##A##x; \ 46 } __packed; \ 47 uint32_t e##A##x; \ 48 } __packed; 49 50 #define DOWNTO16(A) \ 51 union { \ 52 struct { \ 53 uint16_t A; \ 54 uint16_t h##A; \ 55 } __packed; \ 56 uint32_t e##A; \ 57 } __packed; 58 59 struct eregs { 60 DOWNTO8(a); 61 DOWNTO8(c); 62 DOWNTO8(d); 63 DOWNTO8(b); 64 DOWNTO16(sp); 65 DOWNTO16(bp); 66 DOWNTO16(si); 67 DOWNTO16(di); 68 uint32_t vector; 69 uint32_t error_code; 70 uint32_t eip; 71 uint32_t cs; 72 uint32_t eflags; 73 }; 74 75 struct realmode_idt { 76 u16 offset, cs; 77 }; 78 79 void x86_exception(struct eregs *info); 80 81 /* From x86_asm.S */ 82 extern unsigned char __idt_handler; 83 extern unsigned int __idt_handler_size; 84 extern unsigned char asm_realmode_code; 85 extern unsigned int asm_realmode_code_size; 86 87 asmlinkage void (*realmode_call)(u32 addr, u32 eax, u32 ebx, u32 ecx, u32 edx, 88 u32 esi, u32 edi); 89 90 asmlinkage void (*realmode_interrupt)(u32 intno, u32 eax, u32 ebx, u32 ecx, 91 u32 edx, u32 esi, u32 edi); 92 93 int int10_handler(void); 94 int int12_handler(void); 95 int int16_handler(void); 96 int int1a_handler(void); 97 #endif /*__ASSEMBLY__ */ 98 99 #endif 100