Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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 */