1*83d290c5STom Rini /* SPDX-License-Identifier: GPL-2.0 */ 20ca2426bSSimon Glass /* 30ca2426bSSimon Glass * From Coreboot file device/oprom/realmode/x86.h 40ca2426bSSimon Glass * 50ca2426bSSimon Glass * Copyright (C) 2007 Advanced Micro Devices, Inc. 60ca2426bSSimon Glass * Copyright (C) 2009-2010 coresystems GmbH 70ca2426bSSimon Glass */ 80ca2426bSSimon Glass 90ca2426bSSimon Glass #ifndef _X86_LIB_BIOS_H 100ca2426bSSimon Glass #define _X86_LIB_BIOS_H 110ca2426bSSimon Glass 12e6126a58SMasahiro Yamada #include <linux/linkage.h> 13e6126a58SMasahiro Yamada 140ca2426bSSimon Glass #define REALMODE_BASE 0x600 150ca2426bSSimon Glass 160ca2426bSSimon Glass #ifdef __ASSEMBLY__ 170ca2426bSSimon Glass 180ca2426bSSimon Glass #define PTR_TO_REAL_MODE(x) (x - asm_realmode_code + REALMODE_BASE) 190ca2426bSSimon Glass 200ca2426bSSimon Glass #else 210ca2426bSSimon Glass 220ca2426bSSimon Glass /* Convert a symbol address to our real mode area */ 230ca2426bSSimon Glass #define PTR_TO_REAL_MODE(sym)\ 240ca2426bSSimon Glass (void *)(REALMODE_BASE + ((char *)&(sym) - (char *)&asm_realmode_code)) 250ca2426bSSimon Glass 260ca2426bSSimon Glass /* 270ca2426bSSimon Glass * The following symbols cannot be used directly. They need to be fixed up 280ca2426bSSimon Glass * to point to the correct address location after the code has been copied 290ca2426bSSimon Glass * to REALMODE_BASE. Absolute symbols are not used because those symbols are 300ca2426bSSimon Glass * relocated by U-Boot. 310ca2426bSSimon Glass */ 320ca2426bSSimon Glass extern unsigned char asm_realmode_call, __realmode_interrupt; 330ca2426bSSimon Glass extern unsigned char asm_realmode_buffer; 340ca2426bSSimon Glass 350ca2426bSSimon Glass #define DOWNTO8(A) \ 360ca2426bSSimon Glass union { \ 370ca2426bSSimon Glass struct { \ 380ca2426bSSimon Glass union { \ 390ca2426bSSimon Glass struct { \ 400ca2426bSSimon Glass uint8_t A##l; \ 410ca2426bSSimon Glass uint8_t A##h; \ 420ca2426bSSimon Glass } __packed; \ 430ca2426bSSimon Glass uint16_t A##x; \ 440ca2426bSSimon Glass } __packed; \ 450ca2426bSSimon Glass uint16_t h##A##x; \ 460ca2426bSSimon Glass } __packed; \ 470ca2426bSSimon Glass uint32_t e##A##x; \ 480ca2426bSSimon Glass } __packed; 490ca2426bSSimon Glass 500ca2426bSSimon Glass #define DOWNTO16(A) \ 510ca2426bSSimon Glass union { \ 520ca2426bSSimon Glass struct { \ 530ca2426bSSimon Glass uint16_t A; \ 540ca2426bSSimon Glass uint16_t h##A; \ 550ca2426bSSimon Glass } __packed; \ 560ca2426bSSimon Glass uint32_t e##A; \ 570ca2426bSSimon Glass } __packed; 580ca2426bSSimon Glass 590ca2426bSSimon Glass struct eregs { 600ca2426bSSimon Glass DOWNTO8(a); 610ca2426bSSimon Glass DOWNTO8(c); 620ca2426bSSimon Glass DOWNTO8(d); 630ca2426bSSimon Glass DOWNTO8(b); 640ca2426bSSimon Glass DOWNTO16(sp); 650ca2426bSSimon Glass DOWNTO16(bp); 660ca2426bSSimon Glass DOWNTO16(si); 670ca2426bSSimon Glass DOWNTO16(di); 680ca2426bSSimon Glass uint32_t vector; 690ca2426bSSimon Glass uint32_t error_code; 700ca2426bSSimon Glass uint32_t eip; 710ca2426bSSimon Glass uint32_t cs; 720ca2426bSSimon Glass uint32_t eflags; 730ca2426bSSimon Glass }; 740ca2426bSSimon Glass 750ca2426bSSimon Glass struct realmode_idt { 760ca2426bSSimon Glass u16 offset, cs; 770ca2426bSSimon Glass }; 780ca2426bSSimon Glass 790ca2426bSSimon Glass void x86_exception(struct eregs *info); 800ca2426bSSimon Glass 810ca2426bSSimon Glass /* From x86_asm.S */ 820ca2426bSSimon Glass extern unsigned char __idt_handler; 830ca2426bSSimon Glass extern unsigned int __idt_handler_size; 840ca2426bSSimon Glass extern unsigned char asm_realmode_code; 850ca2426bSSimon Glass extern unsigned int asm_realmode_code_size; 860ca2426bSSimon Glass 870ca2426bSSimon Glass asmlinkage void (*realmode_call)(u32 addr, u32 eax, u32 ebx, u32 ecx, u32 edx, 880ca2426bSSimon Glass u32 esi, u32 edi); 890ca2426bSSimon Glass 900ca2426bSSimon Glass asmlinkage void (*realmode_interrupt)(u32 intno, u32 eax, u32 ebx, u32 ecx, 910ca2426bSSimon Glass u32 edx, u32 esi, u32 edi); 920ca2426bSSimon Glass 930ca2426bSSimon Glass int int10_handler(void); 940ca2426bSSimon Glass int int12_handler(void); 950ca2426bSSimon Glass int int16_handler(void); 960ca2426bSSimon Glass int int1a_handler(void); 970ca2426bSSimon Glass #endif /*__ASSEMBLY__ */ 980ca2426bSSimon Glass 990ca2426bSSimon Glass #endif 100