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