^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /* -*- linux-c -*- ------------------------------------------------------- *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (C) 1991, 1992 Linus Torvalds
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright 2007 rPath, Inc. - All Rights Reserved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright 2009 Intel Corporation; author H. Peter Anvin
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * ----------------------------------------------------------------------- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * Header file for the real-mode kernel code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #ifndef BOOT_BOOT_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #define BOOT_BOOT_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #define STACK_SIZE 1024 /* Minimum number of bytes for stack */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #ifndef __ASSEMBLY__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <stdarg.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <linux/edd.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <asm/setup.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <asm/asm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include "bitops.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include "ctype.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include "cpuflags.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) /* Useful macros */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define ARRAY_SIZE(x) (sizeof(x) / sizeof(*(x)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) extern struct setup_header hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) extern struct boot_params boot_params;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define cpu_relax() asm volatile("rep; nop")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) /* Basic port I/O */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) static inline void outb(u8 v, u16 port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) asm volatile("outb %0,%1" : : "a" (v), "dN" (port));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) static inline u8 inb(u16 port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) u8 v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) asm volatile("inb %1,%0" : "=a" (v) : "dN" (port));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) return v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) static inline void outw(u16 v, u16 port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) asm volatile("outw %0,%1" : : "a" (v), "dN" (port));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) static inline u16 inw(u16 port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) u16 v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) asm volatile("inw %1,%0" : "=a" (v) : "dN" (port));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) return v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) static inline void outl(u32 v, u16 port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) asm volatile("outl %0,%1" : : "a" (v), "dN" (port));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) static inline u32 inl(u16 port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) u32 v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) asm volatile("inl %1,%0" : "=a" (v) : "dN" (port));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) return v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) static inline void io_delay(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) const u16 DELAY_PORT = 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) asm volatile("outb %%al,%0" : : "dN" (DELAY_PORT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) /* These functions are used to reference data in other segments. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) static inline u16 ds(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) u16 seg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) asm("movw %%ds,%0" : "=rm" (seg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) return seg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) static inline void set_fs(u16 seg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) asm volatile("movw %0,%%fs" : : "rm" (seg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) static inline u16 fs(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) u16 seg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) asm volatile("movw %%fs,%0" : "=rm" (seg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) return seg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) static inline void set_gs(u16 seg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) asm volatile("movw %0,%%gs" : : "rm" (seg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) static inline u16 gs(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) u16 seg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) asm volatile("movw %%gs,%0" : "=rm" (seg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) return seg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) typedef unsigned int addr_t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) static inline u8 rdfs8(addr_t addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) u8 v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) asm volatile("movb %%fs:%1,%0" : "=q" (v) : "m" (*(u8 *)addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) return v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) static inline u16 rdfs16(addr_t addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) u16 v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) asm volatile("movw %%fs:%1,%0" : "=r" (v) : "m" (*(u16 *)addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) return v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) static inline u32 rdfs32(addr_t addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) u32 v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) asm volatile("movl %%fs:%1,%0" : "=r" (v) : "m" (*(u32 *)addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) return v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) static inline void wrfs8(u8 v, addr_t addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) asm volatile("movb %1,%%fs:%0" : "+m" (*(u8 *)addr) : "qi" (v));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) static inline void wrfs16(u16 v, addr_t addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) asm volatile("movw %1,%%fs:%0" : "+m" (*(u16 *)addr) : "ri" (v));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) static inline void wrfs32(u32 v, addr_t addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) asm volatile("movl %1,%%fs:%0" : "+m" (*(u32 *)addr) : "ri" (v));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) static inline u8 rdgs8(addr_t addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) u8 v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) asm volatile("movb %%gs:%1,%0" : "=q" (v) : "m" (*(u8 *)addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) return v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) static inline u16 rdgs16(addr_t addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) u16 v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) asm volatile("movw %%gs:%1,%0" : "=r" (v) : "m" (*(u16 *)addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) return v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) static inline u32 rdgs32(addr_t addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) u32 v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) asm volatile("movl %%gs:%1,%0" : "=r" (v) : "m" (*(u32 *)addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) return v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) static inline void wrgs8(u8 v, addr_t addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) asm volatile("movb %1,%%gs:%0" : "+m" (*(u8 *)addr) : "qi" (v));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) static inline void wrgs16(u16 v, addr_t addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) asm volatile("movw %1,%%gs:%0" : "+m" (*(u16 *)addr) : "ri" (v));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) static inline void wrgs32(u32 v, addr_t addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) asm volatile("movl %1,%%gs:%0" : "+m" (*(u32 *)addr) : "ri" (v));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) /* Note: these only return true/false, not a signed return value! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) static inline bool memcmp_fs(const void *s1, addr_t s2, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) bool diff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) asm volatile("fs; repe; cmpsb" CC_SET(nz)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) : CC_OUT(nz) (diff), "+D" (s1), "+S" (s2), "+c" (len));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) return diff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) static inline bool memcmp_gs(const void *s1, addr_t s2, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) bool diff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) asm volatile("gs; repe; cmpsb" CC_SET(nz)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) : CC_OUT(nz) (diff), "+D" (s1), "+S" (s2), "+c" (len));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) return diff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) /* Heap -- available for dynamic lists. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) extern char _end[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) extern char *HEAP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) extern char *heap_end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) #define RESET_HEAP() ((void *)( HEAP = _end ))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) static inline char *__get_heap(size_t s, size_t a, size_t n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) char *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) HEAP = (char *)(((size_t)HEAP+(a-1)) & ~(a-1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) tmp = HEAP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) HEAP += s*n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) return tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) #define GET_HEAP(type, n) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) ((type *)__get_heap(sizeof(type),__alignof__(type),(n)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) static inline bool heap_free(size_t n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) return (int)(heap_end-HEAP) >= (int)n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) /* copy.S */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) void copy_to_fs(addr_t dst, void *src, size_t len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) void *copy_from_fs(void *dst, addr_t src, size_t len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) void copy_to_gs(addr_t dst, void *src, size_t len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) void *copy_from_gs(void *dst, addr_t src, size_t len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) /* a20.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) int enable_a20(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) /* apm.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) int query_apm_bios(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) /* bioscall.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) struct biosregs {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) u32 edi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) u32 esi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) u32 ebp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) u32 _esp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) u32 ebx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) u32 edx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) u32 ecx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) u32 eax;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) u32 _fsgs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) u32 _dses;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) u32 eflags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) u16 di, hdi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) u16 si, hsi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) u16 bp, hbp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) u16 _sp, _hsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) u16 bx, hbx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) u16 dx, hdx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) u16 cx, hcx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) u16 ax, hax;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) u16 gs, fs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) u16 es, ds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) u16 flags, hflags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) u8 dil, dih, edi2, edi3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) u8 sil, sih, esi2, esi3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) u8 bpl, bph, ebp2, ebp3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) u8 _spl, _sph, _esp2, _esp3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) u8 bl, bh, ebx2, ebx3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) u8 dl, dh, edx2, edx3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) u8 cl, ch, ecx2, ecx3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) u8 al, ah, eax2, eax3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) void intcall(u8 int_no, const struct biosregs *ireg, struct biosregs *oreg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) /* cmdline.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) int __cmdline_find_option(unsigned long cmdline_ptr, const char *option, char *buffer, int bufsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) int __cmdline_find_option_bool(unsigned long cmdline_ptr, const char *option);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) static inline int cmdline_find_option(const char *option, char *buffer, int bufsize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) unsigned long cmd_line_ptr = boot_params.hdr.cmd_line_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) if (cmd_line_ptr >= 0x100000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) return -1; /* inaccessible */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) return __cmdline_find_option(cmd_line_ptr, option, buffer, bufsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) static inline int cmdline_find_option_bool(const char *option)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) unsigned long cmd_line_ptr = boot_params.hdr.cmd_line_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) if (cmd_line_ptr >= 0x100000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) return -1; /* inaccessible */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) return __cmdline_find_option_bool(cmd_line_ptr, option);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) /* cpu.c, cpucheck.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) int check_cpu(int *cpu_level_ptr, int *req_level_ptr, u32 **err_flags_ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) int check_knl_erratum(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) int validate_cpu(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) /* early_serial_console.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) extern int early_serial_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) void console_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) /* edd.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) void query_edd(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) /* header.S */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) void __attribute__((noreturn)) die(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) /* memory.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) void detect_memory(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) /* pm.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) void __attribute__((noreturn)) go_to_protected_mode(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) /* pmjump.S */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) void __attribute__((noreturn))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) protected_mode_jump(u32 entrypoint, u32 bootparams);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) /* printf.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) int sprintf(char *buf, const char *fmt, ...);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) int vsprintf(char *buf, const char *fmt, va_list args);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) int printf(const char *fmt, ...);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) /* regs.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) void initregs(struct biosregs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) /* string.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) int strcmp(const char *str1, const char *str2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) int strncmp(const char *cs, const char *ct, size_t count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) size_t strnlen(const char *s, size_t maxlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) unsigned int atou(const char *s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) size_t strlen(const char *s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) char *strchr(const char *s, int c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) /* tty.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) void puts(const char *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) void putchar(int);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) int getchar(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) void kbd_flush(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) int getchar_timeout(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) /* video.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) void set_video(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) /* video-mode.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) int set_mode(u16 mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) int mode_defined(u16 mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) void probe_cards(int unsafe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) /* video-vesa.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) void vesa_store_edid(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) #endif /* __ASSEMBLY__ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) #endif /* BOOT_BOOT_H */