mirror of
https://github.com/ipxe/ipxe
synced 2026-02-08 13:52:13 +03:00
Initial revision
This commit is contained in:
1
src/include/.cvsignore
Normal file
1
src/include/.cvsignore
Normal file
@@ -0,0 +1 @@
|
||||
.buildserial.h
|
||||
17
src/include/big_bswap.h
Normal file
17
src/include/big_bswap.h
Normal file
@@ -0,0 +1,17 @@
|
||||
#ifndef ETHERBOOT_BIG_BSWAP_H
|
||||
#define ETHERBOOT_BIG_BSWAP_H
|
||||
|
||||
#define ntohl(x) (x)
|
||||
#define htonl(x) (x)
|
||||
#define ntohs(x) (x)
|
||||
#define htons(x) (x)
|
||||
#define cpu_to_le32(x) __bswap_32(x)
|
||||
#define cpu_to_le16(x) __bswap_16(x)
|
||||
#define cpu_to_be32(x) (x)
|
||||
#define cpu_to_be16(x) (x)
|
||||
#define le32_to_cpu(x) __bswap_32(x)
|
||||
#define le16_to_cpu(x) __bswap_16(x)
|
||||
#define be32_to_cpu(x) (x)
|
||||
#define be16_to_cpu(x) (x)
|
||||
|
||||
#endif /* ETHERBOOT_BIG_BSWAP_H */
|
||||
230
src/include/bootp.h
Normal file
230
src/include/bootp.h
Normal file
@@ -0,0 +1,230 @@
|
||||
#ifndef _BOOTP_H
|
||||
#define _BOOTP_H
|
||||
|
||||
#ifdef ALTERNATE_DHCP_PORTS_1067_1068
|
||||
#undef NON_STANDARD_BOOTP_SERVER
|
||||
#define NON_STANDARD_BOOTP_SERVER 1067
|
||||
#undef NON_STANDARD_BOOTP_CLIENT
|
||||
#define NON_STANDARD_BOOTP_CLIENT 1068
|
||||
#endif
|
||||
|
||||
#ifdef NON_STANDARD_BOOTP_SERVER
|
||||
#define BOOTP_SERVER NON_STANDARD_BOOTP_SERVER
|
||||
#else
|
||||
#define BOOTP_SERVER 67
|
||||
#endif
|
||||
#ifdef NON_STANDARD_BOOTP_CLIENT
|
||||
#define BOOTP_CLIENT NON_STANDARD_BOOTP_CLIENT
|
||||
#else
|
||||
#define BOOTP_CLIENT 68
|
||||
#endif
|
||||
#define PROXYDHCP_SERVER 4011 /* For PXE */
|
||||
|
||||
#define BOOTP_REQUEST 1
|
||||
#define BOOTP_REPLY 2
|
||||
|
||||
#define TAG_LEN(p) (*((p)+1))
|
||||
#define RFC1533_COOKIE 99, 130, 83, 99
|
||||
#define RFC1533_PAD 0
|
||||
#define RFC1533_NETMASK 1
|
||||
#define RFC1533_TIMEOFFSET 2
|
||||
#define RFC1533_GATEWAY 3
|
||||
#define RFC1533_TIMESERVER 4
|
||||
#define RFC1533_IEN116NS 5
|
||||
#define RFC1533_DNS 6
|
||||
#define RFC1533_LOGSERVER 7
|
||||
#define RFC1533_COOKIESERVER 8
|
||||
#define RFC1533_LPRSERVER 9
|
||||
#define RFC1533_IMPRESSSERVER 10
|
||||
#define RFC1533_RESOURCESERVER 11
|
||||
#define RFC1533_HOSTNAME 12
|
||||
#define RFC1533_BOOTFILESIZE 13
|
||||
#define RFC1533_MERITDUMPFILE 14
|
||||
#define RFC1533_DOMAINNAME 15
|
||||
#define RFC1533_SWAPSERVER 16
|
||||
#define RFC1533_ROOTPATH 17
|
||||
#define RFC1533_EXTENSIONPATH 18
|
||||
#define RFC1533_IPFORWARDING 19
|
||||
#define RFC1533_IPSOURCEROUTING 20
|
||||
#define RFC1533_IPPOLICYFILTER 21
|
||||
#define RFC1533_IPMAXREASSEMBLY 22
|
||||
#define RFC1533_IPTTL 23
|
||||
#define RFC1533_IPMTU 24
|
||||
#define RFC1533_IPMTUPLATEAU 25
|
||||
#define RFC1533_INTMTU 26
|
||||
#define RFC1533_INTLOCALSUBNETS 27
|
||||
#define RFC1533_INTBROADCAST 28
|
||||
#define RFC1533_INTICMPDISCOVER 29
|
||||
#define RFC1533_INTICMPRESPOND 30
|
||||
#define RFC1533_INTROUTEDISCOVER 31
|
||||
#define RFC1533_INTROUTESOLICIT 32
|
||||
#define RFC1533_INTSTATICROUTES 33
|
||||
#define RFC1533_LLTRAILERENCAP 34
|
||||
#define RFC1533_LLARPCACHETMO 35
|
||||
#define RFC1533_LLETHERNETENCAP 36
|
||||
#define RFC1533_TCPTTL 37
|
||||
#define RFC1533_TCPKEEPALIVETMO 38
|
||||
#define RFC1533_TCPKEEPALIVEGB 39
|
||||
#define RFC1533_NISDOMAIN 40
|
||||
#define RFC1533_NISSERVER 41
|
||||
#define RFC1533_NTPSERVER 42
|
||||
#define RFC1533_VENDOR 43
|
||||
#define RFC1533_NBNS 44
|
||||
#define RFC1533_NBDD 45
|
||||
#define RFC1533_NBNT 46
|
||||
#define RFC1533_NBSCOPE 47
|
||||
#define RFC1533_XFS 48
|
||||
#define RFC1533_XDM 49
|
||||
#ifndef NO_DHCP_SUPPORT
|
||||
#define RFC2132_REQ_ADDR 50
|
||||
#define RFC2132_MSG_TYPE 53
|
||||
#define RFC2132_SRV_ID 54
|
||||
#define RFC2132_PARAM_LIST 55
|
||||
#define RFC2132_MAX_SIZE 57
|
||||
#define RFC2132_VENDOR_CLASS_ID 60
|
||||
#define RFC2132_CLIENT_ID 61
|
||||
#define RFC2132_TFTP_SERVER_NAME 66
|
||||
#define RFC2132_BOOTFILE_NAME 67
|
||||
#define RFC3004_USER_CLASS 77
|
||||
|
||||
#ifdef PXE_DHCP_STRICT
|
||||
/*
|
||||
* The following options are acknowledged in RFC3679 because they are
|
||||
* widely used by PXE implementations, but have never been properly
|
||||
* allocated. Despite other PXE options being correctly packed in a
|
||||
* vendor encapsulated field, these are exposed. Sigh. Note that the
|
||||
* client UUID (option 97) is also noted in the PXE spec as using
|
||||
* option 61.
|
||||
*/
|
||||
#define RFC3679_PXE_CLIENT_ARCH 93
|
||||
#define RFC3679_PXE_CLIENT_NDI 94
|
||||
#define RFC3679_PXE_CLIENT_UUID 97
|
||||
|
||||
/* The lengths are fixed. */
|
||||
#define RFC3679_PXE_CLIENT_ARCH_LENGTH 2
|
||||
#define RFC3679_PXE_CLIENT_NDI_LENGTH 3
|
||||
#define RFC3679_PXE_CLIENT_UUID_LENGTH 17
|
||||
|
||||
/*
|
||||
* Values of RFC3679_PXE_CLIENT_ARCH can apparently be one of the
|
||||
* following, according to the PXE spec. The spec only actually
|
||||
* described the 2nd octet, not the first. Duh... assume 0.
|
||||
*/
|
||||
#define RFC3679_PXE_CLIENT_ARCH_IAX86PC 0,0
|
||||
#define RFC3679_PXE_CLIENT_ARCH_NECPC98 0,1
|
||||
#define RFC3679_PXE_CLIENT_ARCH_IA64PC 0,2
|
||||
#define RFC3679_PXE_CLIENT_ARCH_DECALPHA 0,3
|
||||
#define RFC3679_PXE_CLIENT_ARCH_ARCX86 0,4
|
||||
#define RFC3679_PXE_CLIENT_ARCH_INTELLEAN 0,5
|
||||
|
||||
/*
|
||||
* Only one valid value of NDI type (must be 1) and UNDI version (must
|
||||
* be 2.1)
|
||||
*/
|
||||
#define RFC3679_PXE_CLIENT_NDI_21 1,2,1
|
||||
|
||||
/*
|
||||
* UUID - type must be 1 and then 16 octets of UID, as with the client ID.
|
||||
* The value is a default for testing only
|
||||
*/
|
||||
#define RFC3679_PXE_CLIENT_UUID_TYPE 0
|
||||
#warning "UUID is a default for testing ONLY!"
|
||||
#define RFC3679_PXE_CLIENT_UUID_DEFAULT \
|
||||
RFC3679_PXE_CLIENT_UUID_TYPE, \
|
||||
0xDE,0xAD,0xBE,0xEF, \
|
||||
0xDE,0xAD,0xBE,0xEF, \
|
||||
0xDE,0xAD,0xBE,0xEF, \
|
||||
0xDE,0xAD,0xBE,0xEF
|
||||
/*
|
||||
* The Vendor Class ID. Note that the Arch and UNDI version numbers
|
||||
* are fixed and must be same as the ARCH and NDI above.
|
||||
*/
|
||||
#define RFC2132_VENDOR_CLASS_ID_PXE_LENGTH 32
|
||||
#define RFC2132_VENDOR_CLASS_ID_PXE \
|
||||
'P','X','E','C','l','i','e','n','t',':', \
|
||||
'A','r','c','h',':','0','0','0','0','0',':', \
|
||||
'U','N','D','I',':','0','0','2','0','0','1'
|
||||
|
||||
/*
|
||||
* The following vendor options are required in the PXE spec to pull
|
||||
* options for the *next* image. The PXE spec doesn't help us with
|
||||
* this (like explaining why).
|
||||
*/
|
||||
#define RFC1533_VENDOR_PXE_OPT128 128
|
||||
#define RFC1533_VENDOR_PXE_OPT129 129
|
||||
#define RFC1533_VENDOR_PXE_OPT130 130
|
||||
#define RFC1533_VENDOR_PXE_OPT131 131
|
||||
#define RFC1533_VENDOR_PXE_OPT132 132
|
||||
#define RFC1533_VENDOR_PXE_OPT133 133
|
||||
#define RFC1533_VENDOR_PXE_OPT134 134
|
||||
#define RFC1533_VENDOR_PXE_OPT135 135
|
||||
|
||||
#endif /* PXE_DHCP_STRICT */
|
||||
|
||||
#define DHCPDISCOVER 1
|
||||
#define DHCPOFFER 2
|
||||
#define DHCPREQUEST 3
|
||||
#define DHCPACK 5
|
||||
#endif /* NO_DHCP_SUPPORT */
|
||||
|
||||
#define RFC1533_VENDOR_MAJOR 0
|
||||
#define RFC1533_VENDOR_MINOR 0
|
||||
|
||||
#define RFC1533_VENDOR_MAGIC 128
|
||||
#define RFC1533_VENDOR_ADDPARM 129
|
||||
#define RFC1533_VENDOR_ETHDEV 130
|
||||
/* We should really apply for an official Etherboot encap option */
|
||||
#define RFC1533_VENDOR_ETHERBOOT_ENCAP 150
|
||||
/* I'll leave it to FREEBSD to decide if they want to renumber */
|
||||
#ifdef IMAGE_FREEBSD
|
||||
#define RFC1533_VENDOR_HOWTO 132
|
||||
#define RFC1533_VENDOR_KERNEL_ENV 133
|
||||
#endif
|
||||
#define RFC1533_VENDOR_NIC_DEV_ID 175
|
||||
#define RFC1533_VENDOR_ARCH 177
|
||||
|
||||
#define RFC1533_END 255
|
||||
|
||||
#define BOOTP_VENDOR_LEN 64
|
||||
#ifndef NO_DHCP_SUPPORT
|
||||
#define DHCP_OPT_LEN 312
|
||||
#endif /* NO_DHCP_SUPPORT */
|
||||
|
||||
/* Format of a bootp packet */
|
||||
struct bootp_t {
|
||||
uint8_t bp_op;
|
||||
uint8_t bp_htype;
|
||||
uint8_t bp_hlen;
|
||||
uint8_t bp_hops;
|
||||
uint32_t bp_xid;
|
||||
uint16_t bp_secs;
|
||||
uint16_t unused;
|
||||
in_addr bp_ciaddr;
|
||||
in_addr bp_yiaddr;
|
||||
in_addr bp_siaddr;
|
||||
in_addr bp_giaddr;
|
||||
uint8_t bp_hwaddr[16];
|
||||
uint8_t bp_sname[64];
|
||||
char bp_file[128];
|
||||
#ifdef NO_DHCP_SUPPORT
|
||||
uint8_t bp_vend[BOOTP_VENDOR_LEN];
|
||||
#else
|
||||
uint8_t bp_vend[DHCP_OPT_LEN];
|
||||
#endif /* NO_DHCP_SUPPORT */
|
||||
};
|
||||
|
||||
/* Format of a bootp IP packet */
|
||||
struct bootpip_t
|
||||
{
|
||||
struct iphdr ip;
|
||||
struct udphdr udp;
|
||||
struct bootp_t bp;
|
||||
};
|
||||
|
||||
/* Format of bootp packet with extensions */
|
||||
struct bootpd_t {
|
||||
struct bootp_t bootp_reply;
|
||||
uint8_t bootp_extension[MAX_BOOTP_EXTLEN];
|
||||
};
|
||||
|
||||
#endif /* _BOOTP_H */
|
||||
76
src/include/btext.h
Normal file
76
src/include/btext.h
Normal file
@@ -0,0 +1,76 @@
|
||||
/*
|
||||
* This file describes the structure passed from the BootX application
|
||||
* (for MacOS) when it is used to boot Linux.
|
||||
*
|
||||
* Written by Benjamin Herrenschmidt.
|
||||
*
|
||||
* Move to LinuxBIOS by LYH yhlu@tyan.com
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _BTEXT_H__
|
||||
#define _BTEXT_H__
|
||||
|
||||
#if 1
|
||||
#define u32 unsigned int
|
||||
#define u16 unsigned short
|
||||
#define u8 unsigned char
|
||||
#endif
|
||||
|
||||
/* Here are the boot informations that are passed to the bootstrap
|
||||
* Note that the kernel arguments and the device tree are appended
|
||||
* at the end of this structure. */
|
||||
typedef struct boot_infos
|
||||
{
|
||||
|
||||
/* NEW (vers. 2) this holds the current _logical_ base addr of
|
||||
the frame buffer (for use by early boot message) */
|
||||
u8* logicalDisplayBase;
|
||||
|
||||
|
||||
/* Some infos about the current MacOS display */
|
||||
u32 dispDeviceRect[4]; /* left,top,right,bottom */
|
||||
u32 dispDeviceDepth; /* (8, 16 or 32) */
|
||||
u8* dispDeviceBase; /* base address (physical) */
|
||||
u32 dispDeviceRowBytes; /* rowbytes (in bytes) */
|
||||
u32 dispDeviceColorsOffset; /* Colormap (8 bits only) or 0 (*) */
|
||||
|
||||
|
||||
/* The framebuffer size (optional, currently 0) */
|
||||
u32 frameBufferSize; /* Represents a max size, can be 0. */
|
||||
|
||||
|
||||
} boot_infos_t;
|
||||
|
||||
/* (*) The format of the colormap is 256 * 3 * 2 bytes. Each color index is represented
|
||||
* by 3 short words containing a 16 bits (unsigned) color component.
|
||||
* Later versions may contain the gamma table for direct-color devices here.
|
||||
*/
|
||||
#define BOOTX_COLORTABLE_SIZE (256UL*3UL*2UL)
|
||||
|
||||
|
||||
/*
|
||||
* Definitions for using the procedures in btext.c.
|
||||
*
|
||||
* Benjamin Herrenschmidt <benh@kernel.crashing.org>
|
||||
*/
|
||||
|
||||
extern void btext_clearscreen(void);
|
||||
|
||||
extern boot_infos_t disp_bi;
|
||||
extern u32 boot_text_mapped;
|
||||
|
||||
void btext_setup_display(u32 width, u32 height, u32 depth, u32 pitch,
|
||||
unsigned long address);
|
||||
void map_boot_text(void);
|
||||
|
||||
void btext_drawchar(char c);
|
||||
void btext_drawstring(const char *str);
|
||||
void btext_drawhex(u32 v);
|
||||
|
||||
void btext_putc(int c);
|
||||
|
||||
void btext_init(void);
|
||||
|
||||
#endif /* _BTEXT_H */
|
||||
20
src/include/byteswap.h
Normal file
20
src/include/byteswap.h
Normal file
@@ -0,0 +1,20 @@
|
||||
#ifndef ETHERBOOT_BYTESWAP_H
|
||||
#define ETHERBOOT_BYTESWAP_H
|
||||
|
||||
#include "endian.h"
|
||||
#include "bits/byteswap.h"
|
||||
|
||||
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
||||
#include "little_bswap.h"
|
||||
#endif
|
||||
#if __BYTE_ORDER == __BIG_ENDIAN
|
||||
#include "big_bswap.h"
|
||||
#endif
|
||||
|
||||
/* Make routines available to all */
|
||||
#define swap32(x) __bswap_32(x)
|
||||
#define swap16(x) __bswap_16(x)
|
||||
#define bswap_32(x) __bswap_32(x)
|
||||
#define bswap_16(x) __bswap_16(x)
|
||||
|
||||
#endif /* ETHERBOOT_BYTESWAP_H */
|
||||
45
src/include/callbacks.h
Normal file
45
src/include/callbacks.h
Normal file
@@ -0,0 +1,45 @@
|
||||
/* Callout/callback interface for Etherboot
|
||||
*
|
||||
* This file provides the mechanisms for making calls from Etherboot
|
||||
* to external programs and vice-versa.
|
||||
*
|
||||
* Initial version by Michael Brown <mbrown@fensystems.co.uk>, January 2004.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#ifndef CALLBACKS_H
|
||||
#define CALLBACKS_H
|
||||
|
||||
/* Opcodes and flags for in_call()
|
||||
*/
|
||||
#define EB_OPCODE(x) ( (x) & 0xffff )
|
||||
#define EB_OPCODE_MAIN (0x0000)
|
||||
#define EB_OPCODE_CHECK (0x6948) /* 'Hi' */
|
||||
#define EB_OPCODE_PXE (0x7850) /* 'Px' */
|
||||
#define EB_OPCODE_PXENV (0x7650) /* 'Pv' */
|
||||
#define EB_USE_INTERNAL_STACK ( 1 << 16 )
|
||||
#define EB_CALL_FROM_REAL_MODE ( 1 << 17 ) /* i386 only */
|
||||
#define EB_SKIP_OPCODE ( 1 << 18 )
|
||||
|
||||
/* Standard return codes
|
||||
*/
|
||||
#define EB_CHECK_RESULT (0x6f486948) /* 'HiHo' */
|
||||
|
||||
/* Include arch-specific callbacks bits
|
||||
*/
|
||||
#include "callbacks_arch.h"
|
||||
|
||||
/* Skip the definitions that won't make sense to the assembler */
|
||||
#ifndef ASSEMBLY
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
#ifndef in_call_data_t
|
||||
typedef struct {} empty_struct_t;
|
||||
#define in_call_data_t empty_struct_t
|
||||
#endif
|
||||
|
||||
#endif /* ASSEMBLY */
|
||||
|
||||
#endif /* CALLBACKS_H */
|
||||
73
src/include/coff.h
Normal file
73
src/include/coff.h
Normal file
@@ -0,0 +1,73 @@
|
||||
#ifndef COFF_H
|
||||
#define COFF_H
|
||||
/* Based on the elf.h file
|
||||
* Changed accordingly to support COFF file support
|
||||
*/
|
||||
|
||||
|
||||
/* Values for f_flags. */
|
||||
#define F_RELFLG 0x0001 /* If set, not reloc. info. Clear for executables */
|
||||
#define F_EXEC 0x0002 /* No unresolved symbols. Executable file ! */
|
||||
#define F_LNNO 0x0004 /* If set, line information numbers removed */
|
||||
#define F_LSYMS 0x0008 /* If set, local symbols removed */
|
||||
#define F_AR32WR 0x0100 /* Indicates little endian file */
|
||||
|
||||
/* Values for e_machine (architecute). */
|
||||
#define EM_E1 0x17a /* Magic number for Hyperstone. Big endian format */
|
||||
|
||||
/* Values for f_flags. */
|
||||
#define O_MAGIC 0x017c /* Optional's header magic number for Hyperstone */
|
||||
|
||||
/* Values for s_flags. */
|
||||
#define S_TYPE_TEXT 0x0020 /* If set, the section contains only executable */
|
||||
#define S_TYPE_DATA 0x0040 /* If set, the section contains only initialized data */
|
||||
#define S_TYPE_BSS 0x0080 /* If set, the section is BSS no data stored */
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned short f_magic; /* magic number */
|
||||
unsigned short f_nscns; /* number of sections */
|
||||
unsigned long f_timdat; /* time & date stamp */
|
||||
unsigned long f_symptr; /* file pointer to symtab */
|
||||
unsigned long f_nsyms; /* number of symtab entries */
|
||||
unsigned short f_opthdr; /* sizeof(optional hdr) */
|
||||
unsigned short f_flags; /* flags */
|
||||
}
|
||||
COFF_filehdr;
|
||||
|
||||
/*
|
||||
* Optional header.
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
unsigned short magic; /* type of file */
|
||||
unsigned short vstamp; /* version stamp */
|
||||
unsigned long tsize; /* text size in bytes, padded to FW bdry*/
|
||||
unsigned long dsize; /* initialized data " " */
|
||||
unsigned long bsize; /* uninitialized data " " */
|
||||
unsigned long entry; /* entry pt. */
|
||||
unsigned long text_start; /* base of text used for this file */
|
||||
unsigned long data_start; /* base of data used for this file */
|
||||
}
|
||||
COFF_opthdr;
|
||||
|
||||
/*
|
||||
* Section header.
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
char s_name[8]; /* section name */
|
||||
unsigned long s_paddr; /* physical address, aliased s_nlib */
|
||||
unsigned long s_vaddr; /* virtual address */
|
||||
unsigned long s_size; /* section size */
|
||||
unsigned long s_scnptr; /* file ptr to raw data for section */
|
||||
unsigned long s_relptr; /* file ptr to relocation */
|
||||
unsigned long s_lnnoptr; /* file ptr to line numbers */
|
||||
unsigned short s_nreloc; /* number of relocation entries */
|
||||
unsigned short s_nlnno; /* number of line number entries*/
|
||||
unsigned long s_flags; /* flags */
|
||||
}
|
||||
COFF_scnhdr;
|
||||
|
||||
#endif /* COFF_H */
|
||||
6
src/include/cpu.h
Normal file
6
src/include/cpu.h
Normal file
@@ -0,0 +1,6 @@
|
||||
#ifndef CPU_H
|
||||
#define CPU_H
|
||||
|
||||
#include "bits/cpu.h"
|
||||
|
||||
#endif /* CPU_H */
|
||||
28
src/include/debug.h
Normal file
28
src/include/debug.h
Normal file
@@ -0,0 +1,28 @@
|
||||
#ifndef DEBUG_H
|
||||
#define DEBUG_H
|
||||
|
||||
//#include <lib.h>
|
||||
extern int last_putchar;
|
||||
|
||||
/* Defining DEBUG_THIS before including this file enables debug() macro
|
||||
* for the file. DEBUG_ALL is for global control. */
|
||||
|
||||
#if DEBUG_THIS || DEBUG_ALL
|
||||
#define DEBUG 1
|
||||
#else
|
||||
#undef DEBUG
|
||||
#endif
|
||||
|
||||
#if DEBUG
|
||||
# define debug(...) \
|
||||
((last_putchar=='\n' ? printf("%s: ", __FUNCTION__) : 0), \
|
||||
printf(__VA_ARGS__))
|
||||
# define debug_hexdump hexdump
|
||||
#else
|
||||
# define debug(...) /* nothing */
|
||||
# define debug_hexdump(...) /* nothing */
|
||||
#endif
|
||||
|
||||
#define debugx debug
|
||||
|
||||
#endif /* DEBUG_H */
|
||||
126
src/include/dev.h
Normal file
126
src/include/dev.h
Normal file
@@ -0,0 +1,126 @@
|
||||
#ifndef DEV_H
|
||||
#define DEV_H
|
||||
|
||||
#include "isa.h"
|
||||
#include "pci.h"
|
||||
|
||||
/* Need to check the packing of this struct if Etherboot is ported */
|
||||
struct dev_id
|
||||
{
|
||||
unsigned short vendor_id;
|
||||
unsigned short device_id;
|
||||
unsigned char bus_type;
|
||||
#define PCI_BUS_TYPE 1
|
||||
#define ISA_BUS_TYPE 2
|
||||
};
|
||||
|
||||
/* Dont use sizeof, that will include the padding */
|
||||
#define DEV_ID_SIZE 8
|
||||
|
||||
|
||||
struct pci_probe_state
|
||||
{
|
||||
#ifdef CONFIG_PCI
|
||||
struct pci_device dev;
|
||||
int advance;
|
||||
#else
|
||||
int dummy;
|
||||
#endif
|
||||
};
|
||||
struct isa_probe_state
|
||||
{
|
||||
#ifdef CONFIG_ISA
|
||||
const struct isa_driver *driver;
|
||||
int advance;
|
||||
#else
|
||||
int dummy;
|
||||
#endif
|
||||
};
|
||||
|
||||
union probe_state
|
||||
{
|
||||
struct pci_probe_state pci;
|
||||
struct isa_probe_state isa;
|
||||
};
|
||||
|
||||
struct dev
|
||||
{
|
||||
void (*disable)P((struct dev *));
|
||||
struct dev_id devid; /* device ID string (sent to DHCP server) */
|
||||
int index; /* Index of next device on this controller to probe */
|
||||
int type; /* Type of device I am probing for */
|
||||
int how_probe; /* First, next or awake */
|
||||
int to_probe; /* Flavor of device I am probing */
|
||||
int failsafe; /* Failsafe probe requested */
|
||||
int type_index; /* Index of this device (within type) */
|
||||
#define PROBE_NONE 0
|
||||
#define PROBE_PCI 1
|
||||
#define PROBE_ISA 2
|
||||
union probe_state state;
|
||||
};
|
||||
|
||||
|
||||
#define NIC_DRIVER 0
|
||||
#define DISK_DRIVER 1
|
||||
#define FLOPPY_DRIVER 2
|
||||
|
||||
#define BRIDGE_DRIVER 1000
|
||||
|
||||
#define PROBE_FIRST (-1)
|
||||
#define PROBE_NEXT 0
|
||||
#define PROBE_AWAKE 1 /* After calling disable bring up the same device */
|
||||
|
||||
/* The probe result codes are selected
|
||||
* to allow them to be fed back into the probe
|
||||
* routine and get a successful probe.
|
||||
*/
|
||||
#define PROBE_FAILED PROBE_FIRST
|
||||
#define PROBE_WORKED PROBE_NEXT
|
||||
|
||||
extern int probe(struct dev *dev);
|
||||
extern void disable(struct dev *dev);
|
||||
|
||||
/* Boot option values
|
||||
* option & BOOT_TYPE_MASK should equal a driver for probing
|
||||
*/
|
||||
|
||||
#define BOOT_NIC 0x0 /* Boot from a nic */
|
||||
#define BOOT_DISK 0x1 /* Boot from disk */
|
||||
#define BOOT_FLOPPY 0x2 /* Boot from a floppy */
|
||||
|
||||
#define BOOT_NOTHING 0x3 /* Last valid boot choice */
|
||||
|
||||
/* Do magic failsafe boot processing */
|
||||
#define BOOT_FAILSAFE 0x8
|
||||
|
||||
#define BOOT_BITS 4
|
||||
#define BOOT_MASK ((1 << (BOOT_BITS)) - 1)
|
||||
#define BOOT_TYPE_MASK ((1 << (BOOT_BITS - 1)) - 1)
|
||||
|
||||
#define MAX_BOOT_ENTRIES 3
|
||||
|
||||
#define BOOT_ALL_VALUE (1<<BOOT_FIRST|1<<BOOT_SECOND|1<<BOOT_THIRD)
|
||||
|
||||
/* These could be customised for different languages perhaps */
|
||||
#if BOOT_ALL_VALUE&(1<<BOOT_DISK)
|
||||
#define BOOT_DISK_PROMPT "(D)isk "
|
||||
#else
|
||||
#define BOOT_DISK_PROMPT
|
||||
#endif
|
||||
|
||||
#if BOOT_ALL_VALUE&(1<<BOOT_FLOPPY)
|
||||
#define BOOT_FLOPPY_PROMPT "(F)loppy "
|
||||
#else
|
||||
#define BOOT_FLOPPY_PROMPT
|
||||
#endif
|
||||
|
||||
#define ASK_PROMPT \
|
||||
"Boot from (N)etwork " BOOT_DISK_PROMPT BOOT_FLOPPY_PROMPT "or (Q)uit? "
|
||||
|
||||
#define ANS_NETWORK 'N'
|
||||
#define ANS_DISK 'D'
|
||||
#define ANS_FLOPPY 'F'
|
||||
#define ANS_QUIT 'Q'
|
||||
#define ANS_DEFAULT '\n'
|
||||
|
||||
#endif /* DEV_H */
|
||||
53
src/include/disk.h
Normal file
53
src/include/disk.h
Normal file
@@ -0,0 +1,53 @@
|
||||
#ifndef DISK_H
|
||||
#define DISK_H
|
||||
|
||||
#include "dev.h"
|
||||
|
||||
/*
|
||||
* Structure returned from disk_probe and passed to other driver
|
||||
* functions.
|
||||
*/
|
||||
struct disk
|
||||
{
|
||||
struct dev dev; /* This must come first */
|
||||
int (*read)(struct disk *, sector_t sector);
|
||||
unsigned int drive;
|
||||
unsigned long hw_sector_size; /* The hardware sector size for dealing
|
||||
* with partition tables and the like.
|
||||
* Must be >= 512
|
||||
*/
|
||||
unsigned int sectors_per_read; /* The number of 512 byte sectors
|
||||
* returned by each read call.
|
||||
* All I/O must be aligned to this size.
|
||||
*/
|
||||
unsigned int bytes; /* The number of bytes in the read buffer. */
|
||||
sector_t sectors; /* The number of sectors on the drive. */
|
||||
sector_t sector; /* The first sector in the driver buffer */
|
||||
unsigned char *buffer; /* The data read from the drive */
|
||||
void *priv; /* driver can hang private data here */
|
||||
|
||||
unsigned long disk_offset;
|
||||
int direction;
|
||||
};
|
||||
|
||||
extern struct disk disk;
|
||||
extern int url_file(const char *name,
|
||||
int (*fnc)(unsigned char *, unsigned int, unsigned int, int));
|
||||
|
||||
extern int disk_probe(struct dev *dev);
|
||||
extern int disk_load_configuration(struct dev *dev);
|
||||
extern int disk_load(struct dev *dev);
|
||||
extern void disk_disable(void);
|
||||
|
||||
|
||||
#ifndef DOWNLOAD_PROTO_DISK
|
||||
#define disk_disable() do { } while(0)
|
||||
#endif
|
||||
|
||||
#define SECTOR_SIZE 512
|
||||
#define SECTOR_SHIFT 9
|
||||
|
||||
/* Maximum block_size that may be set. */
|
||||
#define DISK_BUFFER_SIZE (18 * SECTOR_SIZE)
|
||||
|
||||
#endif /* DISK_H */
|
||||
58
src/include/dns_resolver.h
Normal file
58
src/include/dns_resolver.h
Normal file
@@ -0,0 +1,58 @@
|
||||
// dns_resolver.h - #define statements for the DNS resolver
|
||||
|
||||
// We only need A and CNAME queries (later possibly AAAA/A6?)
|
||||
#define QUERYTYPE_A 1
|
||||
#define QUERYTYPE_CNAME 5
|
||||
|
||||
// We only query with INTERNET class (not CHAOS or whatever)
|
||||
#define QUERYCLASS_INET 1
|
||||
|
||||
// Our first query will have the identifier <1> (arbitrary -
|
||||
// remember however that (256 - QUERYIDENTIFIER)/2 > MAX_CNAME_RECURSION !!!
|
||||
#define QUERYIDENTIFIER 1
|
||||
|
||||
// Query flags are standard values here
|
||||
#define QUERYFLAGS 0x0100
|
||||
#define QUERYFLAGS_MASK 0xf8
|
||||
#define QUERYFLAGS_WANT 0x80
|
||||
|
||||
// Indices inside the byte array that holds DNS queries/answers
|
||||
#define QINDEX_ID 0
|
||||
#define QINDEX_FLAGS 2
|
||||
#define QINDEX_NUMQUEST 4
|
||||
#define QINDEX_NUMANSW 6
|
||||
#define QINDEX_NUMAUTH 8
|
||||
#define QINDEX_NUMADDIT 10
|
||||
#define QINDEX_QUESTION 12
|
||||
#define QINDEX_QTYPE 14
|
||||
#define QINDEX_QCLASS 16
|
||||
#define QINDEX_STORE_A 256
|
||||
|
||||
// Constant UDP port number for DNS traffic
|
||||
#define UDP_PORT_DNS 53
|
||||
|
||||
// Return values that the package parser may give
|
||||
// This packet was not for us (broadcast or whatever)
|
||||
#define RET_PACK_GARBAG 0
|
||||
// Retrieved an address - query finishes
|
||||
#define RET_GOT_ADDR 1
|
||||
// No A record for that hostname - try running a CNAME query
|
||||
#define RET_RUN_CNAME_Q 2
|
||||
// The CNAME query returned a valid hostname - run A query on that
|
||||
#define RET_RUN_NEXT_A 3
|
||||
// The CNAME query failed - stop resolving
|
||||
#define RET_CNAME_FAIL 4
|
||||
// We have a reliable input that claims that the hostname does not exist
|
||||
#define RET_NOSUCHNAME 5
|
||||
// The name server response is somehow bogus/can not be parsed -> Abort
|
||||
#define RET_DNSERROR 6
|
||||
|
||||
// Return values that the query engine may give
|
||||
// DNS query succeeded, IP address delivered
|
||||
#define RET_DNS_OK 0
|
||||
// DNS query failed
|
||||
#define RET_DNS_FAIL 1
|
||||
|
||||
// Error codes the DNS server can send to us
|
||||
#define ERR_NOSUCHNAME 3
|
||||
|
||||
234
src/include/elf.h
Normal file
234
src/include/elf.h
Normal file
@@ -0,0 +1,234 @@
|
||||
#ifndef ELF_H
|
||||
#define ELF_H
|
||||
|
||||
#define EI_NIDENT 16 /* Size of e_ident array. */
|
||||
|
||||
/* Values for e_type. */
|
||||
#define ET_NONE 0 /* No file type */
|
||||
#define ET_REL 1 /* Relocatable file */
|
||||
#define ET_EXEC 2 /* Executable file */
|
||||
#define ET_DYN 3 /* Shared object file */
|
||||
#define ET_CORE 4 /* Core file */
|
||||
|
||||
/* Values for e_machine (architecute). */
|
||||
#define EM_NONE 0 /* No machine */
|
||||
#define EM_M32 1 /* AT&T WE 32100 */
|
||||
#define EM_SPARC 2 /* SUN SPARC */
|
||||
#define EM_386 3 /* Intel 80386+ */
|
||||
#define EM_68K 4 /* Motorola m68k family */
|
||||
#define EM_88K 5 /* Motorola m88k family */
|
||||
#define EM_486 6 /* Perhaps disused */
|
||||
#define EM_860 7 /* Intel 80860 */
|
||||
#define EM_MIPS 8 /* MIPS R3000 big-endian */
|
||||
#define EM_S370 9 /* IBM System/370 */
|
||||
#define EM_MIPS_RS3_LE 10 /* MIPS R3000 little-endian */
|
||||
|
||||
#define EM_PARISC 15 /* HPPA */
|
||||
#define EM_VPP500 17 /* Fujitsu VPP500 */
|
||||
#define EM_SPARC32PLUS 18 /* Sun's "v8plus" */
|
||||
#define EM_960 19 /* Intel 80960 */
|
||||
#define EM_PPC 20 /* PowerPC */
|
||||
#define EM_PPC64 21 /* PowerPC 64-bit */
|
||||
#define EM_S390 22 /* IBM S390 */
|
||||
|
||||
#define EM_V800 36 /* NEC V800 series */
|
||||
#define EM_FR20 37 /* Fujitsu FR20 */
|
||||
#define EM_RH32 38 /* TRW RH-32 */
|
||||
#define EM_RCE 39 /* Motorola RCE */
|
||||
#define EM_ARM 40 /* ARM */
|
||||
#define EM_FAKE_ALPHA 41 /* Digital Alpha */
|
||||
#define EM_SH 42 /* Hitachi SH */
|
||||
#define EM_SPARCV9 43 /* SPARC v9 64-bit */
|
||||
#define EM_TRICORE 44 /* Siemens Tricore */
|
||||
#define EM_ARC 45 /* Argonaut RISC Core */
|
||||
#define EM_H8_300 46 /* Hitachi H8/300 */
|
||||
#define EM_H8_300H 47 /* Hitachi H8/300H */
|
||||
#define EM_H8S 48 /* Hitachi H8S */
|
||||
#define EM_H8_500 49 /* Hitachi H8/500 */
|
||||
#define EM_IA_64 50 /* Intel Merced */
|
||||
#define EM_MIPS_X 51 /* Stanford MIPS-X */
|
||||
#define EM_COLDFIRE 52 /* Motorola Coldfire */
|
||||
#define EM_68HC12 53 /* Motorola M68HC12 */
|
||||
#define EM_MMA 54 /* Fujitsu MMA Multimedia Accelerator*/
|
||||
#define EM_PCP 55 /* Siemens PCP */
|
||||
#define EM_NCPU 56 /* Sony nCPU embeeded RISC */
|
||||
#define EM_NDR1 57 /* Denso NDR1 microprocessor */
|
||||
#define EM_STARCORE 58 /* Motorola Start*Core processor */
|
||||
#define EM_ME16 59 /* Toyota ME16 processor */
|
||||
#define EM_ST100 60 /* STMicroelectronic ST100 processor */
|
||||
#define EM_TINYJ 61 /* Advanced Logic Corp. Tinyj emb.fam*/
|
||||
#define EM_X86_64 62 /* AMD x86-64 architecture */
|
||||
#define EM_PDSP 63 /* Sony DSP Processor */
|
||||
|
||||
#define EM_FX66 66 /* Siemens FX66 microcontroller */
|
||||
#define EM_ST9PLUS 67 /* STMicroelectronics ST9+ 8/16 mc */
|
||||
#define EM_ST7 68 /* STmicroelectronics ST7 8 bit mc */
|
||||
#define EM_68HC16 69 /* Motorola MC68HC16 microcontroller */
|
||||
#define EM_68HC11 70 /* Motorola MC68HC11 microcontroller */
|
||||
#define EM_68HC08 71 /* Motorola MC68HC08 microcontroller */
|
||||
#define EM_68HC05 72 /* Motorola MC68HC05 microcontroller */
|
||||
#define EM_SVX 73 /* Silicon Graphics SVx */
|
||||
#define EM_AT19 74 /* STMicroelectronics ST19 8 bit mc */
|
||||
#define EM_VAX 75 /* Digital VAX */
|
||||
#define EM_CRIS 76 /* Axis Communications 32-bit embedded processor */
|
||||
#define EM_JAVELIN 77 /* Infineon Technologies 32-bit embedded processor */
|
||||
#define EM_FIREPATH 78 /* Element 14 64-bit DSP Processor */
|
||||
#define EM_ZSP 79 /* LSI Logic 16-bit DSP Processor */
|
||||
#define EM_MMIX 80 /* Donald Knuth's educational 64-bit processor */
|
||||
#define EM_HUANY 81 /* Harvard University machine-independent object files */
|
||||
#define EM_PRISM 82 /* SiTera Prism */
|
||||
#define EM_AVR 83 /* Atmel AVR 8-bit microcontroller */
|
||||
#define EM_FR30 84 /* Fujitsu FR30 */
|
||||
#define EM_D10V 85 /* Mitsubishi D10V */
|
||||
#define EM_D30V 86 /* Mitsubishi D30V */
|
||||
#define EM_V850 87 /* NEC v850 */
|
||||
#define EM_M32R 88 /* Mitsubishi M32R */
|
||||
#define EM_MN10300 89 /* Matsushita MN10300 */
|
||||
#define EM_MN10200 90 /* Matsushita MN10200 */
|
||||
#define EM_PJ 91 /* picoJava */
|
||||
#define EM_OPENRISC 92 /* OpenRISC 32-bit embedded processor */
|
||||
#define EM_ARC_A5 93 /* ARC Cores Tangent-A5 */
|
||||
#define EM_XTENSA 94 /* Tensilica Xtensa Architecture */
|
||||
#define EM_NUM 95
|
||||
|
||||
/* Values for p_type. */
|
||||
#define PT_NULL 0 /* Unused entry. */
|
||||
#define PT_LOAD 1 /* Loadable segment. */
|
||||
#define PT_DYNAMIC 2 /* Dynamic linking information segment. */
|
||||
#define PT_INTERP 3 /* Pathname of interpreter. */
|
||||
#define PT_NOTE 4 /* Auxiliary information. */
|
||||
#define PT_SHLIB 5 /* Reserved (not used). */
|
||||
#define PT_PHDR 6 /* Location of program header itself. */
|
||||
|
||||
/* Values for p_flags. */
|
||||
#define PF_X 0x1 /* Executable. */
|
||||
#define PF_W 0x2 /* Writable. */
|
||||
#define PF_R 0x4 /* Readable. */
|
||||
|
||||
|
||||
#define ELF_PROGRAM_RETURNS_BIT 0x8000000 /* e_flags bit 31 */
|
||||
|
||||
#define EI_MAG0 0
|
||||
#define ELFMAG0 0x7f
|
||||
|
||||
#define EI_MAG1 1
|
||||
#define ELFMAG1 'E'
|
||||
|
||||
#define EI_MAG2 2
|
||||
#define ELFMAG2 'L'
|
||||
|
||||
#define EI_MAG3 3
|
||||
#define ELFMAG3 'F'
|
||||
|
||||
#define ELFMAG "\177ELF"
|
||||
|
||||
#define EI_CLASS 4 /* File class byte index */
|
||||
#define ELFCLASSNONE 0 /* Invalid class */
|
||||
#define ELFCLASS32 1 /* 32-bit objects */
|
||||
#define ELFCLASS64 2 /* 64-bit objects */
|
||||
|
||||
#define EI_DATA 5 /* Data encodeing byte index */
|
||||
#define ELFDATANONE 0 /* Invalid data encoding */
|
||||
#define ELFDATA2LSB 1 /* 2's complement little endian */
|
||||
#define ELFDATA2MSB 2 /* 2's complement big endian */
|
||||
|
||||
#define EI_VERSION 6 /* File version byte index */
|
||||
/* Value must be EV_CURRENT */
|
||||
|
||||
#define EV_NONE 0 /* Invalid ELF Version */
|
||||
#define EV_CURRENT 1 /* Current version */
|
||||
|
||||
#define ELF32_PHDR_SIZE (8*4) /* Size of an elf program header */
|
||||
|
||||
#ifndef ASSEMBLY
|
||||
/*
|
||||
* ELF definitions common to all 32-bit architectures.
|
||||
*/
|
||||
|
||||
typedef uint32_t Elf32_Addr;
|
||||
typedef uint16_t Elf32_Half;
|
||||
typedef uint32_t Elf32_Off;
|
||||
typedef int32_t Elf32_Sword;
|
||||
typedef uint32_t Elf32_Word;
|
||||
typedef uint32_t Elf32_Size;
|
||||
|
||||
typedef uint64_t Elf64_Addr;
|
||||
typedef uint16_t Elf64_Half;
|
||||
typedef uint64_t Elf64_Off;
|
||||
typedef int32_t Elf64_Sword;
|
||||
typedef uint32_t Elf64_Word;
|
||||
typedef uint64_t Elf64_Size;
|
||||
|
||||
/*
|
||||
* ELF header.
|
||||
*/
|
||||
typedef struct {
|
||||
unsigned char e_ident[EI_NIDENT]; /* File identification. */
|
||||
Elf32_Half e_type; /* File type. */
|
||||
Elf32_Half e_machine; /* Machine architecture. */
|
||||
Elf32_Word e_version; /* ELF format version. */
|
||||
Elf32_Addr e_entry; /* Entry point. */
|
||||
Elf32_Off e_phoff; /* Program header file offset. */
|
||||
Elf32_Off e_shoff; /* Section header file offset. */
|
||||
Elf32_Word e_flags; /* Architecture-specific flags. */
|
||||
Elf32_Half e_ehsize; /* Size of ELF header in bytes. */
|
||||
Elf32_Half e_phentsize; /* Size of program header entry. */
|
||||
Elf32_Half e_phnum; /* Number of program header entries. */
|
||||
Elf32_Half e_shentsize; /* Size of section header entry. */
|
||||
Elf32_Half e_shnum; /* Number of section header entries. */
|
||||
Elf32_Half e_shstrndx; /* Section name strings section. */
|
||||
} Elf32_Ehdr;
|
||||
|
||||
typedef struct {
|
||||
unsigned char e_ident[EI_NIDENT]; /* File identification. */
|
||||
Elf64_Half e_type; /* File type. */
|
||||
Elf64_Half e_machine; /* Machine architecture. */
|
||||
Elf64_Word e_version; /* ELF format version. */
|
||||
Elf64_Addr e_entry; /* Entry point. */
|
||||
Elf64_Off e_phoff; /* Program header file offset. */
|
||||
Elf64_Off e_shoff; /* Section header file offset. */
|
||||
Elf64_Word e_flags; /* Architecture-specific flags. */
|
||||
Elf64_Half e_ehsize; /* Size of ELF header in bytes. */
|
||||
Elf64_Half e_phentsize; /* Size of program header entry. */
|
||||
Elf64_Half e_phnum; /* Number of program header entries. */
|
||||
Elf64_Half e_shentsize; /* Size of section header entry. */
|
||||
Elf64_Half e_shnum; /* Number of section header entries. */
|
||||
Elf64_Half e_shstrndx; /* Section name strings section. */
|
||||
} Elf64_Ehdr;
|
||||
|
||||
/*
|
||||
* Program header.
|
||||
*/
|
||||
typedef struct {
|
||||
Elf32_Word p_type; /* Entry type. */
|
||||
Elf32_Off p_offset; /* File offset of contents. */
|
||||
Elf32_Addr p_vaddr; /* Virtual address (not used). */
|
||||
Elf32_Addr p_paddr; /* Physical address. */
|
||||
Elf32_Size p_filesz; /* Size of contents in file. */
|
||||
Elf32_Size p_memsz; /* Size of contents in memory. */
|
||||
Elf32_Word p_flags; /* Access permission flags. */
|
||||
Elf32_Size p_align; /* Alignment in memory and file. */
|
||||
} Elf32_Phdr;
|
||||
|
||||
typedef struct {
|
||||
Elf64_Word p_type; /* Entry type. */
|
||||
Elf64_Word p_flags; /* Access permission flags. */
|
||||
Elf64_Off p_offset; /* File offset of contents. */
|
||||
Elf64_Addr p_vaddr; /* Virtual address (not used). */
|
||||
Elf64_Addr p_paddr; /* Physical address. */
|
||||
Elf64_Size p_filesz; /* Size of contents in file. */
|
||||
Elf64_Size p_memsz; /* Size of contents in memory. */
|
||||
Elf64_Size p_align; /* Alignment in memory and file. */
|
||||
} Elf64_Phdr;
|
||||
|
||||
/* Standardized Elf image notes for booting... The name for all of these is ELFBoot */
|
||||
|
||||
|
||||
/* ELF Defines for the current architecture */
|
||||
#include "bits/elf.h"
|
||||
|
||||
#endif /* ASSEMBLY */
|
||||
|
||||
#include "elf_boot.h"
|
||||
|
||||
#endif /* ELF_H */
|
||||
84
src/include/elf_boot.h
Normal file
84
src/include/elf_boot.h
Normal file
@@ -0,0 +1,84 @@
|
||||
#ifndef ELF_BOOT_H
|
||||
#define ELF_BOOT_H
|
||||
|
||||
|
||||
/* This defines the structure of a table of parameters useful for ELF
|
||||
* bootable images. These parameters are all passed and generated
|
||||
* by the bootloader to the booted image. For simplicity and
|
||||
* consistency the Elf Note format is reused.
|
||||
*
|
||||
* All of the information must be Position Independent Data.
|
||||
* That is it must be safe to relocate the whole ELF boot parameter
|
||||
* block without changing the meaning or correctnes of the data.
|
||||
* Additionally it must be safe to permute the order of the ELF notes
|
||||
* to any possible permutation without changing the meaning or correctness
|
||||
* of the data.
|
||||
*
|
||||
*/
|
||||
|
||||
#define ELF_BHDR_MAGIC 0x0E1FB007
|
||||
|
||||
#ifndef ASSEMBLY
|
||||
#include <stdint.h>
|
||||
typedef uint16_t Elf_Half;
|
||||
typedef uint32_t Elf_Word;
|
||||
|
||||
typedef struct Elf_Bhdr
|
||||
{
|
||||
Elf_Word b_signature; /* "0x0E1FB007" */
|
||||
Elf_Word b_size;
|
||||
Elf_Half b_checksum;
|
||||
Elf_Half b_records;
|
||||
} Elf_Bhdr;
|
||||
|
||||
typedef struct Elf_Nhdr
|
||||
{
|
||||
Elf_Word n_namesz; /* Length of the note's name. */
|
||||
Elf_Word n_descsz; /* Length of the note's descriptor. */
|
||||
Elf_Word n_type; /* Type of the note. */
|
||||
} Elf_Nhdr;
|
||||
|
||||
#endif /* ASSEMBLY */
|
||||
|
||||
/* Standardized Elf image notes for booting... The name for all of these is ELFBoot */
|
||||
#define ELF_NOTE_BOOT "ELFBoot"
|
||||
|
||||
#define EIN_PROGRAM_NAME 0x00000001
|
||||
/* The program in this ELF file */
|
||||
#define EIN_PROGRAM_VERSION 0x00000002
|
||||
/* The version of the program in this ELF file */
|
||||
#define EIN_PROGRAM_CHECKSUM 0x00000003
|
||||
/* ip style checksum of the memory image. */
|
||||
|
||||
|
||||
/* Notes that are passed to a loaded image */
|
||||
/* For standard notes n_namesz must be zero */
|
||||
#define EBN_FIRMWARE_TYPE 0x00000001
|
||||
/* ASCIZ name of the platform firmware. */
|
||||
#define EBN_BOOTLOADER_NAME 0x00000002
|
||||
/* This specifies just the ASCIZ name of the bootloader */
|
||||
#define EBN_BOOTLOADER_VERSION 0x00000003
|
||||
/* This specifies the version of the bootloader as an ASCIZ string */
|
||||
#define EBN_COMMAND_LINE 0x00000004
|
||||
/* This specifies a command line that can be set by user interaction,
|
||||
* and is provided as a free form ASCIZ string to the loaded image.
|
||||
*/
|
||||
#define EBN_NOP 0x00000005
|
||||
/* A note nop note has no meaning, useful for inserting explicit padding */
|
||||
#define EBN_LOADED_IMAGE 0x00000006
|
||||
/* An ASCIZ string naming the loaded image */
|
||||
|
||||
|
||||
/* Etherboot specific notes */
|
||||
#define EB_PARAM_NOTE "Etherboot"
|
||||
#define EB_IA64_SYSTAB 0x00000001
|
||||
#define EB_IA64_MEMMAP 0x00000002
|
||||
#define EB_IA64_FPSWA 0x00000003
|
||||
#define EB_IA64_CONINFO 0x00000004
|
||||
#define EB_BOOTP_DATA 0x00000005
|
||||
#define EB_HEADER 0x00000006
|
||||
#define EB_IA64_IMAGE_HANDLE 0x00000007
|
||||
#define EB_I386_MEMMAP 0x00000008
|
||||
|
||||
|
||||
#endif /* ELF_BOOT_H */
|
||||
19
src/include/endian.h
Normal file
19
src/include/endian.h
Normal file
@@ -0,0 +1,19 @@
|
||||
#ifndef ETHERBOOT_ENDIAN_H
|
||||
#define ETHERBOOT_ENDIAN_H
|
||||
|
||||
/* Definitions for byte order, according to significance of bytes,
|
||||
from low addresses to high addresses. The value is what you get by
|
||||
putting '4' in the most significant byte, '3' in the second most
|
||||
significant byte, '2' in the second least significant byte, and '1'
|
||||
in the least significant byte, and then writing down one digit for
|
||||
each byte, starting with the byte at the lowest address at the left,
|
||||
and proceeding to the byte with the highest address at the right. */
|
||||
|
||||
#define __LITTLE_ENDIAN 1234
|
||||
#define __BIG_ENDIAN 4321
|
||||
#define __PDP_ENDIAN 3412
|
||||
|
||||
#include "bits/endian.h"
|
||||
|
||||
|
||||
#endif /* ETHERBOOT_ENDIAN_H */
|
||||
459
src/include/etherboot.h
Normal file
459
src/include/etherboot.h
Normal file
@@ -0,0 +1,459 @@
|
||||
#ifndef ETHERBOOT_H
|
||||
#define ETHERBOOT_H
|
||||
|
||||
#include <stdarg.h>
|
||||
#include "osdep.h"
|
||||
|
||||
#ifndef BOOT_FIRST
|
||||
#define BOOT_FIRST BOOT_NIC
|
||||
#endif
|
||||
#ifndef BOOT_SECOND
|
||||
#define BOOT_SECOND BOOT_NOTHING
|
||||
#endif
|
||||
#ifndef BOOT_THIRD
|
||||
#define BOOT_THIRD BOOT_NOTHING
|
||||
#endif
|
||||
|
||||
#define DEFAULT_BOOT_ORDER ( \
|
||||
(BOOT_FIRST << (0*BOOT_BITS)) | \
|
||||
(BOOT_SECOND << (1*BOOT_BITS)) | \
|
||||
(BOOT_THIRD << (2*BOOT_BITS)) | \
|
||||
(BOOT_NOTHING << (3*BOOT_BITS)) | \
|
||||
0)
|
||||
|
||||
#ifdef BOOT_INDEX
|
||||
#define DEFAULT_BOOT_INDEX BOOT_INDEX
|
||||
#else
|
||||
#define DEFAULT_BOOT_INDEX 0
|
||||
#endif
|
||||
|
||||
#if !defined(TAGGED_IMAGE) && !defined(AOUT_IMAGE) && !defined(ELF_IMAGE) && !defined(ELF64_IMAGE) && !defined(COFF_IMAGE) && !defined(RAW_IMAGE)
|
||||
#define TAGGED_IMAGE /* choose at least one */
|
||||
#endif
|
||||
|
||||
#undef CODE16
|
||||
#if defined(PCBIOS)
|
||||
#define CODE16
|
||||
#endif
|
||||
|
||||
#define K_ESC '\033'
|
||||
#define K_EOF '\04' /* Ctrl-D */
|
||||
#define K_INTR '\03' /* Ctrl-C */
|
||||
|
||||
/* Edit this to change the path to hostspecific kernel image
|
||||
kernel.<client_ip_address> in RARP boot */
|
||||
#ifndef DEFAULT_KERNELPATH
|
||||
#define DEFAULT_KERNELPATH "/tftpboot/kernel.%@"
|
||||
#endif
|
||||
|
||||
#ifdef FREEBSD_PXEEMU
|
||||
#undef DEFAULT_BOOTFILE
|
||||
#ifndef PXENFSROOTPATH
|
||||
#define PXENFSROOTPATH ""
|
||||
#endif
|
||||
#define DEFAULT_BOOTFILE PXENFSROOTPATH "/boot/pxeboot"
|
||||
#endif
|
||||
|
||||
/* Clean up console settings... mainly CONSOLE_FIRMWARE and CONSOLE_SERIAL are used
|
||||
* in the sources (except start.S and serial.S which cannot include
|
||||
* etherboot.h). At least one of the CONSOLE_xxx has to be set, and
|
||||
* CONSOLE_DUAL sets both CONSOLE_CRT and CONSOLE_SERIAL. If none is set,
|
||||
* CONSOLE_CRT is assumed. */
|
||||
#ifdef CONSOLE_CRT
|
||||
#define CONSOLE_FIRMWARE
|
||||
#endif
|
||||
#ifdef CONSOLE_DUAL
|
||||
#undef CONSOLE_FIRMWARE
|
||||
#define CONSOLE_FIRMWARE
|
||||
#undef CONSOLE_SERIAL
|
||||
#define CONSOLE_SERIAL
|
||||
#endif
|
||||
#if defined(CONSOLE_FIRMWARE) && defined(CONSOLE_SERIAL)
|
||||
#undef CONSOLE_DUAL
|
||||
#define CONSOLE_DUAL
|
||||
#endif
|
||||
#if !defined(CONSOLE_FIRMWARE) && !defined(CONSOLE_SERIAL)
|
||||
#define CONSOLE_FIRMWARE
|
||||
#endif
|
||||
|
||||
#if !defined(DOWNLOAD_PROTO_TFTP) && !defined(DOWNLOAD_PROTO_NFS) && !defined(DOWNLOAD_PROTO_SLAM) && !defined(DOWNLOAD_PROTO_TFTM) && !defined(DOWNLOAD_PROTO_DISK) && !defined(DOWNLOAD_PROTO_HTTP)
|
||||
#error No download protocol defined!
|
||||
#endif
|
||||
|
||||
#ifndef MAX_TFTP_RETRIES
|
||||
#define MAX_TFTP_RETRIES 20
|
||||
#endif
|
||||
|
||||
#ifndef MAX_BOOTP_RETRIES
|
||||
#define MAX_BOOTP_RETRIES 20
|
||||
#endif
|
||||
|
||||
#define MAX_BOOTP_EXTLEN (ETH_MAX_MTU-sizeof(struct bootpip_t))
|
||||
|
||||
#ifndef MAX_ARP_RETRIES
|
||||
#define MAX_ARP_RETRIES 20
|
||||
#endif
|
||||
|
||||
#ifndef MAX_RPC_RETRIES
|
||||
#define MAX_RPC_RETRIES 20
|
||||
#endif
|
||||
|
||||
/* Link configuration time in tenths of a second */
|
||||
#ifndef VALID_LINK_TIMEOUT
|
||||
#define VALID_LINK_TIMEOUT 100 /* 10.0 seconds */
|
||||
#endif
|
||||
|
||||
/* Inter-packet retry in ticks */
|
||||
#ifndef TIMEOUT
|
||||
#define TIMEOUT (10*TICKS_PER_SEC)
|
||||
#endif
|
||||
|
||||
#ifndef BOOTP_TIMEOUT
|
||||
#define BOOTP_TIMEOUT (2*TICKS_PER_SEC)
|
||||
#endif
|
||||
|
||||
/* Max interval between IGMP packets */
|
||||
#define IGMP_INTERVAL (10*TICKS_PER_SEC)
|
||||
#define IGMPv1_ROUTER_PRESENT_TIMEOUT (400*TICKS_PER_SEC)
|
||||
|
||||
/* These settings have sense only if compiled with -DCONGESTED */
|
||||
/* total retransmission timeout in ticks */
|
||||
#define TFTP_TIMEOUT (30*TICKS_PER_SEC)
|
||||
/* packet retransmission timeout in ticks */
|
||||
#ifdef CONGESTED
|
||||
#define TFTP_REXMT (3*TICKS_PER_SEC)
|
||||
#else
|
||||
#define TFTP_REXMT TIMEOUT
|
||||
#endif
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL ((void *)0)
|
||||
#endif
|
||||
|
||||
#include "if_ether.h"
|
||||
|
||||
enum {
|
||||
ARP_CLIENT, ARP_SERVER, ARP_GATEWAY,
|
||||
#ifdef DNS_RESOLVER
|
||||
ARP_NAMESERVER,
|
||||
#endif
|
||||
#ifdef PXE_EXPORT
|
||||
ARP_PROXYDHCP,
|
||||
#endif
|
||||
MAX_ARP
|
||||
};
|
||||
|
||||
#define IGMP_SERVER 0
|
||||
#define MAX_IGMP IGMP_SERVER+1
|
||||
|
||||
#define RARP_REQUEST 3
|
||||
#define RARP_REPLY 4
|
||||
|
||||
#include "in.h"
|
||||
|
||||
#define MULTICAST_MASK 0xF0000000
|
||||
#define MULTICAST_NETWORK 0xE0000000
|
||||
|
||||
/* Helper macros used to identify when DHCP options are valid/invalid in/outside of encapsulation */
|
||||
#define NON_ENCAP_OPT in_encapsulated_options == 0 &&
|
||||
#ifdef ALLOW_ONLY_ENCAPSULATED
|
||||
#define ENCAP_OPT in_encapsulated_options == 1 &&
|
||||
#else
|
||||
#define ENCAP_OPT
|
||||
#endif
|
||||
|
||||
#include "if_arp.h"
|
||||
#include "ip.h"
|
||||
#include "udp.h"
|
||||
#include "tcp.h"
|
||||
#include "bootp.h"
|
||||
#include "tftp.h"
|
||||
#include "igmp.h"
|
||||
#include "nfs.h"
|
||||
|
||||
struct arptable_t {
|
||||
in_addr ipaddr;
|
||||
uint8_t node[6];
|
||||
} PACKED;
|
||||
|
||||
struct igmptable_t {
|
||||
in_addr group;
|
||||
unsigned long time;
|
||||
} PACKED;
|
||||
|
||||
#define KERNEL_BUF (BOOTP_DATA_ADDR->bootp_reply.bp_file)
|
||||
|
||||
#define FLOPPY_BOOT_LOCATION 0x7c00
|
||||
|
||||
struct rom_info {
|
||||
unsigned short rom_segment;
|
||||
unsigned short rom_length;
|
||||
};
|
||||
|
||||
extern inline int rom_address_ok(struct rom_info *rom, int assigned_rom_segment)
|
||||
{
|
||||
return (assigned_rom_segment < 0xC000
|
||||
|| assigned_rom_segment == rom->rom_segment);
|
||||
}
|
||||
|
||||
/* Define a type for passing info to a loaded program */
|
||||
struct ebinfo {
|
||||
uint8_t major, minor; /* Version */
|
||||
uint16_t flags; /* Bit flags */
|
||||
};
|
||||
|
||||
/***************************************************************************
|
||||
External prototypes
|
||||
***************************************************************************/
|
||||
/* main.c */
|
||||
struct Elf_Bhdr;
|
||||
extern int in_call(in_call_data_t *data, uint32_t opcode, va_list params);
|
||||
extern void console_init(void);
|
||||
extern int main(in_call_data_t *data, va_list params);
|
||||
extern int loadkernel P((const char *fname));
|
||||
extern char as_main_program;
|
||||
/* nic.c */
|
||||
extern void rx_qdrain P((void));
|
||||
extern int tftp P((const char *name, int (*)(unsigned char *, unsigned int, unsigned int, int)));
|
||||
extern int tftp_block P((struct tftpreq_info_t *, struct tftpblk_info_t *));
|
||||
extern int ip_transmit P((int len, const void *buf));
|
||||
extern void build_ip_hdr P((unsigned long destip, int ttl, int protocol,
|
||||
int option_len, int len, const void *buf));
|
||||
extern void build_udp_hdr P((unsigned long destip,
|
||||
unsigned int srcsock, unsigned int destsock, int ttl,
|
||||
int len, const void *buf));
|
||||
extern int udp_transmit P((unsigned long destip, unsigned int srcsock,
|
||||
unsigned int destsock, int len, const void *buf));
|
||||
extern int tcp_transmit(unsigned long destip, unsigned int srcsock,
|
||||
unsigned int destsock, long send_seq, long recv_seq,
|
||||
int window, int flags, int len, const void *buf);
|
||||
int tcp_reset(struct iphdr *ip);
|
||||
typedef int (*reply_t)(int ival, void *ptr, unsigned short ptype, struct iphdr *ip, struct udphdr *udp, struct tcphdr *tcp);
|
||||
extern int await_reply P((reply_t reply, int ival, void *ptr, long timeout));
|
||||
extern int decode_rfc1533 P((unsigned char *, unsigned int, unsigned int, int));
|
||||
extern void join_group(int slot, unsigned long group);
|
||||
extern void leave_group(int slot);
|
||||
#define RAND_MAX 2147483647L
|
||||
extern uint16_t ipchksum P((const void *ip, unsigned long len));
|
||||
extern uint16_t add_ipchksums P((unsigned long offset, uint16_t sum, uint16_t new));
|
||||
extern int32_t random P((void));
|
||||
extern long rfc2131_sleep_interval P((long base, int exp));
|
||||
extern long rfc1112_sleep_interval P((long base, int exp));
|
||||
#ifndef DOWNLOAD_PROTO_TFTP
|
||||
#define tftp(fname, load_block) 0
|
||||
#endif
|
||||
extern void cleanup P((void));
|
||||
|
||||
/* nfs.c */
|
||||
extern void rpc_init(void);
|
||||
extern int nfs P((const char *name, int (*)(unsigned char *, unsigned int, unsigned int, int)));
|
||||
extern void nfs_umountall P((int));
|
||||
|
||||
/* proto_slam.c */
|
||||
extern int url_slam P((const char *name, int (*fnc)(unsigned char *, unsigned int, unsigned int, int)));
|
||||
|
||||
/* proto_tftm.c */
|
||||
extern int url_tftm P((const char *name, int (*fnc)(unsigned char *, unsigned int, unsigned int, int)));
|
||||
|
||||
/* config.c */
|
||||
extern void print_config(void);
|
||||
|
||||
/* isa_probe.c and pci_probe.c */
|
||||
struct dev;
|
||||
extern void isa_enumerate(void);
|
||||
extern int isa_probe(struct dev *, const char *);
|
||||
extern void pci_enumerate(void);
|
||||
extern int pci_probe(struct dev *, const char *);
|
||||
|
||||
/* heap.c */
|
||||
extern void init_heap(void);
|
||||
extern void *allot(size_t size);
|
||||
void forget(void *ptr);
|
||||
extern void *allot2(size_t size, uint32_t mask);
|
||||
void forget2(void *ptr);
|
||||
/* Physical address of the heap */
|
||||
extern size_t heap_ptr, heap_top, heap_bot;
|
||||
|
||||
/* osloader.c */
|
||||
/* Be careful with sector_t it is an unsigned long long on x86 */
|
||||
typedef uint64_t sector_t;
|
||||
typedef sector_t (*os_download_t)(unsigned char *data, unsigned int len, int eof);
|
||||
extern os_download_t probe_image(unsigned char *data, unsigned int len);
|
||||
extern int load_block P((unsigned char *, unsigned int, unsigned int, int ));
|
||||
|
||||
/* misc.c */
|
||||
extern void twiddle P((void));
|
||||
extern void sleep P((int secs));
|
||||
extern void interruptible_sleep P((int secs));
|
||||
extern void poll_interruptions P((void));
|
||||
extern int strcasecmp P((const char *a, const char *b));
|
||||
extern char *substr P((const char *a, const char *b));
|
||||
extern unsigned long strtoul P((const char *p, const char **, int base));
|
||||
extern void printf P((const char *, ...));
|
||||
extern int sprintf P((char *, const char *, ...));
|
||||
extern int inet_aton P((const char *p, in_addr *i));
|
||||
#ifdef PCBIOS
|
||||
extern void gateA20_set P((void));
|
||||
#define gateA20_unset()
|
||||
#else
|
||||
#define gateA20_set()
|
||||
#define gateA20_unset()
|
||||
#endif
|
||||
extern void putchar P((int));
|
||||
extern int getchar P((void));
|
||||
extern int iskey P((void));
|
||||
|
||||
/* pcbios.S */
|
||||
extern int console_getc P((void));
|
||||
extern void console_putc P((int));
|
||||
extern int console_ischar P((void));
|
||||
extern int getshift P((void));
|
||||
extern int int15 P((int));
|
||||
#ifdef POWERSAVE
|
||||
extern void cpu_nap P((void));
|
||||
#endif /* POWERSAVE */
|
||||
|
||||
/* basemem.c */
|
||||
extern uint32_t get_free_base_memory ( void );
|
||||
extern void allot_real_mode_stack ( void );
|
||||
extern void forget_real_mode_stack ( void );
|
||||
extern void * allot_base_memory ( size_t );
|
||||
extern void forget_base_memory ( void*, size_t );
|
||||
extern void free_unused_base_memory ( void );
|
||||
extern void forget_prefix_base_memory ( void );
|
||||
extern void forget_runtime_base_memory ( uint32_t old_addr );
|
||||
|
||||
struct e820entry {
|
||||
uint64_t addr;
|
||||
uint64_t size;
|
||||
uint32_t type;
|
||||
#define E820_RAM 1
|
||||
#define E820_RESERVED 2
|
||||
#define E820_ACPI 3 /* usable as RAM once ACPI tables have been read */
|
||||
#define E820_NVS 4
|
||||
} PACKED;
|
||||
#define E820ENTRY_SIZE 20
|
||||
#define E820MAX 32
|
||||
struct meminfo {
|
||||
uint16_t basememsize;
|
||||
uint16_t pad;
|
||||
uint32_t memsize;
|
||||
uint32_t map_count;
|
||||
struct e820entry map[E820MAX];
|
||||
} PACKED;
|
||||
extern struct meminfo meminfo;
|
||||
extern void get_memsizes(void);
|
||||
extern unsigned long get_boot_order(unsigned long order, unsigned *index);
|
||||
#ifndef NORELOCATE
|
||||
extern void relocate(void);
|
||||
extern void relocate_to(unsigned long phys_dest);
|
||||
#else
|
||||
#define relocate() do {} while(0)
|
||||
#endif
|
||||
extern void disk_init P((void));
|
||||
extern unsigned int pcbios_disk_read P((int drv,int c,int h,int s,char *buf));
|
||||
|
||||
/* start32.S */
|
||||
struct os_entry_regs {
|
||||
/* Be careful changing this structure
|
||||
* as it is used by assembly language code.
|
||||
*/
|
||||
uint32_t edi; /* 0 */
|
||||
uint32_t esi; /* 4 */
|
||||
uint32_t ebp; /* 8 */
|
||||
uint32_t esp; /* 12 */
|
||||
uint32_t ebx; /* 16 */
|
||||
uint32_t edx; /* 20 */
|
||||
uint32_t ecx; /* 24 */
|
||||
uint32_t eax; /* 28 */
|
||||
|
||||
uint32_t saved_ebp; /* 32 */
|
||||
uint32_t saved_esi; /* 36 */
|
||||
uint32_t saved_edi; /* 40 */
|
||||
uint32_t saved_ebx; /* 44 */
|
||||
uint32_t saved_eip; /* 48 */
|
||||
uint32_t saved_esp; /* 52 */
|
||||
};
|
||||
struct regs {
|
||||
/* Be careful changing this structure
|
||||
* as it is used by assembly language code.
|
||||
*/
|
||||
uint32_t edi; /* 0 */
|
||||
uint32_t esi; /* 4 */
|
||||
uint32_t ebp; /* 8 */
|
||||
uint32_t esp; /* 12 */
|
||||
uint32_t ebx; /* 16 */
|
||||
uint32_t edx; /* 20 */
|
||||
uint32_t ecx; /* 24 */
|
||||
uint32_t eax; /* 28 */
|
||||
};
|
||||
extern struct os_entry_regs os_regs;
|
||||
extern struct regs initial_regs;
|
||||
extern int xstart32(unsigned long entry_point, ...);
|
||||
extern int xstart_lm(unsigned long entry_point, unsigned long params);
|
||||
extern void xend32 P((void));
|
||||
struct Elf_Bhdr *prepare_boot_params(void *header);
|
||||
extern int elf_start(unsigned long machine, unsigned long entry, unsigned long params);
|
||||
extern unsigned long currticks P((void));
|
||||
extern void exit P((int status));
|
||||
extern void _stack;
|
||||
extern char _prefix_copy[512];
|
||||
extern uint32_t image_basemem;
|
||||
|
||||
/* serial.c */
|
||||
extern int serial_getc P((void));
|
||||
extern void serial_putc P((int));
|
||||
extern int serial_ischar P((void));
|
||||
extern int serial_init P((void));
|
||||
extern void serial_fini P((void));
|
||||
|
||||
/* floppy.c */
|
||||
extern int bootdisk P((int dev,int part));
|
||||
|
||||
/* pxe_callbacks.c */
|
||||
extern int pxe_in_call ( in_call_data_t *in_call_data, va_list params );
|
||||
|
||||
/***************************************************************************
|
||||
External variables
|
||||
***************************************************************************/
|
||||
/* main.c */
|
||||
extern struct rom_info rom;
|
||||
extern char *hostname;
|
||||
extern int hostnamelen;
|
||||
extern jmp_buf restart_etherboot;
|
||||
extern int url_port;
|
||||
extern struct arptable_t arptable[MAX_ARP];
|
||||
extern struct igmptable_t igmptable[MAX_IGMP];
|
||||
#ifdef IMAGE_MENU
|
||||
extern int menutmo,menudefault;
|
||||
extern unsigned char *defparams;
|
||||
extern int defparams_max;
|
||||
#endif
|
||||
#ifdef MOTD
|
||||
extern unsigned char *motd[RFC1533_VENDOR_NUMOFMOTD];
|
||||
#endif
|
||||
extern struct bootpd_t bootp_data;
|
||||
#define BOOTP_DATA_ADDR (&bootp_data)
|
||||
extern unsigned char *end_of_rfc1533;
|
||||
#ifdef IMAGE_FREEBSD
|
||||
extern int freebsd_howto;
|
||||
#define FREEBSD_KERNEL_ENV_SIZE 256
|
||||
extern char freebsd_kernel_env[FREEBSD_KERNEL_ENV_SIZE];
|
||||
#endif
|
||||
|
||||
/* bootmenu.c */
|
||||
|
||||
/* osloader.c */
|
||||
|
||||
/* created by linker */
|
||||
extern char _virt_start[], _text[], _etext[], _text16[], _etext16[];
|
||||
extern char _data[], _edata[], _bss[], _ebss[], _end[];
|
||||
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* c-basic-offset: 8
|
||||
* End:
|
||||
*/
|
||||
|
||||
#endif /* ETHERBOOT_H */
|
||||
41
src/include/fs.h
Normal file
41
src/include/fs.h
Normal file
@@ -0,0 +1,41 @@
|
||||
#ifndef FS_H
|
||||
#define FS_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
//typedef uint64_t sector_t;
|
||||
|
||||
#ifdef IDE_DISK
|
||||
int ide_probe(int drive);
|
||||
int ide_read(int drive, sector_t sector, void *buffer);
|
||||
#endif
|
||||
|
||||
#ifdef USB_DISK
|
||||
int usb_probe(int drive);
|
||||
int usb_read(int drive, sector_t sector, void *buffer);
|
||||
#endif
|
||||
|
||||
#define DISK_IDE 1
|
||||
#define DISK_MEM 2
|
||||
#define DISK_USB 3
|
||||
|
||||
int devopen(const char *name, int *reopen);
|
||||
int devread(unsigned long sector, unsigned long byte_offset,
|
||||
unsigned long byte_len, void *buf);
|
||||
|
||||
int file_open(const char *filename);
|
||||
int file_read(void *buf, unsigned long len);
|
||||
int file_seek(unsigned long offset);
|
||||
unsigned long file_size(void);
|
||||
|
||||
#define PARTITION_UNKNOWN 0xbad6a7
|
||||
|
||||
#ifdef ELTORITO
|
||||
int open_eltorito_image(int part, unsigned long *start, unsigned long *length);
|
||||
#else
|
||||
# define open_eltorito_image(x,y,z) PARTITION_UNKNOWN
|
||||
#endif
|
||||
|
||||
extern int using_devsize;
|
||||
|
||||
#endif /* FS_H */
|
||||
7
src/include/http.h
Normal file
7
src/include/http.h
Normal file
@@ -0,0 +1,7 @@
|
||||
#ifndef HTTP_H
|
||||
#define HTTP_H
|
||||
|
||||
extern int http(const char *url,
|
||||
int (*fnc)(unsigned char *, unsigned int, unsigned int, int));
|
||||
|
||||
#endif /* HTTP_H */
|
||||
450
src/include/i82365.h
Normal file
450
src/include/i82365.h
Normal file
@@ -0,0 +1,450 @@
|
||||
/*
|
||||
* i82365.h 1.15 1999/10/25 20:03:34
|
||||
*
|
||||
* The contents of this file may be used under the
|
||||
* terms of the GNU General Public License version 2 (the "GPL").
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS"
|
||||
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
|
||||
* the License for the specific language governing rights and
|
||||
* limitations under the License.
|
||||
*
|
||||
* The initial developer of the original code is David A. Hinds
|
||||
* <dahinds@users.sourceforge.net>. Portions created by David A. Hinds
|
||||
* are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_I82365_H
|
||||
#define _LINUX_I82365_H
|
||||
|
||||
/* register definitions for the Intel 82365SL PCMCIA controller */
|
||||
|
||||
/* Offsets for PCIC registers */
|
||||
#define I365_IDENT 0x00 /* Identification and revision */
|
||||
#define I365_STATUS 0x01 /* Interface status */
|
||||
#define I365_POWER 0x02 /* Power and RESETDRV control */
|
||||
#define I365_INTCTL 0x03 /* Interrupt and general control */
|
||||
#define I365_CSC 0x04 /* Card status change */
|
||||
#define I365_CSCINT 0x05 /* Card status change interrupt control */
|
||||
#define I365_ADDRWIN 0x06 /* Address window enable */
|
||||
#define I365_IOCTL 0x07 /* I/O control */
|
||||
#define I365_GENCTL 0x16 /* Card detect and general control */
|
||||
#define I365_GBLCTL 0x1E /* Global control register */
|
||||
|
||||
/* Offsets for I/O and memory window registers */
|
||||
#define I365_IO(map) (0x08+((map)<<2))
|
||||
#define I365_MEM(map) (0x10+((map)<<3))
|
||||
#define I365_W_START 0
|
||||
#define I365_W_STOP 2
|
||||
#define I365_W_OFF 4
|
||||
|
||||
/* Flags for I365_STATUS */
|
||||
#define I365_CS_BVD1 0x01
|
||||
#define I365_CS_STSCHG 0x01
|
||||
#define I365_CS_BVD2 0x02
|
||||
#define I365_CS_SPKR 0x02
|
||||
#define I365_CS_DETECT 0x0C
|
||||
#define I365_CS_WRPROT 0x10
|
||||
#define I365_CS_READY 0x20 /* Inverted */
|
||||
#define I365_CS_POWERON 0x40
|
||||
#define I365_CS_GPI 0x80
|
||||
|
||||
/* Flags for I365_POWER */
|
||||
#define I365_PWR_OFF 0x00 /* Turn off the socket */
|
||||
#define I365_PWR_OUT 0x80 /* Output enable */
|
||||
#define I365_PWR_NORESET 0x40 /* Disable RESETDRV on resume */
|
||||
#define I365_PWR_AUTO 0x20 /* Auto pwr switch enable */
|
||||
#define I365_VCC_MASK 0x18 /* Mask for turning off Vcc */
|
||||
/* There are different layouts for B-step and DF-step chips: the B
|
||||
step has independent Vpp1/Vpp2 control, and the DF step has only
|
||||
Vpp1 control, plus 3V control */
|
||||
#define I365_VCC_5V 0x10 /* Vcc = 5.0v */
|
||||
#define I365_VCC_3V 0x18 /* Vcc = 3.3v */
|
||||
#define I365_VPP2_MASK 0x0c /* Mask for turning off Vpp2 */
|
||||
#define I365_VPP2_5V 0x04 /* Vpp2 = 5.0v */
|
||||
#define I365_VPP2_12V 0x08 /* Vpp2 = 12.0v */
|
||||
#define I365_VPP1_MASK 0x03 /* Mask for turning off Vpp1 */
|
||||
#define I365_VPP1_5V 0x01 /* Vpp2 = 5.0v */
|
||||
#define I365_VPP1_12V 0x02 /* Vpp2 = 12.0v */
|
||||
|
||||
/* Flags for I365_INTCTL */
|
||||
#define I365_RING_ENA 0x80
|
||||
#define I365_PC_RESET 0x40
|
||||
#define I365_PC_IOCARD 0x20
|
||||
#define I365_INTR_ENA 0x10
|
||||
#define I365_IRQ_MASK 0x0F
|
||||
|
||||
/* Flags for I365_CSC and I365_CSCINT*/
|
||||
#define I365_CSC_BVD1 0x01
|
||||
#define I365_CSC_STSCHG 0x01
|
||||
#define I365_CSC_BVD2 0x02
|
||||
#define I365_CSC_READY 0x04
|
||||
#define I365_CSC_DETECT 0x08
|
||||
#define I365_CSC_ANY 0x0F
|
||||
#define I365_CSC_GPI 0x10
|
||||
|
||||
/* Flags for I365_ADDRWIN */
|
||||
#define I365_ENA_IO(map) (0x40 << (map))
|
||||
#define I365_ENA_MEM(map) (0x01 << (map))
|
||||
|
||||
/* Flags for I365_IOCTL */
|
||||
#define I365_IOCTL_MASK(map) (0x0F << (map<<2))
|
||||
#define I365_IOCTL_WAIT(map) (0x08 << (map<<2))
|
||||
#define I365_IOCTL_0WS(map) (0x04 << (map<<2))
|
||||
#define I365_IOCTL_IOCS16(map) (0x02 << (map<<2))
|
||||
#define I365_IOCTL_16BIT(map) (0x01 << (map<<2))
|
||||
|
||||
/* Flags for I365_GENCTL */
|
||||
#define I365_CTL_16DELAY 0x01
|
||||
#define I365_CTL_RESET 0x02
|
||||
#define I365_CTL_GPI_ENA 0x04
|
||||
#define I365_CTL_GPI_CTL 0x08
|
||||
#define I365_CTL_RESUME 0x10
|
||||
#define I365_CTL_SW_IRQ 0x20
|
||||
|
||||
/* Flags for I365_GBLCTL */
|
||||
#define I365_GBL_PWRDOWN 0x01
|
||||
#define I365_GBL_CSC_LEV 0x02
|
||||
#define I365_GBL_WRBACK 0x04
|
||||
#define I365_GBL_IRQ_0_LEV 0x08
|
||||
#define I365_GBL_IRQ_1_LEV 0x10
|
||||
|
||||
/* Flags for memory window registers */
|
||||
#define I365_MEM_16BIT 0x8000 /* In memory start high byte */
|
||||
#define I365_MEM_0WS 0x4000
|
||||
#define I365_MEM_WS1 0x8000 /* In memory stop high byte */
|
||||
#define I365_MEM_WS0 0x4000
|
||||
#define I365_MEM_WRPROT 0x8000 /* In offset high byte */
|
||||
#define I365_MEM_REG 0x4000
|
||||
|
||||
#define I365_REG(slot, reg) (((slot) << 6) + reg)
|
||||
|
||||
#endif /* _LINUX_I82365_H */
|
||||
|
||||
//*****************************************************************************
|
||||
//*****************************************************************************
|
||||
//*****************************************************************************
|
||||
//*****************************************************************************
|
||||
//*****************************************************************************
|
||||
// Beginning vg468.h (for VADEM chipset)
|
||||
|
||||
#ifndef _LINUX_VG468_H
|
||||
#define _LINUX_VG468_H
|
||||
|
||||
/* Special bit in I365_IDENT used for Vadem chip detection */
|
||||
#define I365_IDENT_VADEM 0x08
|
||||
|
||||
/* Special definitions in I365_POWER */
|
||||
#define VG468_VPP2_MASK 0x0c
|
||||
#define VG468_VPP2_5V 0x04
|
||||
#define VG468_VPP2_12V 0x08
|
||||
|
||||
/* Unique Vadem registers */
|
||||
#define VG469_VSENSE 0x1f /* Card voltage sense */
|
||||
#define VG469_VSELECT 0x2f /* Card voltage select */
|
||||
#define VG468_CTL 0x38 /* Control register */
|
||||
#define VG468_TIMER 0x39 /* Timer control */
|
||||
#define VG468_MISC 0x3a /* Miscellaneous */
|
||||
#define VG468_GPIO_CFG 0x3b /* GPIO configuration */
|
||||
#define VG469_EXT_MODE 0x3c /* Extended mode register */
|
||||
#define VG468_SELECT 0x3d /* Programmable chip select */
|
||||
#define VG468_SELECT_CFG 0x3e /* Chip select configuration */
|
||||
#define VG468_ATA 0x3f /* ATA control */
|
||||
|
||||
/* Flags for VG469_VSENSE */
|
||||
#define VG469_VSENSE_A_VS1 0x01
|
||||
#define VG469_VSENSE_A_VS2 0x02
|
||||
#define VG469_VSENSE_B_VS1 0x04
|
||||
#define VG469_VSENSE_B_VS2 0x08
|
||||
|
||||
/* Flags for VG469_VSELECT */
|
||||
#define VG469_VSEL_VCC 0x03
|
||||
#define VG469_VSEL_5V 0x00
|
||||
#define VG469_VSEL_3V 0x03
|
||||
#define VG469_VSEL_MAX 0x0c
|
||||
#define VG469_VSEL_EXT_STAT 0x10
|
||||
#define VG469_VSEL_EXT_BUS 0x20
|
||||
#define VG469_VSEL_MIXED 0x40
|
||||
#define VG469_VSEL_ISA 0x80
|
||||
|
||||
/* Flags for VG468_CTL */
|
||||
#define VG468_CTL_SLOW 0x01 /* 600ns memory timing */
|
||||
#define VG468_CTL_ASYNC 0x02 /* Asynchronous bus clocking */
|
||||
#define VG468_CTL_TSSI 0x08 /* Tri-state some outputs */
|
||||
#define VG468_CTL_DELAY 0x10 /* Card detect debounce */
|
||||
#define VG468_CTL_INPACK 0x20 /* Obey INPACK signal? */
|
||||
#define VG468_CTL_POLARITY 0x40 /* VCCEN polarity */
|
||||
#define VG468_CTL_COMPAT 0x80 /* Compatibility stuff */
|
||||
|
||||
#define VG469_CTL_WS_COMPAT 0x04 /* Wait state compatibility */
|
||||
#define VG469_CTL_STRETCH 0x10 /* LED stretch */
|
||||
|
||||
/* Flags for VG468_TIMER */
|
||||
#define VG468_TIMER_ZEROPWR 0x10 /* Zero power control */
|
||||
#define VG468_TIMER_SIGEN 0x20 /* Power up */
|
||||
#define VG468_TIMER_STATUS 0x40 /* Activity timer status */
|
||||
#define VG468_TIMER_RES 0x80 /* Timer resolution */
|
||||
#define VG468_TIMER_MASK 0x0f /* Activity timer timeout */
|
||||
|
||||
/* Flags for VG468_MISC */
|
||||
#define VG468_MISC_GPIO 0x04 /* General-purpose IO */
|
||||
#define VG468_MISC_DMAWSB 0x08 /* DMA wait state control */
|
||||
#define VG469_MISC_LEDENA 0x10 /* LED enable */
|
||||
#define VG468_MISC_VADEMREV 0x40 /* Vadem revision control */
|
||||
#define VG468_MISC_UNLOCK 0x80 /* Unique register lock */
|
||||
|
||||
/* Flags for VG469_EXT_MODE_A */
|
||||
#define VG469_MODE_VPPST 0x03 /* Vpp steering control */
|
||||
#define VG469_MODE_INT_SENSE 0x04 /* Internal voltage sense */
|
||||
#define VG469_MODE_CABLE 0x08
|
||||
#define VG469_MODE_COMPAT 0x10 /* i82365sl B or DF step */
|
||||
#define VG469_MODE_TEST 0x20
|
||||
#define VG469_MODE_RIO 0x40 /* Steer RIO to INTR? */
|
||||
|
||||
/* Flags for VG469_EXT_MODE_B */
|
||||
#define VG469_MODE_B_3V 0x01 /* 3.3v for socket B */
|
||||
|
||||
#endif /* _LINUX_VG468_H */
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//*****************************************************************************
|
||||
//*****************************************************************************
|
||||
//*****************************************************************************
|
||||
//*****************************************************************************
|
||||
// Beginning ricoh.h (RICOH chipsets)
|
||||
|
||||
#ifndef _LINUX_RICOH_H
|
||||
#define _LINUX_RICOH_H
|
||||
|
||||
|
||||
#define RF5C_MODE_CTL 0x1f /* Mode control */
|
||||
#define RF5C_PWR_CTL 0x2f /* Mixed voltage control */
|
||||
#define RF5C_CHIP_ID 0x3a /* Chip identification */
|
||||
#define RF5C_MODE_CTL_3 0x3b /* Mode control 3 */
|
||||
|
||||
/* I/O window address offset */
|
||||
#define RF5C_IO_OFF(w) (0x36+((w)<<1))
|
||||
|
||||
/* Flags for RF5C_MODE_CTL */
|
||||
#define RF5C_MODE_ATA 0x01 /* ATA mode */
|
||||
#define RF5C_MODE_LED_ENA 0x02 /* IRQ 12 is LED */
|
||||
#define RF5C_MODE_CA21 0x04
|
||||
#define RF5C_MODE_CA22 0x08
|
||||
#define RF5C_MODE_CA23 0x10
|
||||
#define RF5C_MODE_CA24 0x20
|
||||
#define RF5C_MODE_CA25 0x40
|
||||
#define RF5C_MODE_3STATE_BIT7 0x80
|
||||
|
||||
/* Flags for RF5C_PWR_CTL */
|
||||
#define RF5C_PWR_VCC_3V 0x01
|
||||
#define RF5C_PWR_IREQ_HIGH 0x02
|
||||
#define RF5C_PWR_INPACK_ENA 0x04
|
||||
#define RF5C_PWR_5V_DET 0x08
|
||||
#define RF5C_PWR_TC_SEL 0x10 /* Terminal Count: irq 11 or 15 */
|
||||
#define RF5C_PWR_DREQ_LOW 0x20
|
||||
#define RF5C_PWR_DREQ_OFF 0x00 /* DREQ steering control */
|
||||
#define RF5C_PWR_DREQ_INPACK 0x40
|
||||
#define RF5C_PWR_DREQ_SPKR 0x80
|
||||
#define RF5C_PWR_DREQ_IOIS16 0xc0
|
||||
|
||||
/* Values for RF5C_CHIP_ID */
|
||||
#define RF5C_CHIP_RF5C296 0x32
|
||||
#define RF5C_CHIP_RF5C396 0xb2
|
||||
|
||||
/* Flags for RF5C_MODE_CTL_3 */
|
||||
#define RF5C_MCTL3_DISABLE 0x01 /* Disable PCMCIA interface */
|
||||
#define RF5C_MCTL3_DMA_ENA 0x02
|
||||
|
||||
/* Register definitions for Ricoh PCI-to-CardBus bridges */
|
||||
|
||||
/* Extra bits in CB_BRIDGE_CONTROL */
|
||||
#define RL5C46X_BCR_3E0_ENA 0x0800
|
||||
#define RL5C46X_BCR_3E2_ENA 0x1000
|
||||
|
||||
/* Bridge Configuration Register */
|
||||
#define RL5C4XX_CONFIG 0x80 /* 16 bit */
|
||||
#define RL5C4XX_CONFIG_IO_1_MODE 0x0200
|
||||
#define RL5C4XX_CONFIG_IO_0_MODE 0x0100
|
||||
#define RL5C4XX_CONFIG_PREFETCH 0x0001
|
||||
|
||||
|
||||
/* Misc Control Register */
|
||||
#define RL5C4XX_MISC 0x0082 /* 16 bit */
|
||||
#define RL5C4XX_MISC_HW_SUSPEND_ENA 0x0002
|
||||
#define RL5C4XX_MISC_VCCEN_POL 0x0100
|
||||
#define RL5C4XX_MISC_VPPEN_POL 0x0200
|
||||
#define RL5C46X_MISC_SUSPEND 0x0001
|
||||
#define RL5C46X_MISC_PWR_SAVE_2 0x0004
|
||||
#define RL5C46X_MISC_IFACE_BUSY 0x0008
|
||||
#define RL5C46X_MISC_B_LOCK 0x0010
|
||||
#define RL5C46X_MISC_A_LOCK 0x0020
|
||||
#define RL5C46X_MISC_PCI_LOCK 0x0040
|
||||
#define RL5C47X_MISC_IFACE_BUSY 0x0004
|
||||
#define RL5C47X_MISC_PCI_INT_MASK 0x0018
|
||||
#define RL5C47X_MISC_PCI_INT_DIS 0x0020
|
||||
#define RL5C47X_MISC_SUBSYS_WR 0x0040
|
||||
#define RL5C47X_MISC_SRIRQ_ENA 0x0080
|
||||
#define RL5C47X_MISC_5V_DISABLE 0x0400
|
||||
#define RL5C47X_MISC_LED_POL 0x0800
|
||||
|
||||
/* 16-bit Interface Control Register */
|
||||
#define RL5C4XX_16BIT_CTL 0x0084 /* 16 bit */
|
||||
#define RL5C4XX_16CTL_IO_TIMING 0x0100
|
||||
#define RL5C4XX_16CTL_MEM_TIMING 0x0200
|
||||
#define RL5C46X_16CTL_LEVEL_1 0x0010
|
||||
#define RL5C46X_16CTL_LEVEL_2 0x0020
|
||||
|
||||
/* 16-bit IO and memory timing registers */
|
||||
#define RL5C4XX_16BIT_IO_0 0x0088 /* 16 bit */
|
||||
#define RL5C4XX_16BIT_MEM_0 0x0088 /* 16 bit */
|
||||
#define RL5C4XX_SETUP_MASK 0x0007
|
||||
#define RL5C4XX_SETUP_SHIFT 0
|
||||
#define RL5C4XX_CMD_MASK 0x01f0
|
||||
#define RL5C4XX_CMD_SHIFT 4
|
||||
#define RL5C4XX_HOLD_MASK 0x1c00
|
||||
#define RL5C4XX_HOLD_SHIFT 10
|
||||
#define RL5C4XX_MISC_CONTROL 0x2F /* 8 bit */
|
||||
#define RL5C4XX_ZV_ENABLE 0x08
|
||||
|
||||
#endif /* _LINUX_RICOH_H */
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//*****************************************************************************
|
||||
//*****************************************************************************
|
||||
//*****************************************************************************
|
||||
//*****************************************************************************
|
||||
// Beginning cirrus.h (CIRRUS chipsets)
|
||||
|
||||
#ifndef _LINUX_CIRRUS_H
|
||||
#define _LINUX_CIRRUS_H
|
||||
|
||||
#ifndef PCI_VENDOR_ID_CIRRUS
|
||||
#define PCI_VENDOR_ID_CIRRUS 0x1013
|
||||
#endif
|
||||
#ifndef PCI_DEVICE_ID_CIRRUS_6729
|
||||
#define PCI_DEVICE_ID_CIRRUS_6729 0x1100
|
||||
#endif
|
||||
#ifndef PCI_DEVICE_ID_CIRRUS_6832
|
||||
#define PCI_DEVICE_ID_CIRRUS_6832 0x1110
|
||||
#endif
|
||||
|
||||
#define PD67_MISC_CTL_1 0x16 /* Misc control 1 */
|
||||
#define PD67_FIFO_CTL 0x17 /* FIFO control */
|
||||
#define PD67_MISC_CTL_2 0x1E /* Misc control 2 */
|
||||
#define PD67_CHIP_INFO 0x1f /* Chip information */
|
||||
#define PD67_ATA_CTL 0x026 /* 6730: ATA control */
|
||||
#define PD67_EXT_INDEX 0x2e /* Extension index */
|
||||
#define PD67_EXT_DATA 0x2f /* Extension data */
|
||||
|
||||
/* PD6722 extension registers -- indexed in PD67_EXT_INDEX */
|
||||
#define PD67_DATA_MASK0 0x01 /* Data mask 0 */
|
||||
#define PD67_DATA_MASK1 0x02 /* Data mask 1 */
|
||||
#define PD67_DMA_CTL 0x03 /* DMA control */
|
||||
|
||||
/* PD6730 extension registers -- indexed in PD67_EXT_INDEX */
|
||||
#define PD67_EXT_CTL_1 0x03 /* Extension control 1 */
|
||||
#define PD67_MEM_PAGE(n) ((n)+5) /* PCI window bits 31:24 */
|
||||
#define PD67_EXTERN_DATA 0x0a
|
||||
#define PD67_MISC_CTL_3 0x25
|
||||
#define PD67_SMB_PWR_CTL 0x26
|
||||
|
||||
/* I/O window address offset */
|
||||
#define PD67_IO_OFF(w) (0x36+((w)<<1))
|
||||
|
||||
/* Timing register sets */
|
||||
#define PD67_TIME_SETUP(n) (0x3a + 3*(n))
|
||||
#define PD67_TIME_CMD(n) (0x3b + 3*(n))
|
||||
#define PD67_TIME_RECOV(n) (0x3c + 3*(n))
|
||||
|
||||
/* Flags for PD67_MISC_CTL_1 */
|
||||
#define PD67_MC1_5V_DET 0x01 /* 5v detect */
|
||||
#define PD67_MC1_MEDIA_ENA 0x01 /* 6730: Multimedia enable */
|
||||
#define PD67_MC1_VCC_3V 0x02 /* 3.3v Vcc */
|
||||
#define PD67_MC1_PULSE_MGMT 0x04
|
||||
#define PD67_MC1_PULSE_IRQ 0x08
|
||||
#define PD67_MC1_SPKR_ENA 0x10
|
||||
#define PD67_MC1_INPACK_ENA 0x80
|
||||
|
||||
/* Flags for PD67_FIFO_CTL */
|
||||
#define PD67_FIFO_EMPTY 0x80
|
||||
|
||||
/* Flags for PD67_MISC_CTL_2 */
|
||||
#define PD67_MC2_FREQ_BYPASS 0x01
|
||||
#define PD67_MC2_DYNAMIC_MODE 0x02
|
||||
#define PD67_MC2_SUSPEND 0x04
|
||||
#define PD67_MC2_5V_CORE 0x08
|
||||
#define PD67_MC2_LED_ENA 0x10 /* IRQ 12 is LED enable */
|
||||
#define PD67_MC2_FAST_PCI 0x10 /* 6729: PCI bus > 25 MHz */
|
||||
#define PD67_MC2_3STATE_BIT7 0x20 /* Floppy change bit */
|
||||
#define PD67_MC2_DMA_MODE 0x40
|
||||
#define PD67_MC2_IRQ15_RI 0x80 /* IRQ 15 is ring enable */
|
||||
|
||||
/* Flags for PD67_CHIP_INFO */
|
||||
#define PD67_INFO_SLOTS 0x20 /* 0 = 1 slot, 1 = 2 slots */
|
||||
#define PD67_INFO_CHIP_ID 0xc0
|
||||
#define PD67_INFO_REV 0x1c
|
||||
|
||||
/* Fields in PD67_TIME_* registers */
|
||||
#define PD67_TIME_SCALE 0xc0
|
||||
#define PD67_TIME_SCALE_1 0x00
|
||||
#define PD67_TIME_SCALE_16 0x40
|
||||
#define PD67_TIME_SCALE_256 0x80
|
||||
#define PD67_TIME_SCALE_4096 0xc0
|
||||
#define PD67_TIME_MULT 0x3f
|
||||
|
||||
/* Fields in PD67_DMA_CTL */
|
||||
#define PD67_DMA_MODE 0xc0
|
||||
#define PD67_DMA_OFF 0x00
|
||||
#define PD67_DMA_DREQ_INPACK 0x40
|
||||
#define PD67_DMA_DREQ_WP 0x80
|
||||
#define PD67_DMA_DREQ_BVD2 0xc0
|
||||
#define PD67_DMA_PULLUP 0x20 /* Disable socket pullups? */
|
||||
|
||||
/* Fields in PD67_EXT_CTL_1 */
|
||||
#define PD67_EC1_VCC_PWR_LOCK 0x01
|
||||
#define PD67_EC1_AUTO_PWR_CLEAR 0x02
|
||||
#define PD67_EC1_LED_ENA 0x04
|
||||
#define PD67_EC1_INV_CARD_IRQ 0x08
|
||||
#define PD67_EC1_INV_MGMT_IRQ 0x10
|
||||
#define PD67_EC1_PULLUP_CTL 0x20
|
||||
|
||||
/* Fields in PD67_MISC_CTL_3 */
|
||||
#define PD67_MC3_IRQ_MASK 0x03
|
||||
#define PD67_MC3_IRQ_PCPCI 0x00
|
||||
#define PD67_MC3_IRQ_EXTERN 0x01
|
||||
#define PD67_MC3_IRQ_PCIWAY 0x02
|
||||
#define PD67_MC3_IRQ_PCI 0x03
|
||||
#define PD67_MC3_PWR_MASK 0x0c
|
||||
#define PD67_MC3_PWR_SERIAL 0x00
|
||||
#define PD67_MC3_PWR_TI2202 0x08
|
||||
#define PD67_MC3_PWR_SMB 0x0c
|
||||
|
||||
/* Register definitions for Cirrus PD6832 PCI-to-CardBus bridge */
|
||||
|
||||
/* PD6832 extension registers -- indexed in PD67_EXT_INDEX */
|
||||
#define PD68_EXT_CTL_2 0x0b
|
||||
#define PD68_PCI_SPACE 0x22
|
||||
#define PD68_PCCARD_SPACE 0x23
|
||||
#define PD68_WINDOW_TYPE 0x24
|
||||
#define PD68_EXT_CSC 0x2e
|
||||
#define PD68_MISC_CTL_4 0x2f
|
||||
#define PD68_MISC_CTL_5 0x30
|
||||
#define PD68_MISC_CTL_6 0x31
|
||||
|
||||
/* Extra flags in PD67_MISC_CTL_3 */
|
||||
#define PD68_MC3_HW_SUSP 0x10
|
||||
#define PD68_MC3_MM_EXPAND 0x40
|
||||
#define PD68_MC3_MM_ARM 0x80
|
||||
|
||||
/* Bridge Control Register */
|
||||
#define PD6832_BCR_MGMT_IRQ_ENA 0x0800
|
||||
|
||||
/* Socket Number Register */
|
||||
#define PD6832_SOCKET_NUMBER 0x004c /* 8 bit */
|
||||
|
||||
#endif /* _LINUX_CIRRUS_H */
|
||||
|
||||
|
||||
|
||||
23
src/include/if_arp.h
Normal file
23
src/include/if_arp.h
Normal file
@@ -0,0 +1,23 @@
|
||||
#ifndef _IF_ARP_H
|
||||
#define _IF_ARP_H
|
||||
|
||||
#define ARP_REQUEST 1
|
||||
#define ARP_REPLY 2
|
||||
|
||||
/*
|
||||
* A pity sipaddr and tipaddr are not longword aligned or we could use
|
||||
* in_addr. No, I don't want to use #pragma packed.
|
||||
*/
|
||||
struct arprequest {
|
||||
uint16_t hwtype;
|
||||
uint16_t protocol;
|
||||
uint8_t hwlen;
|
||||
uint8_t protolen;
|
||||
uint16_t opcode;
|
||||
uint8_t shwaddr[6];
|
||||
uint8_t sipaddr[4];
|
||||
uint8_t thwaddr[6];
|
||||
uint8_t tipaddr[4];
|
||||
} PACKED;
|
||||
|
||||
#endif /* _IF_ARP_H */
|
||||
27
src/include/if_ether.h
Normal file
27
src/include/if_ether.h
Normal file
@@ -0,0 +1,27 @@
|
||||
#ifndef _IF_ETHER_H
|
||||
#define _IF_ETHER_H
|
||||
|
||||
/*
|
||||
I'm moving towards the defined names in linux/if_ether.h for clarity.
|
||||
The confusion between 60/64 and 1514/1518 arose because the NS8390
|
||||
counts the 4 byte frame checksum in the incoming packet, but not
|
||||
in the outgoing packet. 60/1514 are the correct numbers for most
|
||||
if not all of the other NIC controllers.
|
||||
*/
|
||||
|
||||
#define ETH_ALEN 6 /* Size of Ethernet address */
|
||||
#define ETH_HLEN 14 /* Size of ethernet header */
|
||||
#define ETH_ZLEN 60 /* Minimum packet */
|
||||
#define ETH_FRAME_LEN 1514 /* Maximum packet */
|
||||
#define ETH_DATA_ALIGN 2 /* Amount needed to align the data after an ethernet header */
|
||||
#ifndef ETH_MAX_MTU
|
||||
#define ETH_MAX_MTU (ETH_FRAME_LEN-ETH_HLEN)
|
||||
#endif
|
||||
|
||||
#define ETH_P_IP 0x0800 /* Internet Protocl Packet */
|
||||
#define ETH_P_ARP 0x0806 /* Address Resolution Protocol */
|
||||
#define ETH_P_RARP 0x8035 /* Reverse Address resolution Protocol */
|
||||
#define ETH_P_IPV6 0x86DD /* IPv6 over blueblook */
|
||||
#define ETH_P_SLOW 0x8809 /* Ethernet slow protocols */
|
||||
|
||||
#endif /* _IF_ETHER_H */
|
||||
23
src/include/igmp.h
Normal file
23
src/include/igmp.h
Normal file
@@ -0,0 +1,23 @@
|
||||
#ifndef _IGMP_H
|
||||
#define _IGMP_H
|
||||
|
||||
#define IGMP_QUERY 0x11
|
||||
#define IGMPv1_REPORT 0x12
|
||||
#define IGMPv2_REPORT 0x16
|
||||
#define IGMP_LEAVE 0x17
|
||||
#define GROUP_ALL_HOSTS 0xe0000001 /* 224.0.0.1 Host byte order */
|
||||
|
||||
struct igmp {
|
||||
uint8_t type;
|
||||
uint8_t response_time;
|
||||
uint16_t chksum;
|
||||
in_addr group;
|
||||
} PACKED;
|
||||
|
||||
struct igmp_ip_t { /* Format of an igmp ip packet */
|
||||
struct iphdr ip;
|
||||
uint8_t router_alert[4]; /* Router alert option */
|
||||
struct igmp igmp;
|
||||
} PACKED;
|
||||
|
||||
#endif /* _IGMP_H */
|
||||
21
src/include/in.h
Normal file
21
src/include/in.h
Normal file
@@ -0,0 +1,21 @@
|
||||
#ifndef _IN_H
|
||||
#define _IN_H
|
||||
|
||||
#include <if_ether.h>
|
||||
#define IP ETH_P_IP
|
||||
#define ARP ETH_P_ARP
|
||||
#define RARP ETH_P_RARP
|
||||
|
||||
#define IP_ICMP 1
|
||||
#define IP_IGMP 2
|
||||
#define IP_TCP 6
|
||||
#define IP_UDP 17
|
||||
|
||||
/* Same after going through htonl */
|
||||
#define IP_BROADCAST 0xFFFFFFFF
|
||||
|
||||
typedef struct {
|
||||
uint32_t s_addr;
|
||||
} in_addr;
|
||||
|
||||
#endif /* _IN_H */
|
||||
17
src/include/ip.h
Normal file
17
src/include/ip.h
Normal file
@@ -0,0 +1,17 @@
|
||||
#ifndef _IP_H
|
||||
#define _IP_H
|
||||
|
||||
struct iphdr {
|
||||
uint8_t verhdrlen;
|
||||
uint8_t service;
|
||||
uint16_t len;
|
||||
uint16_t ident;
|
||||
uint16_t frags;
|
||||
uint8_t ttl;
|
||||
uint8_t protocol;
|
||||
uint16_t chksum;
|
||||
in_addr src;
|
||||
in_addr dest;
|
||||
} PACKED;
|
||||
|
||||
#endif /* _IP_H */
|
||||
32
src/include/isa.h
Normal file
32
src/include/isa.h
Normal file
@@ -0,0 +1,32 @@
|
||||
#ifndef ISA_H
|
||||
#define ISA_H
|
||||
|
||||
struct dev;
|
||||
|
||||
#define ISAPNP_VENDOR(a,b,c) (((((a)-'A'+1)&0x3f)<<2)|\
|
||||
((((b)-'A'+1)&0x18)>>3)|((((b)-'A'+1)&7)<<13)|\
|
||||
((((c)-'A'+1)&0x1f)<<8))
|
||||
|
||||
#define GENERIC_ISAPNP_VENDOR ISAPNP_VENDOR('P','N','P')
|
||||
|
||||
struct isa_driver
|
||||
{
|
||||
int type;
|
||||
const char *name;
|
||||
int (*probe)(struct dev *, unsigned short *);
|
||||
unsigned short *ioaddrs;
|
||||
};
|
||||
|
||||
#ifndef __HYPERSTONE__
|
||||
#define __isa_driver __attribute__ ((used,__section__(".drivers.isa")))
|
||||
#else
|
||||
#define __isa_driver __attribute__ ((used,__section__(".drivisa")))
|
||||
#endif
|
||||
|
||||
extern const struct isa_driver isa_drivers[];
|
||||
extern const struct isa_driver isa_drivers_end[];
|
||||
|
||||
#define ISA_ROM(IMAGE, DESCRIPTION)
|
||||
|
||||
#endif /* ISA_H */
|
||||
|
||||
124
src/include/isapnp.h
Normal file
124
src/include/isapnp.h
Normal file
@@ -0,0 +1,124 @@
|
||||
/**************************************************************************
|
||||
*
|
||||
* isapnp.h -- Etherboot isapnp support for the 3Com 3c515
|
||||
* Written 2002-2003 by Timothy Legge <tlegge@rogers.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*
|
||||
* Portions of this code:
|
||||
* Copyright (C) 2001 P.J.H.Fox (fox@roestock.demon.co.uk)
|
||||
*
|
||||
*
|
||||
*
|
||||
* REVISION HISTORY:
|
||||
* ================
|
||||
* Version 0.1 April 26, 2002 TJL
|
||||
* Version 0.2 01/08/2003 TJL Renamed from 3c515_isapnp.h
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
/*extern int read_port;*/
|
||||
/*#define DEBUG*/
|
||||
#define ADDRESS_ADDR 0x0279
|
||||
#define WRITEDATA_ADDR 0x0a79
|
||||
/* MIN and MAX READ_ADDR must have the bottom two bits set */
|
||||
#define MIN_READ_ADDR 0x0203
|
||||
#define START_READ_ADDR 0x203
|
||||
#define MAX_READ_ADDR 0x03ff
|
||||
/* READ_ADDR_STEP must be a multiple of 4 */
|
||||
#ifndef READ_ADDR_STEP
|
||||
#define READ_ADDR_STEP 8
|
||||
#endif
|
||||
|
||||
#ifdef EDEBUG
|
||||
static int x;
|
||||
#define ADDRESS(x) (outb(x, ADDRESS_ADDR), printf("\nAddress: %hX", x))
|
||||
#define WRITE_DATA(x) (outb(x, WRITEDATA_ADDR), printf(" WR(%hX)", x & 0xff))
|
||||
#define READ_DATA (x = inb(read_port), printf(" RD(%hX)", x & 0xff), x)
|
||||
#define READ_IOPORT(p) (x = inb(p), printf(" [%hX](%hX)", p, x & 0xff), x)
|
||||
#else /* !DEBUG */
|
||||
#define ADDRESS(x) outb(x, ADDRESS_ADDR)
|
||||
#define WRITE_DATA(x) outb(x, WRITEDATA_ADDR)
|
||||
#define READ_DATA inb(read_port)
|
||||
#define READ_IOPORT(p) inb(p)
|
||||
#endif /* !DEBUG */
|
||||
|
||||
|
||||
|
||||
#define INIT_LENGTH 32
|
||||
|
||||
#define INITDATA { 0x6a, 0xb5, 0xda, 0xed, 0xf6, 0xfb, 0x7d, 0xbe,\
|
||||
0xdf, 0x6f, 0x37, 0x1b, 0x0d, 0x86, 0xc3, 0x61,\
|
||||
0xb0, 0x58, 0x2c, 0x16, 0x8b, 0x45, 0xa2, 0xd1,\
|
||||
0xe8, 0x74, 0x3a, 0x9d, 0xce, 0xe7, 0x73, 0x39 }
|
||||
|
||||
/* Registers */
|
||||
#define SetRdPort(x) (ADDRESS(0x00),WRITE_DATA((x)>>2),read_port=((x)|3))
|
||||
#define SERIALISOLATION ADDRESS(0x01)
|
||||
#define CONFIGCONTROL ADDRESS(0x02)
|
||||
#define Wake(x) (ADDRESS(0x03),WRITE_DATA(x))
|
||||
#define RESOURCEDATA (ADDRESS(0x04),READ_DATA)
|
||||
#define STATUS (ADDRESS(0x05),READ_DATA)
|
||||
#define CARDSELECTNUMBER ADDRESS(0x06)
|
||||
#define LOGICALDEVICENUMBER ADDRESS(0x07)
|
||||
#define ACTIVATE ADDRESS(0x30)
|
||||
#define IORANGECHECK ADDRESS(0x31)
|
||||
|
||||
/* Bits */
|
||||
#define CONFIG_RESET 0x01
|
||||
#define CONFIG_WAIT_FOR_KEY 0x02
|
||||
#define CONFIG_RESET_CSN 0x04
|
||||
#define CONFIG_RESET_DRV 0x07
|
||||
|
||||
/* Short Tags */
|
||||
#define PnPVerNo_TAG 0x01
|
||||
#define LogDevId_TAG 0x02
|
||||
#define CompatDevId_TAG 0x03
|
||||
#define IRQ_TAG 0x04
|
||||
#define DMA_TAG 0x05
|
||||
#define StartDep_TAG 0x06
|
||||
#define EndDep_TAG 0x07
|
||||
#define IOport_TAG 0x08
|
||||
#define FixedIO_TAG 0x09
|
||||
#define RsvdShortA_TAG 0x0A
|
||||
#define RsvdShortB_TAG 0x0B
|
||||
#define RsvdShortC_TAG 0x0C
|
||||
#define RsvdShortD_TAG 0x0D
|
||||
#define VendorShort_TAG 0x0E
|
||||
#define End_TAG 0x0F
|
||||
/* Long Tags */
|
||||
#define MemRange_TAG 0x81
|
||||
#define ANSIstr_TAG 0x82
|
||||
#define UNICODEstr_TAG 0x83
|
||||
#define VendorLong_TAG 0x84
|
||||
#define Mem32Range_TAG 0x85
|
||||
#define FixedMem32Range_TAG 0x86
|
||||
#define RsvdLong0_TAG 0xF0
|
||||
#define RsvdLong1_TAG 0xF1
|
||||
#define RsvdLong2_TAG 0xF2
|
||||
#define RsvdLong3_TAG 0xF3
|
||||
#define RsvdLong4_TAG 0xF4
|
||||
#define RsvdLong5_TAG 0xF5
|
||||
#define RsvdLong6_TAG 0xF6
|
||||
#define RsvdLong7_TAG 0xF7
|
||||
#define RsvdLong8_TAG 0xF8
|
||||
#define RsvdLong9_TAG 0xF9
|
||||
#define RsvdLongA_TAG 0xFA
|
||||
#define RsvdLongB_TAG 0xFB
|
||||
#define RsvdLongC_TAG 0xFC
|
||||
#define RsvdLongD_TAG 0xFD
|
||||
#define RsvdLongE_TAG 0xFE
|
||||
#define RsvdLongF_TAG 0xFF
|
||||
#define NewBoard_PSEUDOTAG 0x100
|
||||
42
src/include/lib.h
Normal file
42
src/include/lib.h
Normal file
@@ -0,0 +1,42 @@
|
||||
#ifndef LIB_H
|
||||
#define LIB_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
int getline(char *buf, int max);
|
||||
|
||||
extern struct pci_device *dev_list;
|
||||
extern int n_devs;
|
||||
|
||||
extern void pci_init(void);
|
||||
extern struct pci_device *pci_find_device(int vendor, int device, int devclass,
|
||||
int prog_if, int index);
|
||||
|
||||
void *calloc(size_t nmemb, size_t size);
|
||||
void *realloc(void *ptr, size_t size);
|
||||
|
||||
char *strdup(const char *s);
|
||||
|
||||
int isspace(int c);
|
||||
|
||||
unsigned long long simple_strtoull(const char *cp,char **endp,unsigned int base);
|
||||
unsigned long long strtoull_with_suffix(const char *cp,char **endp,unsigned int base);
|
||||
|
||||
unsigned int get_le32(const unsigned char *);
|
||||
unsigned int get_le16(const unsigned char *);
|
||||
void hexdump(const void *p, unsigned int len);
|
||||
|
||||
long long simple_strtoll(const char *cp,char **endp,unsigned int base);
|
||||
|
||||
#define LOADER_NOT_SUPPORT 0xbadf11e
|
||||
|
||||
struct sys_info;
|
||||
int elf_load(struct sys_info *, const char *filename, const char *cmdline);
|
||||
|
||||
#if LINUX_LOADER
|
||||
int linux_load(struct sys_info *, const char *filename, const char *cmdline);
|
||||
#else
|
||||
#define linux_load(x,y,z) LOADER_NOT_SUPPORT /* nop */
|
||||
#endif
|
||||
|
||||
#endif /* LIB_H */
|
||||
17
src/include/little_bswap.h
Normal file
17
src/include/little_bswap.h
Normal file
@@ -0,0 +1,17 @@
|
||||
#ifndef ETHERBOOT_LITTLE_BSWAP_H
|
||||
#define ETHERBOOT_LITTLE_BSWAP_H
|
||||
|
||||
#define ntohl(x) __bswap_32(x)
|
||||
#define htonl(x) __bswap_32(x)
|
||||
#define ntohs(x) __bswap_16(x)
|
||||
#define htons(x) __bswap_16(x)
|
||||
#define cpu_to_le32(x) (x)
|
||||
#define cpu_to_le16(x) (x)
|
||||
#define cpu_to_be32(x) __bswap_32(x)
|
||||
#define cpu_to_be16(x) __bswap_16(x)
|
||||
#define le32_to_cpu(x) (x)
|
||||
#define le16_to_cpu(x) (x)
|
||||
#define be32_to_cpu(x) __bswap_32(x)
|
||||
#define be16_to_cpu(x) __bswap_16(x)
|
||||
|
||||
#endif /* ETHERBOOT_LITTLE_BSWAP_H */
|
||||
105
src/include/mii.h
Normal file
105
src/include/mii.h
Normal file
@@ -0,0 +1,105 @@
|
||||
/*
|
||||
* linux/mii.h: definitions for MII-compatible transceivers
|
||||
* Originally drivers/net/sunhme.h.
|
||||
*
|
||||
* Copyright (C) 1996, 1999, 2001 David S. Miller (davem@redhat.com)
|
||||
*
|
||||
* Copied Form Linux 2.4.25 an unneeded items removed by:
|
||||
* Timothy Legge (timlegge at etherboot dot org)
|
||||
*
|
||||
* 03/26/2004
|
||||
*/
|
||||
|
||||
/* Generic MII registers. */
|
||||
|
||||
#define MII_BMCR 0x00 /* Basic mode control register */
|
||||
#define MII_BMSR 0x01 /* Basic mode status register */
|
||||
#define MII_PHYSID1 0x02 /* PHYS ID 1 */
|
||||
#define MII_PHYSID2 0x03 /* PHYS ID 2 */
|
||||
#define MII_ADVERTISE 0x04 /* Advertisement control reg */
|
||||
#define MII_LPA 0x05 /* Link partner ability reg */
|
||||
#define MII_EXPANSION 0x06 /* Expansion register */
|
||||
#define MII_DCOUNTER 0x12 /* Disconnect counter */
|
||||
#define MII_FCSCOUNTER 0x13 /* False carrier counter */
|
||||
#define MII_NWAYTEST 0x14 /* N-way auto-neg test reg */
|
||||
#define MII_RERRCOUNTER 0x15 /* Receive error counter */
|
||||
#define MII_SREVISION 0x16 /* Silicon revision */
|
||||
#define MII_RESV1 0x17 /* Reserved... */
|
||||
#define MII_LBRERROR 0x18 /* Lpback, rx, bypass error */
|
||||
#define MII_PHYADDR 0x19 /* PHY address */
|
||||
#define MII_RESV2 0x1a /* Reserved... */
|
||||
#define MII_TPISTATUS 0x1b /* TPI status for 10mbps */
|
||||
#define MII_NCONFIG 0x1c /* Network interface config */
|
||||
|
||||
/* Basic mode control register. */
|
||||
#define BMCR_RESV 0x007f /* Unused... */
|
||||
#define BMCR_CTST 0x0080 /* Collision test */
|
||||
#define BMCR_FULLDPLX 0x0100 /* Full duplex */
|
||||
#define BMCR_ANRESTART 0x0200 /* Auto negotiation restart */
|
||||
#define BMCR_ISOLATE 0x0400 /* Disconnect DP83840 from MII */
|
||||
#define BMCR_PDOWN 0x0800 /* Powerdown the DP83840 */
|
||||
#define BMCR_ANENABLE 0x1000 /* Enable auto negotiation */
|
||||
#define BMCR_SPEED100 0x2000 /* Select 100Mbps */
|
||||
#define BMCR_LOOPBACK 0x4000 /* TXD loopback bits */
|
||||
#define BMCR_RESET 0x8000 /* Reset the DP83840 */
|
||||
|
||||
/* Basic mode status register. */
|
||||
#define BMSR_ERCAP 0x0001 /* Ext-reg capability */
|
||||
#define BMSR_JCD 0x0002 /* Jabber detected */
|
||||
#define BMSR_LSTATUS 0x0004 /* Link status */
|
||||
#define BMSR_ANEGCAPABLE 0x0008 /* Able to do auto-negotiation */
|
||||
#define BMSR_RFAULT 0x0010 /* Remote fault detected */
|
||||
#define BMSR_ANEGCOMPLETE 0x0020 /* Auto-negotiation complete */
|
||||
#define BMSR_RESV 0x07c0 /* Unused... */
|
||||
#define BMSR_10HALF 0x0800 /* Can do 10mbps, half-duplex */
|
||||
#define BMSR_10FULL 0x1000 /* Can do 10mbps, full-duplex */
|
||||
#define BMSR_100HALF 0x2000 /* Can do 100mbps, half-duplex */
|
||||
#define BMSR_100FULL 0x4000 /* Can do 100mbps, full-duplex */
|
||||
#define BMSR_100BASE4 0x8000 /* Can do 100mbps, 4k packets */
|
||||
|
||||
/* Advertisement control register. */
|
||||
#define ADVERTISE_SLCT 0x001f /* Selector bits */
|
||||
#define ADVERTISE_CSMA 0x0001 /* Only selector supported */
|
||||
#define ADVERTISE_10HALF 0x0020 /* Try for 10mbps half-duplex */
|
||||
#define ADVERTISE_10FULL 0x0040 /* Try for 10mbps full-duplex */
|
||||
#define ADVERTISE_100HALF 0x0080 /* Try for 100mbps half-duplex */
|
||||
#define ADVERTISE_100FULL 0x0100 /* Try for 100mbps full-duplex */
|
||||
#define ADVERTISE_100BASE4 0x0200 /* Try for 100mbps 4k packets */
|
||||
#define ADVERTISE_RESV 0x1c00 /* Unused... */
|
||||
#define ADVERTISE_RFAULT 0x2000 /* Say we can detect faults */
|
||||
#define ADVERTISE_LPACK 0x4000 /* Ack link partners response */
|
||||
#define ADVERTISE_NPAGE 0x8000 /* Next page bit */
|
||||
|
||||
#define ADVERTISE_FULL (ADVERTISE_100FULL | ADVERTISE_10FULL | \
|
||||
ADVERTISE_CSMA)
|
||||
#define ADVERTISE_ALL (ADVERTISE_10HALF | ADVERTISE_10FULL | \
|
||||
ADVERTISE_100HALF | ADVERTISE_100FULL)
|
||||
|
||||
/* Link partner ability register. */
|
||||
#define LPA_SLCT 0x001f /* Same as advertise selector */
|
||||
#define LPA_10HALF 0x0020 /* Can do 10mbps half-duplex */
|
||||
#define LPA_10FULL 0x0040 /* Can do 10mbps full-duplex */
|
||||
#define LPA_100HALF 0x0080 /* Can do 100mbps half-duplex */
|
||||
#define LPA_100FULL 0x0100 /* Can do 100mbps full-duplex */
|
||||
#define LPA_100BASE4 0x0200 /* Can do 100mbps 4k packets */
|
||||
#define LPA_RESV 0x1c00 /* Unused... */
|
||||
#define LPA_RFAULT 0x2000 /* Link partner faulted */
|
||||
#define LPA_LPACK 0x4000 /* Link partner acked us */
|
||||
#define LPA_NPAGE 0x8000 /* Next page bit */
|
||||
|
||||
#define LPA_DUPLEX (LPA_10FULL | LPA_100FULL)
|
||||
#define LPA_100 (LPA_100FULL | LPA_100HALF | LPA_100BASE4)
|
||||
|
||||
/* Expansion register for auto-negotiation. */
|
||||
#define EXPANSION_NWAY 0x0001 /* Can do N-way auto-nego */
|
||||
#define EXPANSION_LCWP 0x0002 /* Got new RX page code word */
|
||||
#define EXPANSION_ENABLENPAGE 0x0004 /* This enables npage words */
|
||||
#define EXPANSION_NPCAPABLE 0x0008 /* Link partner supports npage */
|
||||
#define EXPANSION_MFAULTS 0x0010 /* Multiple faults detected */
|
||||
#define EXPANSION_RESV 0xffe0 /* Unused... */
|
||||
|
||||
/* N-way test register. */
|
||||
#define NWAYTEST_RESV1 0x00ff /* Unused... */
|
||||
#define NWAYTEST_LOOPBACK 0x0100 /* Enable loopback for N-way */
|
||||
#define NWAYTEST_RESV2 0xfe00 /* Unused... */
|
||||
|
||||
63
src/include/nfs.h
Normal file
63
src/include/nfs.h
Normal file
@@ -0,0 +1,63 @@
|
||||
#ifndef _NFS_H
|
||||
#define _NFS_H
|
||||
|
||||
#define SUNRPC_PORT 111
|
||||
|
||||
#define PROG_PORTMAP 100000
|
||||
#define PROG_NFS 100003
|
||||
#define PROG_MOUNT 100005
|
||||
|
||||
#define MSG_CALL 0
|
||||
#define MSG_REPLY 1
|
||||
|
||||
#define PORTMAP_GETPORT 3
|
||||
|
||||
#define MOUNT_ADDENTRY 1
|
||||
#define MOUNT_UMOUNTALL 4
|
||||
|
||||
#define NFS_LOOKUP 4
|
||||
#define NFS_READLINK 5
|
||||
#define NFS_READ 6
|
||||
|
||||
#define NFS_FHSIZE 32
|
||||
|
||||
#define NFSERR_PERM 1
|
||||
#define NFSERR_NOENT 2
|
||||
#define NFSERR_ACCES 13
|
||||
#define NFSERR_ISDIR 21
|
||||
#define NFSERR_INVAL 22
|
||||
|
||||
/* Block size used for NFS read accesses. A RPC reply packet (including all
|
||||
* headers) must fit within a single Ethernet frame to avoid fragmentation.
|
||||
* Chosen to be a power of two, as most NFS servers are optimized for this. */
|
||||
#define NFS_READ_SIZE 1024
|
||||
|
||||
#define NFS_MAXLINKDEPTH 16
|
||||
|
||||
struct rpc_t {
|
||||
struct iphdr ip;
|
||||
struct udphdr udp;
|
||||
union {
|
||||
uint8_t data[300]; /* longest RPC call must fit!!!! */
|
||||
struct {
|
||||
uint32_t id;
|
||||
uint32_t type;
|
||||
uint32_t rpcvers;
|
||||
uint32_t prog;
|
||||
uint32_t vers;
|
||||
uint32_t proc;
|
||||
uint32_t data[1];
|
||||
} call;
|
||||
struct {
|
||||
uint32_t id;
|
||||
uint32_t type;
|
||||
uint32_t rstatus;
|
||||
uint32_t verifier;
|
||||
uint32_t v2;
|
||||
uint32_t astatus;
|
||||
uint32_t data[1];
|
||||
} reply;
|
||||
} u;
|
||||
} PACKED;
|
||||
|
||||
#endif /* _NFS_H */
|
||||
49
src/include/nic.h
Normal file
49
src/include/nic.h
Normal file
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2, or (at
|
||||
* your option) any later version.
|
||||
*/
|
||||
|
||||
#ifndef NIC_H
|
||||
#define NIC_H
|
||||
|
||||
#include "dev.h"
|
||||
|
||||
typedef enum {
|
||||
DISABLE = 0,
|
||||
ENABLE,
|
||||
FORCE
|
||||
} irq_action_t;
|
||||
|
||||
/*
|
||||
* Structure returned from eth_probe and passed to other driver
|
||||
* functions.
|
||||
*/
|
||||
struct nic
|
||||
{
|
||||
struct dev dev; /* This must come first */
|
||||
int (*poll)P((struct nic *, int retrieve));
|
||||
void (*transmit)P((struct nic *, const char *d,
|
||||
unsigned int t, unsigned int s, const char *p));
|
||||
void (*irq)P((struct nic *, irq_action_t));
|
||||
int flags; /* driver specific flags */
|
||||
struct rom_info *rom_info; /* -> rom_info from main */
|
||||
unsigned char *node_addr;
|
||||
unsigned char *packet;
|
||||
unsigned int packetlen;
|
||||
unsigned int ioaddr;
|
||||
unsigned char irqno;
|
||||
void *priv_data; /* driver can hang private data here */
|
||||
};
|
||||
|
||||
|
||||
extern struct nic nic;
|
||||
extern int eth_probe(struct dev *dev);
|
||||
extern int eth_poll(int retrieve);
|
||||
extern void eth_transmit(const char *d, unsigned int t, unsigned int s, const void *p);
|
||||
extern void eth_disable(void);
|
||||
extern void eth_irq(irq_action_t action);
|
||||
extern int eth_load_configuration(struct dev *dev);
|
||||
extern int eth_load(struct dev *dev);;
|
||||
#endif /* NIC_H */
|
||||
43
src/include/osdep.h
Normal file
43
src/include/osdep.h
Normal file
@@ -0,0 +1,43 @@
|
||||
#ifndef ETHERBOOT_OSDEP_H
|
||||
#define ETHERBOOT_OSDEP_H
|
||||
|
||||
#define __unused __attribute__((unused))
|
||||
#define __aligned __attribute__((aligned(16)))
|
||||
#define PACKED __attribute__((packed))
|
||||
|
||||
/* Optimization barrier */
|
||||
/* The "volatile" is due to gcc bugs */
|
||||
#define barrier() __asm__ __volatile__("": : :"memory")
|
||||
|
||||
#include "stdint.h"
|
||||
#include "limits.h"
|
||||
#include "string.h"
|
||||
#include "io.h"
|
||||
#include "endian.h"
|
||||
#include "byteswap.h"
|
||||
#include "setjmp.h"
|
||||
#include "latch.h"
|
||||
#include "callbacks.h"
|
||||
#include "hooks.h"
|
||||
|
||||
/* within 1MB of 4GB is too close.
|
||||
* MAX_ADDR is the maximum address we can easily do DMA to.
|
||||
*/
|
||||
#define MAX_ADDR (0xfff00000UL)
|
||||
|
||||
typedef unsigned long Address;
|
||||
|
||||
/* ANSI prototyping macro */
|
||||
#ifdef __STDC__
|
||||
#define P(x) x
|
||||
#else
|
||||
#define P(x) ()
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* c-basic-offset: 8
|
||||
* End:
|
||||
*/
|
||||
7
src/include/pc_kbd.h
Normal file
7
src/include/pc_kbd.h
Normal file
@@ -0,0 +1,7 @@
|
||||
#ifndef _PC_KBD_H
|
||||
#define _PC_KBD_H
|
||||
|
||||
int kbd_ischar(void);
|
||||
|
||||
int kbd_getc(void);
|
||||
#endif
|
||||
362
src/include/pci.h
Normal file
362
src/include/pci.h
Normal file
@@ -0,0 +1,362 @@
|
||||
#ifndef PCI_H
|
||||
#define PCI_H
|
||||
|
||||
/*
|
||||
** Support for NE2000 PCI clones added David Monro June 1997
|
||||
** Generalised for other PCI NICs by Ken Yap July 1997
|
||||
**
|
||||
** Most of this is taken from:
|
||||
**
|
||||
** /usr/src/linux/drivers/pci/pci.c
|
||||
** /usr/src/linux/include/linux/pci.h
|
||||
** /usr/src/linux/arch/i386/bios32.c
|
||||
** /usr/src/linux/include/linux/bios32.h
|
||||
** /usr/src/linux/drivers/net/ne.c
|
||||
*/
|
||||
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2, or (at
|
||||
* your option) any later version.
|
||||
*/
|
||||
|
||||
#include "pci_ids.h"
|
||||
|
||||
#define PCI_COMMAND_IO 0x1 /* Enable response in I/O space */
|
||||
#define PCI_COMMAND_MEM 0x2 /* Enable response in mem space */
|
||||
#define PCI_COMMAND_MASTER 0x4 /* Enable bus mastering */
|
||||
#define PCI_LATENCY_TIMER 0x0d /* 8 bits */
|
||||
#define PCI_COMMAND_SPECIAL 0x8 /* Enable response to special cycles */
|
||||
#define PCI_COMMAND_INVALIDATE 0x10 /* Use memory write and invalidate */
|
||||
#define PCI_COMMAND_VGA_PALETTE 0x20 /* Enable palette snooping */
|
||||
#define PCI_COMMAND_PARITY 0x40 /* Enable parity checking */
|
||||
#define PCI_COMMAND_WAIT 0x80 /* Enable address/data stepping */
|
||||
#define PCI_COMMAND_SERR 0x100 /* Enable SERR */
|
||||
#define PCI_COMMAND_FAST_BACK 0x200 /* Enable back-to-back writes */
|
||||
|
||||
#define PCIBIOS_PCI_FUNCTION_ID 0xb1XX
|
||||
#define PCIBIOS_PCI_BIOS_PRESENT 0xb101
|
||||
#define PCIBIOS_FIND_PCI_DEVICE 0xb102
|
||||
#define PCIBIOS_FIND_PCI_CLASS_CODE 0xb103
|
||||
#define PCIBIOS_GENERATE_SPECIAL_CYCLE 0xb106
|
||||
#define PCIBIOS_READ_CONFIG_BYTE 0xb108
|
||||
#define PCIBIOS_READ_CONFIG_WORD 0xb109
|
||||
#define PCIBIOS_READ_CONFIG_DWORD 0xb10a
|
||||
#define PCIBIOS_WRITE_CONFIG_BYTE 0xb10b
|
||||
#define PCIBIOS_WRITE_CONFIG_WORD 0xb10c
|
||||
#define PCIBIOS_WRITE_CONFIG_DWORD 0xb10d
|
||||
|
||||
#define PCI_VENDOR_ID 0x00 /* 16 bits */
|
||||
#define PCI_DEVICE_ID 0x02 /* 16 bits */
|
||||
#define PCI_COMMAND 0x04 /* 16 bits */
|
||||
|
||||
#define PCI_STATUS 0x06 /* 16 bits */
|
||||
#define PCI_STATUS_CAP_LIST 0x10 /* Support Capability List */
|
||||
#define PCI_STATUS_66MHZ 0x20 /* Support 66 Mhz PCI 2.1 bus */
|
||||
#define PCI_STATUS_UDF 0x40 /* Support User Definable Features [obsolete] */
|
||||
#define PCI_STATUS_FAST_BACK 0x80 /* Accept fast-back to back */
|
||||
#define PCI_STATUS_PARITY 0x100 /* Detected parity error */
|
||||
#define PCI_STATUS_DEVSEL_MASK 0x600 /* DEVSEL timing */
|
||||
#define PCI_STATUS_DEVSEL_FAST 0x000
|
||||
#define PCI_STATUS_DEVSEL_MEDIUM 0x200
|
||||
#define PCI_STATUS_DEVSEL_SLOW 0x400
|
||||
#define PCI_STATUS_SIG_TARGET_ABORT 0x800 /* Set on target abort */
|
||||
#define PCI_STATUS_REC_TARGET_ABORT 0x1000 /* Master ack of " */
|
||||
#define PCI_STATUS_REC_MASTER_ABORT 0x2000 /* Set on master abort */
|
||||
#define PCI_STATUS_SIG_SYSTEM_ERROR 0x4000 /* Set when we drive SERR */
|
||||
#define PCI_STATUS_DETECTED_PARITY 0x8000 /* Set on parity error */
|
||||
|
||||
#define PCI_REVISION 0x08 /* 8 bits */
|
||||
#define PCI_REVISION_ID 0x08 /* 8 bits */
|
||||
#define PCI_CLASS_REVISION 0x08 /* 32 bits */
|
||||
#define PCI_CLASS_CODE 0x0b /* 8 bits */
|
||||
#define PCI_SUBCLASS_CODE 0x0a /* 8 bits */
|
||||
#define PCI_HEADER_TYPE 0x0e /* 8 bits */
|
||||
#define PCI_HEADER_TYPE_NORMAL 0
|
||||
#define PCI_HEADER_TYPE_BRIDGE 1
|
||||
#define PCI_HEADER_TYPE_CARDBUS 2
|
||||
|
||||
|
||||
/* Header type 0 (normal devices) */
|
||||
#define PCI_CARDBUS_CIS 0x28
|
||||
#define PCI_SUBSYSTEM_VENDOR_ID 0x2c
|
||||
#define PCI_SUBSYSTEM_ID 0x2e
|
||||
|
||||
#define PCI_BASE_ADDRESS_0 0x10 /* 32 bits */
|
||||
#define PCI_BASE_ADDRESS_1 0x14 /* 32 bits */
|
||||
#define PCI_BASE_ADDRESS_2 0x18 /* 32 bits */
|
||||
#define PCI_BASE_ADDRESS_3 0x1c /* 32 bits */
|
||||
#define PCI_BASE_ADDRESS_4 0x20 /* 32 bits */
|
||||
#define PCI_BASE_ADDRESS_5 0x24 /* 32 bits */
|
||||
|
||||
#define PCI_BASE_ADDRESS_MEM_TYPE_MASK 0x06
|
||||
#define PCI_BASE_ADDRESS_MEM_TYPE_32 0x00 /* 32 bit address */
|
||||
#define PCI_BASE_ADDRESS_MEM_TYPE_1M 0x02 /* Below 1M [obsolete] */
|
||||
#define PCI_BASE_ADDRESS_MEM_TYPE_64 0x04 /* 64 bit address */
|
||||
|
||||
#ifndef PCI_BASE_ADDRESS_IO_MASK
|
||||
#define PCI_BASE_ADDRESS_IO_MASK (~0x03)
|
||||
#endif
|
||||
#ifndef PCI_BASE_ADDRESS_MEM_MASK
|
||||
#define PCI_BASE_ADDRESS_MEM_MASK (~0x0f)
|
||||
#endif
|
||||
#define PCI_BASE_ADDRESS_SPACE_IO 0x01
|
||||
#define PCI_ROM_ADDRESS 0x30 /* 32 bits */
|
||||
#define PCI_ROM_ADDRESS_ENABLE 0x01 /* Write 1 to enable ROM,
|
||||
bits 31..11 are address,
|
||||
10..2 are reserved */
|
||||
|
||||
#define PCI_CAPABILITY_LIST 0x34 /* Offset of first capability list entry */
|
||||
|
||||
#define PCI_INTERRUPT_LINE 0x3c /* IRQ number (0-15) */
|
||||
#define PCI_INTERRUPT_PIN 0x3d /* IRQ pin on PCI bus (A-D) */
|
||||
|
||||
/* Header type 1 (PCI-to-PCI bridges) */
|
||||
#define PCI_PRIMARY_BUS 0x18 /* Primary bus number */
|
||||
#define PCI_SECONDARY_BUS 0x19 /* Secondary bus number */
|
||||
#define PCI_SUBORDINATE_BUS 0x1a /* Highest bus number behind the bridge */
|
||||
#define PCI_SEC_LATENCY_TIMER 0x1b /* Latency timer for secondary interface */
|
||||
#define PCI_IO_BASE 0x1c /* I/O range behind the bridge */
|
||||
#define PCI_IO_LIMIT 0x1d
|
||||
#define PCI_IO_RANGE_TYPE_MASK 0x0f /* I/O bridging type */
|
||||
#define PCI_IO_RANGE_TYPE_16 0x00
|
||||
#define PCI_IO_RANGE_TYPE_32 0x01
|
||||
#define PCI_IO_RANGE_MASK ~0x0f
|
||||
#define PCI_SEC_STATUS 0x1e /* Secondary status register, only bit 14 used */
|
||||
#define PCI_MEMORY_BASE 0x20 /* Memory range behind */
|
||||
#define PCI_MEMORY_LIMIT 0x22
|
||||
#define PCI_MEMORY_RANGE_TYPE_MASK 0x0f
|
||||
#define PCI_MEMORY_RANGE_MASK ~0x0f
|
||||
#define PCI_PREF_MEMORY_BASE 0x24 /* Prefetchable memory range behind */
|
||||
#define PCI_PREF_MEMORY_LIMIT 0x26
|
||||
#define PCI_PREF_RANGE_TYPE_MASK 0x0f
|
||||
#define PCI_PREF_RANGE_TYPE_32 0x00
|
||||
#define PCI_PREF_RANGE_TYPE_64 0x01
|
||||
#define PCI_PREF_RANGE_MASK ~0x0f
|
||||
#define PCI_PREF_BASE_UPPER32 0x28 /* Upper half of prefetchable memory range */
|
||||
#define PCI_PREF_LIMIT_UPPER32 0x2c
|
||||
#define PCI_IO_BASE_UPPER16 0x30 /* Upper half of I/O addresses */
|
||||
#define PCI_IO_LIMIT_UPPER16 0x32
|
||||
/* 0x34 same as for htype 0 */
|
||||
/* 0x35-0x3b is reserved */
|
||||
#define PCI_ROM_ADDRESS1 0x38 /* Same as PCI_ROM_ADDRESS, but for htype 1 */
|
||||
/* 0x3c-0x3d are same as for htype 0 */
|
||||
#define PCI_BRIDGE_CONTROL 0x3e
|
||||
#define PCI_BRIDGE_CTL_PARITY 0x01 /* Enable parity detection on secondary interface */
|
||||
#define PCI_BRIDGE_CTL_SERR 0x02 /* The same for SERR forwarding */
|
||||
#define PCI_BRIDGE_CTL_NO_ISA 0x04 /* Disable bridging of ISA ports */
|
||||
#define PCI_BRIDGE_CTL_VGA 0x08 /* Forward VGA addresses */
|
||||
#define PCI_BRIDGE_CTL_MASTER_ABORT 0x20 /* Report master aborts */
|
||||
#define PCI_BRIDGE_CTL_BUS_RESET 0x40 /* Secondary bus reset */
|
||||
#define PCI_BRIDGE_CTL_FAST_BACK 0x80 /* Fast Back2Back enabled on secondary interface */
|
||||
|
||||
#define PCI_CB_CAPABILITY_LIST 0x14
|
||||
|
||||
/* Capability lists */
|
||||
|
||||
#define PCI_CAP_LIST_ID 0 /* Capability ID */
|
||||
#define PCI_CAP_ID_PM 0x01 /* Power Management */
|
||||
#define PCI_CAP_ID_AGP 0x02 /* Accelerated Graphics Port */
|
||||
#define PCI_CAP_ID_VPD 0x03 /* Vital Product Data */
|
||||
#define PCI_CAP_ID_SLOTID 0x04 /* Slot Identification */
|
||||
#define PCI_CAP_ID_MSI 0x05 /* Message Signalled Interrupts */
|
||||
#define PCI_CAP_ID_CHSWP 0x06 /* CompactPCI HotSwap */
|
||||
#define PCI_CAP_LIST_NEXT 1 /* Next capability in the list */
|
||||
#define PCI_CAP_FLAGS 2 /* Capability defined flags (16 bits) */
|
||||
#define PCI_CAP_SIZEOF 4
|
||||
|
||||
/* Power Management Registers */
|
||||
|
||||
#define PCI_PM_PMC 2 /* PM Capabilities Register */
|
||||
#define PCI_PM_CAP_VER_MASK 0x0007 /* Version */
|
||||
#define PCI_PM_CAP_PME_CLOCK 0x0008 /* PME clock required */
|
||||
#define PCI_PM_CAP_RESERVED 0x0010 /* Reserved field */
|
||||
#define PCI_PM_CAP_DSI 0x0020 /* Device specific initialization */
|
||||
#define PCI_PM_CAP_AUX_POWER 0x01C0 /* Auxilliary power support mask */
|
||||
#define PCI_PM_CAP_D1 0x0200 /* D1 power state support */
|
||||
#define PCI_PM_CAP_D2 0x0400 /* D2 power state support */
|
||||
#define PCI_PM_CAP_PME 0x0800 /* PME pin supported */
|
||||
#define PCI_PM_CAP_PME_MASK 0xF800 /* PME Mask of all supported states */
|
||||
#define PCI_PM_CAP_PME_D0 0x0800 /* PME# from D0 */
|
||||
#define PCI_PM_CAP_PME_D1 0x1000 /* PME# from D1 */
|
||||
#define PCI_PM_CAP_PME_D2 0x2000 /* PME# from D2 */
|
||||
#define PCI_PM_CAP_PME_D3 0x4000 /* PME# from D3 (hot) */
|
||||
#define PCI_PM_CAP_PME_D3cold 0x8000 /* PME# from D3 (cold) */
|
||||
#define PCI_PM_CTRL 4 /* PM control and status register */
|
||||
#define PCI_PM_CTRL_STATE_MASK 0x0003 /* Current power state (D0 to D3) */
|
||||
#define PCI_PM_CTRL_PME_ENABLE 0x0100 /* PME pin enable */
|
||||
#define PCI_PM_CTRL_DATA_SEL_MASK 0x1e00 /* Data select (??) */
|
||||
#define PCI_PM_CTRL_DATA_SCALE_MASK 0x6000 /* Data scale (??) */
|
||||
#define PCI_PM_CTRL_PME_STATUS 0x8000 /* PME pin status */
|
||||
#define PCI_PM_PPB_EXTENSIONS 6 /* PPB support extensions (??) */
|
||||
#define PCI_PM_PPB_B2_B3 0x40 /* Stop clock when in D3hot (??) */
|
||||
#define PCI_PM_BPCC_ENABLE 0x80 /* Bus power/clock control enable (??) */
|
||||
#define PCI_PM_DATA_REGISTER 7 /* (??) */
|
||||
#define PCI_PM_SIZEOF 8
|
||||
|
||||
/* AGP registers */
|
||||
|
||||
#define PCI_AGP_VERSION 2 /* BCD version number */
|
||||
#define PCI_AGP_RFU 3 /* Rest of capability flags */
|
||||
#define PCI_AGP_STATUS 4 /* Status register */
|
||||
#define PCI_AGP_STATUS_RQ_MASK 0xff000000 /* Maximum number of requests - 1 */
|
||||
#define PCI_AGP_STATUS_SBA 0x0200 /* Sideband addressing supported */
|
||||
#define PCI_AGP_STATUS_64BIT 0x0020 /* 64-bit addressing supported */
|
||||
#define PCI_AGP_STATUS_FW 0x0010 /* FW transfers supported */
|
||||
#define PCI_AGP_STATUS_RATE4 0x0004 /* 4x transfer rate supported */
|
||||
#define PCI_AGP_STATUS_RATE2 0x0002 /* 2x transfer rate supported */
|
||||
#define PCI_AGP_STATUS_RATE1 0x0001 /* 1x transfer rate supported */
|
||||
#define PCI_AGP_COMMAND 8 /* Control register */
|
||||
#define PCI_AGP_COMMAND_RQ_MASK 0xff000000 /* Master: Maximum number of requests */
|
||||
#define PCI_AGP_COMMAND_SBA 0x0200 /* Sideband addressing enabled */
|
||||
#define PCI_AGP_COMMAND_AGP 0x0100 /* Allow processing of AGP transactions */
|
||||
#define PCI_AGP_COMMAND_64BIT 0x0020 /* Allow processing of 64-bit addresses */
|
||||
#define PCI_AGP_COMMAND_FW 0x0010 /* Force FW transfers */
|
||||
#define PCI_AGP_COMMAND_RATE4 0x0004 /* Use 4x rate */
|
||||
#define PCI_AGP_COMMAND_RATE2 0x0002 /* Use 2x rate */
|
||||
#define PCI_AGP_COMMAND_RATE1 0x0001 /* Use 1x rate */
|
||||
#define PCI_AGP_SIZEOF 12
|
||||
|
||||
/* Slot Identification */
|
||||
|
||||
#define PCI_SID_ESR 2 /* Expansion Slot Register */
|
||||
#define PCI_SID_ESR_NSLOTS 0x1f /* Number of expansion slots available */
|
||||
#define PCI_SID_ESR_FIC 0x20 /* First In Chassis Flag */
|
||||
#define PCI_SID_CHASSIS_NR 3 /* Chassis Number */
|
||||
|
||||
/* Message Signalled Interrupts registers */
|
||||
|
||||
#define PCI_MSI_FLAGS 2 /* Various flags */
|
||||
#define PCI_MSI_FLAGS_64BIT 0x80 /* 64-bit addresses allowed */
|
||||
#define PCI_MSI_FLAGS_QSIZE 0x70 /* Message queue size configured */
|
||||
#define PCI_MSI_FLAGS_QMASK 0x0e /* Maximum queue size available */
|
||||
#define PCI_MSI_FLAGS_ENABLE 0x01 /* MSI feature enabled */
|
||||
#define PCI_MSI_RFU 3 /* Rest of capability flags */
|
||||
#define PCI_MSI_ADDRESS_LO 4 /* Lower 32 bits */
|
||||
#define PCI_MSI_ADDRESS_HI 8 /* Upper 32 bits (if PCI_MSI_FLAGS_64BIT set) */
|
||||
#define PCI_MSI_DATA_32 8 /* 16 bits of data for 32-bit devices */
|
||||
#define PCI_MSI_DATA_64 12 /* 16 bits of data for 64-bit devices */
|
||||
|
||||
#define PCI_SLOT(devfn) ((devfn) >> 3)
|
||||
#define PCI_FUNC(devfn) ((devfn) & 0x07)
|
||||
|
||||
#define BIOS32_SIGNATURE (('_' << 0) + ('3' << 8) + ('2' << 16) + ('_' << 24))
|
||||
|
||||
/* PCI signature: "PCI " */
|
||||
#define PCI_SIGNATURE (('P' << 0) + ('C' << 8) + ('I' << 16) + (' ' << 24))
|
||||
|
||||
/* PCI service signature: "$PCI" */
|
||||
#define PCI_SERVICE (('$' << 0) + ('P' << 8) + ('C' << 16) + ('I' << 24))
|
||||
|
||||
union bios32 {
|
||||
struct {
|
||||
unsigned long signature; /* _32_ */
|
||||
unsigned long entry; /* 32 bit physical address */
|
||||
unsigned char revision; /* Revision level, 0 */
|
||||
unsigned char length; /* Length in paragraphs should be 01 */
|
||||
unsigned char checksum; /* All bytes must add up to zero */
|
||||
unsigned char reserved[5]; /* Must be zero */
|
||||
} fields;
|
||||
char chars[16];
|
||||
};
|
||||
|
||||
struct pci_device;
|
||||
struct dev;
|
||||
typedef int (*pci_probe_t)(struct dev *, struct pci_device *);
|
||||
|
||||
struct pci_device {
|
||||
uint32_t class;
|
||||
uint16_t vendor, dev_id;
|
||||
const char *name;
|
||||
/* membase and ioaddr are silly and depricated */
|
||||
unsigned int membase;
|
||||
unsigned int ioaddr;
|
||||
unsigned int romaddr;
|
||||
unsigned char irq;
|
||||
unsigned char devfn;
|
||||
unsigned char bus;
|
||||
unsigned char use_specified;
|
||||
const struct pci_driver *driver;
|
||||
};
|
||||
|
||||
extern void scan_pci_bus(int type, struct pci_device *dev);
|
||||
extern void find_pci(int type, struct pci_device *dev);
|
||||
|
||||
extern int pcibios_read_config_byte(unsigned int bus, unsigned int device_fn, unsigned int where, uint8_t *value);
|
||||
extern int pcibios_write_config_byte (unsigned int bus, unsigned int device_fn, unsigned int where, uint8_t value);
|
||||
extern int pcibios_read_config_word(unsigned int bus, unsigned int device_fn, unsigned int where, uint16_t *value);
|
||||
extern int pcibios_write_config_word (unsigned int bus, unsigned int device_fn, unsigned int where, uint16_t value);
|
||||
extern int pcibios_read_config_dword(unsigned int bus, unsigned int device_fn, unsigned int where, uint32_t *value);
|
||||
extern int pcibios_write_config_dword(unsigned int bus, unsigned int device_fn, unsigned int where, uint32_t value);
|
||||
extern unsigned long pcibios_bus_base(unsigned int bus);
|
||||
extern void adjust_pci_device(struct pci_device *p);
|
||||
|
||||
|
||||
static inline int
|
||||
pci_read_config_byte(struct pci_device *dev, unsigned int where, uint8_t *value)
|
||||
{
|
||||
return pcibios_read_config_byte(dev->bus, dev->devfn, where, value);
|
||||
}
|
||||
static inline int
|
||||
pci_write_config_byte(struct pci_device *dev, unsigned int where, uint8_t value)
|
||||
{
|
||||
return pcibios_write_config_byte(dev->bus, dev->devfn, where, value);
|
||||
}
|
||||
static inline int
|
||||
pci_read_config_word(struct pci_device *dev, unsigned int where, uint16_t *value)
|
||||
{
|
||||
return pcibios_read_config_word(dev->bus, dev->devfn, where, value);
|
||||
}
|
||||
static inline int
|
||||
pci_write_config_word(struct pci_device *dev, unsigned int where, uint16_t value)
|
||||
{
|
||||
return pcibios_write_config_word(dev->bus, dev->devfn, where, value);
|
||||
}
|
||||
static inline int
|
||||
pci_read_config_dword(struct pci_device *dev, unsigned int where, uint32_t *value)
|
||||
{
|
||||
return pcibios_read_config_dword(dev->bus, dev->devfn, where, value);
|
||||
}
|
||||
static inline int
|
||||
pci_write_config_dword(struct pci_device *dev, unsigned int where, uint32_t value)
|
||||
{
|
||||
return pcibios_write_config_dword(dev->bus, dev->devfn, where, value);
|
||||
}
|
||||
|
||||
/* Helper functions to find the size of a pci bar */
|
||||
extern unsigned long pci_bar_start(struct pci_device *dev, unsigned int bar);
|
||||
extern unsigned long pci_bar_size(struct pci_device *dev, unsigned int bar);
|
||||
/* Helper function to find pci capabilities */
|
||||
extern int pci_find_capability(struct pci_device *dev, int cap);
|
||||
struct pci_id {
|
||||
unsigned short vendor, dev_id;
|
||||
const char *name;
|
||||
};
|
||||
|
||||
struct dev;
|
||||
/* Most pci drivers will use this */
|
||||
struct pci_driver {
|
||||
int type;
|
||||
const char *name;
|
||||
pci_probe_t probe;
|
||||
struct pci_id *ids;
|
||||
int id_count;
|
||||
|
||||
/* On a few occasions the hardware is standardized enough that
|
||||
* we only need to know the class of the device and not the exact
|
||||
* type to drive the device correctly. If this is the case
|
||||
* set a class value other than 0.
|
||||
*/
|
||||
unsigned short class;
|
||||
};
|
||||
|
||||
#define __pci_driver __attribute__ ((used,__section__(".drivers.pci")))
|
||||
/* Defined by the linker... */
|
||||
extern const struct pci_driver pci_drivers[];
|
||||
extern const struct pci_driver pci_drivers_end[];
|
||||
|
||||
#define PCI_ROM(VENDOR_ID, DEVICE_ID, IMAGE, DESCRIPTION) \
|
||||
{ VENDOR_ID, DEVICE_ID, IMAGE, }
|
||||
|
||||
#endif /* PCI_H */
|
||||
342
src/include/pci_ids.h
Normal file
342
src/include/pci_ids.h
Normal file
@@ -0,0 +1,342 @@
|
||||
/*
|
||||
* PCI Class, Vendor and Device IDs
|
||||
*
|
||||
* Please keep sorted.
|
||||
*/
|
||||
|
||||
/* Device classes and subclasses */
|
||||
|
||||
#define PCI_CLASS_NOT_DEFINED 0x0000
|
||||
#define PCI_CLASS_NOT_DEFINED_VGA 0x0001
|
||||
|
||||
#define PCI_BASE_CLASS_STORAGE 0x01
|
||||
#define PCI_CLASS_STORAGE_SCSI 0x0100
|
||||
#define PCI_CLASS_STORAGE_IDE 0x0101
|
||||
#define PCI_CLASS_STORAGE_FLOPPY 0x0102
|
||||
#define PCI_CLASS_STORAGE_IPI 0x0103
|
||||
#define PCI_CLASS_STORAGE_RAID 0x0104
|
||||
#define PCI_CLASS_STORAGE_OTHER 0x0180
|
||||
|
||||
#define PCI_BASE_CLASS_NETWORK 0x02
|
||||
#define PCI_CLASS_NETWORK_ETHERNET 0x0200
|
||||
#define PCI_CLASS_NETWORK_TOKEN_RING 0x0201
|
||||
#define PCI_CLASS_NETWORK_FDDI 0x0202
|
||||
#define PCI_CLASS_NETWORK_ATM 0x0203
|
||||
#define PCI_CLASS_NETWORK_OTHER 0x0280
|
||||
|
||||
#define PCI_BASE_CLASS_DISPLAY 0x03
|
||||
#define PCI_CLASS_DISPLAY_VGA 0x0300
|
||||
#define PCI_CLASS_DISPLAY_XGA 0x0301
|
||||
#define PCI_CLASS_DISPLAY_3D 0x0302
|
||||
#define PCI_CLASS_DISPLAY_OTHER 0x0380
|
||||
|
||||
#define PCI_BASE_CLASS_MULTIMEDIA 0x04
|
||||
#define PCI_CLASS_MULTIMEDIA_VIDEO 0x0400
|
||||
#define PCI_CLASS_MULTIMEDIA_AUDIO 0x0401
|
||||
#define PCI_CLASS_MULTIMEDIA_PHONE 0x0402
|
||||
#define PCI_CLASS_MULTIMEDIA_OTHER 0x0480
|
||||
|
||||
#define PCI_BASE_CLASS_MEMORY 0x05
|
||||
#define PCI_CLASS_MEMORY_RAM 0x0500
|
||||
#define PCI_CLASS_MEMORY_FLASH 0x0501
|
||||
#define PCI_CLASS_MEMORY_OTHER 0x0580
|
||||
|
||||
#define PCI_BASE_CLASS_BRIDGE 0x06
|
||||
#define PCI_CLASS_BRIDGE_HOST 0x0600
|
||||
#define PCI_CLASS_BRIDGE_ISA 0x0601
|
||||
#define PCI_CLASS_BRIDGE_EISA 0x0602
|
||||
#define PCI_CLASS_BRIDGE_MC 0x0603
|
||||
#define PCI_CLASS_BRIDGE_PCI 0x0604
|
||||
#define PCI_CLASS_BRIDGE_PCMCIA 0x0605
|
||||
#define PCI_CLASS_BRIDGE_NUBUS 0x0606
|
||||
#define PCI_CLASS_BRIDGE_CARDBUS 0x0607
|
||||
#define PCI_CLASS_BRIDGE_RACEWAY 0x0608
|
||||
#define PCI_CLASS_BRIDGE_OTHER 0x0680
|
||||
|
||||
#define PCI_BASE_CLASS_COMMUNICATION 0x07
|
||||
#define PCI_CLASS_COMMUNICATION_SERIAL 0x0700
|
||||
#define PCI_CLASS_COMMUNICATION_PARALLEL 0x0701
|
||||
#define PCI_CLASS_COMMUNICATION_MULTISERIAL 0x0702
|
||||
#define PCI_CLASS_COMMUNICATION_MODEM 0x0703
|
||||
#define PCI_CLASS_COMMUNICATION_OTHER 0x0780
|
||||
|
||||
#define PCI_BASE_CLASS_SYSTEM 0x08
|
||||
#define PCI_CLASS_SYSTEM_PIC 0x0800
|
||||
#define PCI_CLASS_SYSTEM_DMA 0x0801
|
||||
#define PCI_CLASS_SYSTEM_TIMER 0x0802
|
||||
#define PCI_CLASS_SYSTEM_RTC 0x0803
|
||||
#define PCI_CLASS_SYSTEM_PCI_HOTPLUG 0x0804
|
||||
#define PCI_CLASS_SYSTEM_OTHER 0x0880
|
||||
|
||||
#define PCI_BASE_CLASS_INPUT 0x09
|
||||
#define PCI_CLASS_INPUT_KEYBOARD 0x0900
|
||||
#define PCI_CLASS_INPUT_PEN 0x0901
|
||||
#define PCI_CLASS_INPUT_MOUSE 0x0902
|
||||
#define PCI_CLASS_INPUT_SCANNER 0x0903
|
||||
#define PCI_CLASS_INPUT_GAMEPORT 0x0904
|
||||
#define PCI_CLASS_INPUT_OTHER 0x0980
|
||||
|
||||
#define PCI_BASE_CLASS_DOCKING 0x0a
|
||||
#define PCI_CLASS_DOCKING_GENERIC 0x0a00
|
||||
#define PCI_CLASS_DOCKING_OTHER 0x0a80
|
||||
|
||||
#define PCI_BASE_CLASS_PROCESSOR 0x0b
|
||||
#define PCI_CLASS_PROCESSOR_386 0x0b00
|
||||
#define PCI_CLASS_PROCESSOR_486 0x0b01
|
||||
#define PCI_CLASS_PROCESSOR_PENTIUM 0x0b02
|
||||
#define PCI_CLASS_PROCESSOR_ALPHA 0x0b10
|
||||
#define PCI_CLASS_PROCESSOR_POWERPC 0x0b20
|
||||
#define PCI_CLASS_PROCESSOR_MIPS 0x0b30
|
||||
#define PCI_CLASS_PROCESSOR_CO 0x0b40
|
||||
|
||||
#define PCI_BASE_CLASS_SERIAL 0x0c
|
||||
#define PCI_CLASS_SERIAL_FIREWIRE 0x0c00
|
||||
#define PCI_CLASS_SERIAL_ACCESS 0x0c01
|
||||
#define PCI_CLASS_SERIAL_SSA 0x0c02
|
||||
#define PCI_CLASS_SERIAL_USB 0x0c03
|
||||
#define PCI_CLASS_SERIAL_FIBER 0x0c04
|
||||
#define PCI_CLASS_SERIAL_SMBUS 0x0c05
|
||||
|
||||
#define PCI_BASE_CLASS_INTELLIGENT 0x0e
|
||||
#define PCI_CLASS_INTELLIGENT_I2O 0x0e00
|
||||
|
||||
#define PCI_BASE_CLASS_SATELLITE 0x0f
|
||||
#define PCI_CLASS_SATELLITE_TV 0x0f00
|
||||
#define PCI_CLASS_SATELLITE_AUDIO 0x0f01
|
||||
#define PCI_CLASS_SATELLITE_VOICE 0x0f03
|
||||
#define PCI_CLASS_SATELLITE_DATA 0x0f04
|
||||
|
||||
#define PCI_BASE_CLASS_CRYPT 0x10
|
||||
#define PCI_CLASS_CRYPT_NETWORK 0x1000
|
||||
#define PCI_CLASS_CRYPT_ENTERTAINMENT 0x1001
|
||||
#define PCI_CLASS_CRYPT_OTHER 0x1080
|
||||
|
||||
#define PCI_BASE_CLASS_SIGNAL_PROCESSING 0x11
|
||||
#define PCI_CLASS_SP_DPIO 0x1100
|
||||
#define PCI_CLASS_SP_OTHER 0x1180
|
||||
|
||||
#define PCI_CLASS_OTHERS 0xff
|
||||
|
||||
/* Vendors */
|
||||
|
||||
#define PCI_VENDOR_ID_DYNALINK 0x0675
|
||||
#define PCI_VENDOR_ID_BERKOM 0x0871
|
||||
#define PCI_VENDOR_ID_COMPAQ 0x0e11
|
||||
#define PCI_VENDOR_ID_NCR 0x1000
|
||||
#define PCI_VENDOR_ID_LSI_LOGIC 0x1000
|
||||
#define PCI_VENDOR_ID_ATI 0x1002
|
||||
#define PCI_VENDOR_ID_VLSI 0x1004
|
||||
#define PCI_VENDOR_ID_ADL 0x1005
|
||||
#define PCI_VENDOR_ID_NS 0x100b
|
||||
#define PCI_VENDOR_ID_TSENG 0x100c
|
||||
#define PCI_VENDOR_ID_WEITEK 0x100e
|
||||
#define PCI_VENDOR_ID_DEC 0x1011
|
||||
#define PCI_VENDOR_ID_CIRRUS 0x1013
|
||||
#define PCI_VENDOR_ID_IBM 0x1014
|
||||
#define PCI_VENDOR_ID_COMPEX2 0x101a
|
||||
/* pci.ids says "AT&T GIS (NCR)" */
|
||||
#define PCI_VENDOR_ID_WD 0x101c
|
||||
#define PCI_VENDOR_ID_AMI 0x101e
|
||||
#define PCI_VENDOR_ID_AMD 0x1022
|
||||
#define PCI_VENDOR_ID_TRIDENT 0x1023
|
||||
#define PCI_VENDOR_ID_AI 0x1025
|
||||
#define PCI_VENDOR_ID_DELL 0x1028
|
||||
#define PCI_VENDOR_ID_MATROX 0x102B
|
||||
#define PCI_VENDOR_ID_CT 0x102c
|
||||
#define PCI_VENDOR_ID_MIRO 0x1031
|
||||
#define PCI_VENDOR_ID_NEC 0x1033
|
||||
#define PCI_VENDOR_ID_FD 0x1036
|
||||
#define PCI_VENDOR_ID_SIS 0x1039
|
||||
#define PCI_VENDOR_ID_SI 0x1039
|
||||
#define PCI_VENDOR_ID_HP 0x103c
|
||||
#define PCI_VENDOR_ID_PCTECH 0x1042
|
||||
#define PCI_VENDOR_ID_ASUSTEK 0x1043
|
||||
#define PCI_VENDOR_ID_DPT 0x1044
|
||||
#define PCI_VENDOR_ID_OPTI 0x1045
|
||||
#define PCI_VENDOR_ID_ELSA 0x1048
|
||||
#define PCI_VENDOR_ID_ELSA 0x1048
|
||||
#define PCI_VENDOR_ID_SGS 0x104a
|
||||
#define PCI_VENDOR_ID_BUSLOGIC 0x104B
|
||||
#define PCI_VENDOR_ID_TI 0x104c
|
||||
#define PCI_VENDOR_ID_SONY 0x104d
|
||||
#define PCI_VENDOR_ID_OAK 0x104e
|
||||
/* Winbond have two vendor IDs! See 0x10ad as well */
|
||||
#define PCI_VENDOR_ID_WINBOND2 0x1050
|
||||
#define PCI_VENDOR_ID_ANIGMA 0x1051
|
||||
#define PCI_VENDOR_ID_EFAR 0x1055
|
||||
#define PCI_VENDOR_ID_MOTOROLA 0x1057
|
||||
#define PCI_VENDOR_ID_MOTOROLA_OOPS 0x1507
|
||||
#define PCI_VENDOR_ID_PROMISE 0x105a
|
||||
#define PCI_VENDOR_ID_N9 0x105d
|
||||
#define PCI_VENDOR_ID_UMC 0x1060
|
||||
#define PCI_VENDOR_ID_X 0x1061
|
||||
#define PCI_VENDOR_ID_MYLEX 0x1069
|
||||
#define PCI_VENDOR_ID_PICOP 0x1066
|
||||
#define PCI_VENDOR_ID_APPLE 0x106b
|
||||
#define PCI_VENDOR_ID_YAMAHA 0x1073
|
||||
#define PCI_VENDOR_ID_NEXGEN 0x1074
|
||||
#define PCI_VENDOR_ID_QLOGIC 0x1077
|
||||
#define PCI_VENDOR_ID_CYRIX 0x1078
|
||||
#define PCI_VENDOR_ID_LEADTEK 0x107d
|
||||
#define PCI_VENDOR_ID_INTERPHASE 0x107e
|
||||
#define PCI_VENDOR_ID_CONTAQ 0x1080
|
||||
#define PCI_VENDOR_ID_FOREX 0x1083
|
||||
#define PCI_VENDOR_ID_OLICOM 0x108d
|
||||
#define PCI_VENDOR_ID_SUN 0x108e
|
||||
#define PCI_VENDOR_ID_CMD 0x1095
|
||||
#define PCI_VENDOR_ID_VISION 0x1098
|
||||
#define PCI_VENDOR_ID_BROOKTREE 0x109e
|
||||
#define PCI_VENDOR_ID_SIERRA 0x10a8
|
||||
#define PCI_VENDOR_ID_SGI 0x10a9
|
||||
#define PCI_VENDOR_ID_ACC 0x10aa
|
||||
#define PCI_VENDOR_ID_WINBOND 0x10ad
|
||||
#define PCI_VENDOR_ID_DATABOOK 0x10b3
|
||||
#define PCI_VENDOR_ID_PLX 0x10b5
|
||||
#define PCI_VENDOR_ID_MADGE 0x10b6
|
||||
#define PCI_VENDOR_ID_3COM 0x10b7
|
||||
#define PCI_VENDOR_ID_SMC 0x10b8
|
||||
#define PCI_VENDOR_ID_SUNDANCE 0x13F0
|
||||
#define PCI_VENDOR_ID_AL 0x10b9
|
||||
#define PCI_VENDOR_ID_MITSUBISHI 0x10ba
|
||||
#define PCI_VENDOR_ID_SURECOM 0x10bd
|
||||
#define PCI_VENDOR_ID_NEOMAGIC 0x10c8
|
||||
#define PCI_VENDOR_ID_ASP 0x10cd
|
||||
#define PCI_VENDOR_ID_MACRONIX 0x10d9
|
||||
#define PCI_VENDOR_ID_TCONRAD 0x10da
|
||||
#define PCI_VENDOR_ID_CERN 0x10dc
|
||||
#define PCI_VENDOR_ID_NVIDIA 0x10de
|
||||
#define PCI_VENDOR_ID_IMS 0x10e0
|
||||
#define PCI_VENDOR_ID_TEKRAM2 0x10e1
|
||||
#define PCI_VENDOR_ID_TUNDRA 0x10e3
|
||||
#define PCI_VENDOR_ID_AMCC 0x10e8
|
||||
#define PCI_VENDOR_ID_INTERG 0x10ea
|
||||
#define PCI_VENDOR_ID_REALTEK 0x10ec
|
||||
#define PCI_VENDOR_ID_XILINX 0x10ee
|
||||
#define PCI_VENDOR_ID_TRUEVISION 0x10fa
|
||||
#define PCI_VENDOR_ID_INIT 0x1101
|
||||
#define PCI_VENDOR_ID_CREATIVE 0x1102
|
||||
/* duplicate: ECTIVA */
|
||||
#define PCI_VENDOR_ID_ECTIVA 0x1102
|
||||
/* duplicate: CREATIVE */
|
||||
#define PCI_VENDOR_ID_TTI 0x1103
|
||||
#define PCI_VENDOR_ID_VIA 0x1106
|
||||
#define PCI_VENDOR_ID_VIATEC 0x1106
|
||||
#define PCI_VENDOR_ID_SIEMENS 0x110A
|
||||
#define PCI_VENDOR_ID_SMC2 0x1113
|
||||
#define PCI_VENDOR_ID_VORTEX 0x1119
|
||||
#define PCI_VENDOR_ID_EF 0x111a
|
||||
#define PCI_VENDOR_ID_IDT 0x111d
|
||||
#define PCI_VENDOR_ID_FORE 0x1127
|
||||
#define PCI_VENDOR_ID_IMAGINGTECH 0x112f
|
||||
#define PCI_VENDOR_ID_PHILIPS 0x1131
|
||||
#define PCI_VENDOR_ID_EICON 0x1133
|
||||
#define PCI_VENDOR_ID_CYCLONE 0x113c
|
||||
#define PCI_VENDOR_ID_ALLIANCE 0x1142
|
||||
#define PCI_VENDOR_ID_SYSKONNECT 0x1148
|
||||
#define PCI_VENDOR_ID_VMIC 0x114a
|
||||
#define PCI_VENDOR_ID_DIGI 0x114f
|
||||
#define PCI_VENDOR_ID_MUTECH 0x1159
|
||||
#define PCI_VENDOR_ID_XIRCOM 0x115d
|
||||
#define PCI_VENDOR_ID_RENDITION 0x1163
|
||||
#define PCI_VENDOR_ID_SERVERWORKS 0x1166
|
||||
#define PCI_VENDOR_ID_SBE 0x1176
|
||||
#define PCI_VENDOR_ID_TOSHIBA 0x1179
|
||||
#define PCI_VENDOR_ID_RICOH 0x1180
|
||||
#define PCI_VENDOR_ID_DLINK 0x1186
|
||||
#define PCI_VENDOR_ID_ARTOP 0x1191
|
||||
#define PCI_VENDOR_ID_ZEITNET 0x1193
|
||||
#define PCI_VENDOR_ID_OMEGA 0x119b
|
||||
#define PCI_VENDOR_ID_FUJITSU_ME 0x119e
|
||||
#define PCI_SUBVENDOR_ID_KEYSPAN 0x11a9
|
||||
#define PCI_VENDOR_ID_GALILEO 0x11ab
|
||||
#define PCI_VENDOR_ID_LINKSYS 0x11ad
|
||||
#define PCI_VENDOR_ID_LITEON 0x11ad
|
||||
#define PCI_VENDOR_ID_V3 0x11b0
|
||||
#define PCI_VENDOR_ID_NP 0x11bc
|
||||
#define PCI_VENDOR_ID_ATT 0x11c1
|
||||
#define PCI_VENDOR_ID_SPECIALIX 0x11cb
|
||||
#define PCI_VENDOR_ID_AURAVISION 0x11d1
|
||||
#define PCI_VENDOR_ID_ANALOG_DEVICES 0x11d4
|
||||
#define PCI_VENDOR_ID_IKON 0x11d5
|
||||
#define PCI_VENDOR_ID_ZORAN 0x11de
|
||||
#define PCI_VENDOR_ID_KINETIC 0x11f4
|
||||
#define PCI_VENDOR_ID_COMPEX 0x11f6
|
||||
#define PCI_VENDOR_ID_RP 0x11fe
|
||||
#define PCI_VENDOR_ID_CYCLADES 0x120e
|
||||
#define PCI_VENDOR_ID_ESSENTIAL 0x120f
|
||||
#define PCI_VENDOR_ID_O2 0x1217
|
||||
#define PCI_VENDOR_ID_3DFX 0x121a
|
||||
#define PCI_VENDOR_ID_SIGMADES 0x1236
|
||||
#define PCI_VENDOR_ID_CCUBE 0x123f
|
||||
#define PCI_VENDOR_ID_AVM 0x1244
|
||||
#define PCI_VENDOR_ID_DIPIX 0x1246
|
||||
#define PCI_VENDOR_ID_STALLION 0x124d
|
||||
#define PCI_VENDOR_ID_OPTIBASE 0x1255
|
||||
#define PCI_VENDOR_ID_ESS 0x125d
|
||||
#define PCI_VENDOR_ID_HARRIS 0x1260
|
||||
#define PCI_VENDOR_ID_SATSAGEM 0x1267
|
||||
#define PCI_VENDOR_ID_HUGHES 0x1273
|
||||
#define PCI_VENDOR_ID_ENSONIQ 0x1274
|
||||
#define PCI_VENDOR_ID_ROCKWELL 0x127A
|
||||
#define PCI_VENDOR_ID_DAVICOM 0x1282
|
||||
#define PCI_VENDOR_ID_ITE 0x1283
|
||||
/* formerly Platform Tech */
|
||||
#define PCI_VENDOR_ID_ESS_OLD 0x1285
|
||||
#define PCI_VENDOR_ID_ALTEON 0x12ae
|
||||
#define PCI_VENDOR_ID_USR 0x12B9
|
||||
#define PCI_VENDOR_ID_HOLTEK 0x12c3
|
||||
#define PCI_SUBVENDOR_ID_CONNECT_TECH 0x12c4
|
||||
#define PCI_VENDOR_ID_PICTUREL 0x12c5
|
||||
#define PCI_VENDOR_ID_NVIDIA_SGS 0x12d2
|
||||
#define PCI_SUBVENDOR_ID_CHASE_PCIFAST 0x12E0
|
||||
#define PCI_SUBVENDOR_ID_CHASE_PCIRAS 0x124D
|
||||
#define PCI_VENDOR_ID_AUREAL 0x12eb
|
||||
#define PCI_VENDOR_ID_CBOARDS 0x1307
|
||||
#define PCI_VENDOR_ID_SIIG 0x131f
|
||||
#define PCI_VENDOR_ID_ADMTEK 0x1317
|
||||
#define PCI_VENDOR_ID_DOMEX 0x134a
|
||||
#define PCI_VENDOR_ID_QUATECH 0x135C
|
||||
#define PCI_VENDOR_ID_SEALEVEL 0x135e
|
||||
#define PCI_VENDOR_ID_HYPERCOPE 0x1365
|
||||
#define PCI_VENDOR_ID_KAWASAKI 0x136b
|
||||
#define PCI_VENDOR_ID_LMC 0x1376
|
||||
#define PCI_VENDOR_ID_NETGEAR 0x1385
|
||||
#define PCI_VENDOR_ID_APPLICOM 0x1389
|
||||
#define PCI_VENDOR_ID_MOXA 0x1393
|
||||
#define PCI_VENDOR_ID_CCD 0x1397
|
||||
#define PCI_VENDOR_ID_MICROGATE 0x13c0
|
||||
#define PCI_VENDOR_ID_3WARE 0x13C1
|
||||
#define PCI_VENDOR_ID_ABOCOM 0x13D1
|
||||
#define PCI_VENDOR_ID_CMEDIA 0x13f6
|
||||
#define PCI_VENDOR_ID_LAVA 0x1407
|
||||
#define PCI_VENDOR_ID_TIMEDIA 0x1409
|
||||
#define PCI_VENDOR_ID_OXSEMI 0x1415
|
||||
#define PCI_VENDOR_ID_AIRONET 0x14b9
|
||||
#define PCI_VENDOR_ID_TITAN 0x14D2
|
||||
#define PCI_VENDOR_ID_PANACOM 0x14d4
|
||||
#define PCI_VENDOR_ID_BROADCOM 0x14e4
|
||||
#define PCI_VENDOR_ID_SYBA 0x1592
|
||||
#define PCI_VENDOR_ID_MORETON 0x15aa
|
||||
#define PCI_VENDOR_ID_ZOLTRIX 0x15b0
|
||||
#define PCI_VENDOR_ID_PDC 0x15e9
|
||||
#define PCI_VENDOR_ID_SYMPHONY 0x1c1c
|
||||
#define PCI_VENDOR_ID_TEKRAM 0x1de1
|
||||
#define PCI_VENDOR_ID_3DLABS 0x3d3d
|
||||
#define PCI_VENDOR_ID_AVANCE 0x4005
|
||||
#define PCI_VENDOR_ID_AKS 0x416c
|
||||
#define PCI_VENDOR_ID_NETVIN 0x4a14
|
||||
#define PCI_VENDOR_ID_S3 0x5333
|
||||
#define PCI_VENDOR_ID_DCI 0x6666
|
||||
#define PCI_VENDOR_ID_GENROCO 0x5555
|
||||
#define PCI_VENDOR_ID_INTEL 0x8086
|
||||
#define PCI_VENDOR_ID_COMPUTONE 0x8e0e
|
||||
#define PCI_SUBVENDOR_ID_COMPUTONE 0x8e0e
|
||||
#define PCI_VENDOR_ID_KTI 0x8e2e
|
||||
#define PCI_VENDOR_ID_ADAPTEC 0x9004
|
||||
#define PCI_VENDOR_ID_ADAPTEC2 0x9005
|
||||
#define PCI_VENDOR_ID_ATRONICS 0x907f
|
||||
#define PCI_VENDOR_ID_HOLTEK2 0x9412
|
||||
#define PCI_VENDOR_ID_NETMOS 0x9710
|
||||
#define PCI_SUBVENDOR_ID_EXSYS 0xd84d
|
||||
#define PCI_VENDOR_ID_TIGERJET 0xe159
|
||||
#define PCI_VENDOR_ID_ARK 0xedd8
|
||||
23
src/include/pcmcia-opts.h
Normal file
23
src/include/pcmcia-opts.h
Normal file
@@ -0,0 +1,23 @@
|
||||
// pcmcia-opts.h
|
||||
// special options file for development time. Later this could end in Config(?)
|
||||
#ifndef __pcmciaopts
|
||||
#define __pcmciaopts
|
||||
|
||||
#define _yes_ 1
|
||||
#define _no_ 0
|
||||
|
||||
#define SUPPORT_I82365 (_yes_)
|
||||
// #define SUPPORT_YENTA (_no_)
|
||||
// #define SUPPORT_SOME_DRIVER (_no_)
|
||||
|
||||
#define PCMCIA_SHUTDOWN (_yes_)
|
||||
#define MAP_ATTRMEM_TO 0xd0000
|
||||
#define MAP_ATTRMEM_LEN 0x02000
|
||||
|
||||
#define PDEBUG 3
|
||||
// The higher the more output you get, 0..3
|
||||
// Not fully implemented though, but for the future...
|
||||
|
||||
#undef _yes_
|
||||
#undef _no_
|
||||
#endif
|
||||
157
src/include/pcmcia.h
Normal file
157
src/include/pcmcia.h
Normal file
@@ -0,0 +1,157 @@
|
||||
// pcmcia.h - Header file for PCMCIA support
|
||||
|
||||
#ifndef INCLUDE_PCMCIA_H
|
||||
#define INCLUDE_PCMCIA_H 1
|
||||
#include "etherboot.h"
|
||||
|
||||
typedef unsigned char u_char;
|
||||
typedef unsigned short u_short;
|
||||
typedef unsigned int u_int;
|
||||
typedef unsigned long u_long;
|
||||
|
||||
typedef u_short ioaddr_t;
|
||||
extern int sockets;
|
||||
|
||||
#define MAXPCCSOCKS 8
|
||||
#define MAXPCCCONFIGS 8
|
||||
|
||||
typedef enum ebpdriver_t { I82365, SOMEDRIVER } ebpdriver_t;
|
||||
typedef enum interface_func_t { INIT, SHUTDOWN, MAPATTRMEM, UNMAPATTRMEM, SELECTCONFIG } interface_func_t;
|
||||
typedef enum ebpstatus_t { EMPTY, HASCARD, INITIALIZED, SUSPENDED, OTHERDEVICE, UNKNOWN } ebpstatus_t;
|
||||
|
||||
struct driver_interact_t {
|
||||
ebpdriver_t id;
|
||||
int (*f)(interface_func_t,int,int,int,int);
|
||||
char *name;
|
||||
};
|
||||
struct pccsock_t {
|
||||
ebpdriver_t device;
|
||||
int drivernum;
|
||||
ebpstatus_t status;
|
||||
// Internal usage of the drivers:
|
||||
int internalid;
|
||||
int flags;
|
||||
int ioaddr;
|
||||
int type;
|
||||
int configoffset;
|
||||
int possibleconfignum;
|
||||
int stringoffset;
|
||||
u_int stringlength;
|
||||
int rmask0;
|
||||
};
|
||||
|
||||
extern struct pccsock_t pccsock[MAXPCCSOCKS];
|
||||
extern u_int pccsocks;
|
||||
|
||||
struct pcc_config_t {
|
||||
u_char index;
|
||||
u_char irq;
|
||||
int iowin;
|
||||
int iolen;
|
||||
};
|
||||
|
||||
|
||||
int i82365_interfacer(interface_func_t,int,int,int,void *);
|
||||
void sleepticks(int);
|
||||
|
||||
#define EINVAL 22
|
||||
|
||||
|
||||
//*********************************************************** cc.h:
|
||||
/* Definitions for card status flags for GetStatus */
|
||||
#define SS_WRPROT 0x0001
|
||||
#define SS_CARDLOCK 0x0002
|
||||
#define SS_EJECTION 0x0004
|
||||
#define SS_INSERTION 0x0008
|
||||
#define SS_BATDEAD 0x0010
|
||||
#define SS_BATWARN 0x0020
|
||||
#define SS_READY 0x0040
|
||||
#define SS_DETECT 0x0080
|
||||
#define SS_POWERON 0x0100
|
||||
#define SS_GPI 0x0200
|
||||
#define SS_STSCHG 0x0400
|
||||
#define SS_CARDBUS 0x0800
|
||||
#define SS_3VCARD 0x1000
|
||||
#define SS_XVCARD 0x2000
|
||||
#define SS_PENDING 0x4000
|
||||
|
||||
/* cc.h: for InquireSocket */
|
||||
typedef struct socket_cap_t {
|
||||
u_int features;
|
||||
u_int irq_mask;
|
||||
u_int map_size;
|
||||
ioaddr_t io_offset;
|
||||
u_char pci_irq;
|
||||
//struct pci_dev *cb_dev;
|
||||
//struct bus_operations *bus;
|
||||
void *cb_dev;
|
||||
void *bus;
|
||||
} socket_cap_t;
|
||||
/* InquireSocket capabilities */
|
||||
#define SS_CAP_PAGE_REGS 0x0001
|
||||
#define SS_CAP_VIRTUAL_BUS 0x0002
|
||||
#define SS_CAP_MEM_ALIGN 0x0004
|
||||
#define SS_CAP_STATIC_MAP 0x0008
|
||||
#define SS_CAP_PCCARD 0x4000
|
||||
#define SS_CAP_CARDBUS 0x8000
|
||||
|
||||
/* for GetSocket, SetSocket */
|
||||
typedef struct socket_state_t {
|
||||
u_int flags;
|
||||
u_int csc_mask;
|
||||
u_char Vcc, Vpp;
|
||||
u_char io_irq;
|
||||
} socket_state_t;
|
||||
|
||||
extern socket_state_t dead_socket;
|
||||
|
||||
/* Socket configuration flags */
|
||||
#define SS_PWR_AUTO 0x0010
|
||||
#define SS_IOCARD 0x0020
|
||||
#define SS_RESET 0x0040
|
||||
#define SS_DMA_MODE 0x0080
|
||||
#define SS_SPKR_ENA 0x0100
|
||||
#define SS_OUTPUT_ENA 0x0200
|
||||
#define SS_DEBOUNCED 0x0400 /* Tell driver that the debounce delay has ended */
|
||||
#define SS_ZVCARD 0x0800
|
||||
|
||||
/* Flags for I/O port and memory windows */
|
||||
#define MAP_ACTIVE 0x01
|
||||
#define MAP_16BIT 0x02
|
||||
#define MAP_AUTOSZ 0x04
|
||||
#define MAP_0WS 0x08
|
||||
#define MAP_WRPROT 0x10
|
||||
#define MAP_ATTRIB 0x20
|
||||
#define MAP_USE_WAIT 0x40
|
||||
#define MAP_PREFETCH 0x80
|
||||
|
||||
/* Use this just for bridge windows */
|
||||
#define MAP_IOSPACE 0x20
|
||||
|
||||
typedef struct pccard_io_map {
|
||||
u_char map;
|
||||
u_char flags;
|
||||
u_short speed;
|
||||
ioaddr_t start, stop;
|
||||
} pccard_io_map;
|
||||
|
||||
|
||||
typedef struct pccard_mem_map {
|
||||
u_char map;
|
||||
u_char flags;
|
||||
u_short speed;
|
||||
u_long sys_start, sys_stop;
|
||||
u_int card_start;
|
||||
} pccard_mem_map;
|
||||
|
||||
typedef struct cb_bridge_map {
|
||||
u_char map;
|
||||
u_char flags;
|
||||
u_int start, stop;
|
||||
} cb_bridge_map;
|
||||
// need the global function pointer struct? *TODO*
|
||||
//************************************* end cc.h
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
929
src/include/pxe.h
Normal file
929
src/include/pxe.h
Normal file
@@ -0,0 +1,929 @@
|
||||
/*
|
||||
* pxe.h for Etherboot.
|
||||
*
|
||||
* PXE is technically specified only for i386, but there's no reason
|
||||
* why we shouldn't make the API available for other architectures,
|
||||
* provided that someone wants to write the shim that allows an
|
||||
* external program to call pxe_api_call().
|
||||
*
|
||||
* We stick with Intel's data structure definitions as far as possible
|
||||
* on other architectures. Generally the only i386-specific stuff is
|
||||
* related to addressing: real-mode segment:offset addresses, segment
|
||||
* selectors, segment descriptors etc. We allow an architecture-
|
||||
* specific header to define these types, then build the PXE
|
||||
* structures. Note that we retain the names from the PXE
|
||||
* specification document (e.g. SEGOFF16_t) even if the architecture
|
||||
* in question doesn't represent a SEGOFF16_t as anything resembling a
|
||||
* 16-bit segment:offset address. This is done in order to keep the
|
||||
* structure definitions as close as possible to those in the spec, to
|
||||
* minimise confusion.
|
||||
*
|
||||
* This file derives from several originals. One is pxe.h from
|
||||
* FreeBSD. Another is general.h86 from netboot. The original
|
||||
* copyright notices are reproduced below. This entire file is
|
||||
* licensed under the GPL; the netboot code is GPL anyway and the
|
||||
* FreeBSD code allows us to relicense under the GPL provided that we
|
||||
* retain the FreeBSD copyright notice. This is my understanding,
|
||||
* anyway. Other portions are my own and therefore Copyright (C) 2004
|
||||
* Michael Brown <mbrown@fensystems.co.uk>.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#ifndef PXE_H
|
||||
#define PXE_H
|
||||
|
||||
/* Include architecture-specific PXE data types
|
||||
*
|
||||
* May define SEGOFF16_t, SEGDESC_t and SEGSEL_t. These should be
|
||||
* #defines to underlying * types. May also define
|
||||
* IS_NULL_SEGOFF16(segoff16), SEGOFF16_TO_PTR(segoff16) and
|
||||
* PTR_TO_SEGOFF16(ptr,segoff16)
|
||||
*/
|
||||
#ifndef PXE_TYPES_H
|
||||
#include <pxe_types.h>
|
||||
#endif
|
||||
|
||||
/* Defaults in case pxe_types.h did not define a type. These are
|
||||
* placeholder structures just to make the code compile.
|
||||
*/
|
||||
#ifndef SEGOFF16_t
|
||||
#define SEGOFF16_t void*
|
||||
#endif
|
||||
|
||||
#ifndef IS_NULL_SEGOFF16
|
||||
#define IS_NULL_SEGOFF16(segoff16) ( (segoff16) == NULL )
|
||||
#endif
|
||||
|
||||
#ifndef SEGOFF16_TO_PTR
|
||||
#define SEGOFF16_TO_PTR(segoff16) (segoff16)
|
||||
#endif
|
||||
|
||||
#ifndef PTR_TO_SEGOFF16
|
||||
#define PTR_TO_SEGOFF16(ptr,segoff16) (segoff16) = (ptr);
|
||||
#endif
|
||||
|
||||
#ifndef SEGDESC_t
|
||||
#define SEGDESC_t void
|
||||
#endif
|
||||
|
||||
#ifndef SEGSEL_t
|
||||
#define SEGSEL_t void
|
||||
#endif
|
||||
|
||||
/*****************************************************************************
|
||||
* The following portion of this file is derived from FreeBSD's pxe.h.
|
||||
* Do not remove the copyright notice below.
|
||||
*****************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2000 Alfred Perlstein <alfred@freebsd.org>
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2000 Paul Saab <ps@freebsd.org>
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2000 John Baldwin <jhb@freebsd.org>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD: src/sys/boot/i386/libi386/pxe.h,v 1.4.2.2 2000/09/10 02:52:18 ps Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
* The typedefs and structures declared in this file
|
||||
* clearly violate style(9), the reason for this is to conform to the
|
||||
* typedefs/structure-names used in the Intel literature to avoid confusion.
|
||||
*
|
||||
* It's for your own good. :)
|
||||
*/
|
||||
|
||||
/* It seems that intel didn't think about ABI,
|
||||
* either that or 16bit ABI != 32bit ABI (which seems reasonable)
|
||||
* I have to thank Intel for the hair loss I incurred trying to figure
|
||||
* out why PXE was mis-reading structures I was passing it (at least
|
||||
* from my point of view)
|
||||
*
|
||||
* Solution: use gcc's '__attribute__ ((packed))' to correctly align
|
||||
* structures passed into PXE
|
||||
* Question: does this really work for PXE's expected ABI?
|
||||
*/
|
||||
#ifndef PACKED
|
||||
#define PACKED __attribute__ ((packed))
|
||||
#endif
|
||||
|
||||
#define S_SIZE(s) s, sizeof(s) - 1
|
||||
|
||||
#define IP_STR "%d.%d.%d.%d"
|
||||
#define IP_ARGS(ip) \
|
||||
(int)(ip >> 24) & 0xff, (int)(ip >> 16) & 0xff, \
|
||||
(int)(ip >> 8) & 0xff, (int)ip & 0xff
|
||||
|
||||
#define MAC_STR "%02x:%02x:%02x:%02x:%02x:%02x"
|
||||
#define MAC_ARGS(mac) \
|
||||
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]
|
||||
|
||||
typedef uint16_t PXENV_EXIT_t;
|
||||
typedef uint16_t PXENV_STATUS_t;
|
||||
typedef uint32_t IP4_t;
|
||||
typedef uint32_t ADDR32_t;
|
||||
/* It seems as though UDP_PORT_t is in network order, although I can't
|
||||
* find anything in the spec to back this up. (Michael Brown)
|
||||
*/
|
||||
typedef uint16_t UDP_PORT_t;
|
||||
|
||||
#define MAC_ADDR_LEN 16
|
||||
typedef uint8_t MAC_ADDR[MAC_ADDR_LEN];
|
||||
|
||||
/* PXENV+ */
|
||||
typedef struct {
|
||||
uint8_t Signature[6]; /* 'PXENV+' */
|
||||
uint16_t Version; /* MSB = major, LSB = minor */
|
||||
uint8_t Length; /* structure length */
|
||||
uint8_t Checksum; /* checksum pad */
|
||||
SEGOFF16_t RMEntry; /* SEG:OFF to PXE entry point */
|
||||
/* don't use PMOffset and PMSelector (from the 2.1 PXE manual) */
|
||||
uint32_t PMOffset; /* Protected mode entry */
|
||||
SEGSEL_t PMSelector; /* Protected mode selector */
|
||||
SEGSEL_t StackSeg; /* Stack segment address */
|
||||
uint16_t StackSize; /* Stack segment size (bytes) */
|
||||
SEGSEL_t BC_CodeSeg; /* BC Code segment address */
|
||||
uint16_t BC_CodeSize; /* BC Code segment size (bytes) */
|
||||
SEGSEL_t BC_DataSeg; /* BC Data segment address */
|
||||
uint16_t BC_DataSize; /* BC Data segment size (bytes) */
|
||||
SEGSEL_t UNDIDataSeg; /* UNDI Data segment address */
|
||||
uint16_t UNDIDataSize; /* UNDI Data segment size (bytes) */
|
||||
SEGSEL_t UNDICodeSeg; /* UNDI Code segment address */
|
||||
uint16_t UNDICodeSize; /* UNDI Code segment size (bytes) */
|
||||
SEGOFF16_t PXEPtr; /* SEG:OFF to !PXE struct,
|
||||
only present when Version > 2.1 */
|
||||
} PACKED pxenv_t;
|
||||
|
||||
/* !PXE */
|
||||
typedef struct {
|
||||
uint8_t Signature[4];
|
||||
uint8_t StructLength;
|
||||
uint8_t StructCksum;
|
||||
uint8_t StructRev;
|
||||
uint8_t reserved_1;
|
||||
SEGOFF16_t UNDIROMID;
|
||||
SEGOFF16_t BaseROMID;
|
||||
SEGOFF16_t EntryPointSP;
|
||||
SEGOFF16_t EntryPointESP;
|
||||
SEGOFF16_t StatusCallout;
|
||||
uint8_t reserved_2;
|
||||
uint8_t SegDescCn;
|
||||
SEGSEL_t FirstSelector;
|
||||
SEGDESC_t Stack;
|
||||
SEGDESC_t UNDIData;
|
||||
SEGDESC_t UNDICode;
|
||||
SEGDESC_t UNDICodeWrite;
|
||||
SEGDESC_t BC_Data;
|
||||
SEGDESC_t BC_Code;
|
||||
SEGDESC_t BC_CodeWrite;
|
||||
} PACKED pxe_t;
|
||||
|
||||
#define PXENV_START_UNDI 0x0000
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
uint16_t ax;
|
||||
uint16_t bx;
|
||||
uint16_t dx;
|
||||
uint16_t di;
|
||||
uint16_t es;
|
||||
} PACKED t_PXENV_START_UNDI;
|
||||
|
||||
#define PXENV_UNDI_STARTUP 0x0001
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
} PACKED t_PXENV_UNDI_STARTUP;
|
||||
|
||||
#define PXENV_UNDI_CLEANUP 0x0002
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
} PACKED t_PXENV_UNDI_CLEANUP;
|
||||
|
||||
#define PXENV_UNDI_INITIALIZE 0x0003
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
ADDR32_t ProtocolIni; /* Phys addr of a copy of the driver module */
|
||||
uint8_t reserved[8];
|
||||
} PACKED t_PXENV_UNDI_INITIALIZE;
|
||||
|
||||
|
||||
#define MAXNUM_MCADDR 8
|
||||
typedef struct {
|
||||
uint16_t MCastAddrCount;
|
||||
MAC_ADDR McastAddr[MAXNUM_MCADDR];
|
||||
} PACKED t_PXENV_UNDI_MCAST_ADDRESS;
|
||||
|
||||
#define PXENV_UNDI_RESET_ADAPTER 0x0004
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
t_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf;
|
||||
} PACKED t_PXENV_UNDI_RESET_ADAPTER;
|
||||
|
||||
#define PXENV_UNDI_SHUTDOWN 0x0005
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
} PACKED t_PXENV_UNDI_SHUTDOWN;
|
||||
|
||||
#define PXENV_UNDI_OPEN 0x0006
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
uint16_t OpenFlag;
|
||||
uint16_t PktFilter;
|
||||
# define FLTR_DIRECTED 0x0001
|
||||
# define FLTR_BRDCST 0x0002
|
||||
# define FLTR_PRMSCS 0x0003
|
||||
# define FLTR_SRC_RTG 0x0004
|
||||
|
||||
t_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf;
|
||||
} PACKED t_PXENV_UNDI_OPEN;
|
||||
|
||||
#define PXENV_UNDI_CLOSE 0x0007
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
} PACKED t_PXENV_UNDI_CLOSE;
|
||||
|
||||
#define PXENV_UNDI_TRANSMIT 0x0008
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
uint8_t Protocol;
|
||||
# define P_UNKNOWN 0
|
||||
# define P_IP 1
|
||||
# define P_ARP 2
|
||||
# define P_RARP 3
|
||||
|
||||
uint8_t XmitFlag;
|
||||
# define XMT_DESTADDR 0x0000
|
||||
# define XMT_BROADCAST 0x0001
|
||||
|
||||
SEGOFF16_t DestAddr;
|
||||
SEGOFF16_t TBD;
|
||||
uint32_t Reserved[2];
|
||||
} PACKED t_PXENV_UNDI_TRANSMIT;
|
||||
|
||||
#define MAX_DATA_BLKS 8
|
||||
typedef struct {
|
||||
uint16_t ImmedLength;
|
||||
SEGOFF16_t Xmit;
|
||||
uint16_t DataBlkCount;
|
||||
struct DataBlk {
|
||||
uint8_t TDPtrType;
|
||||
uint8_t TDRsvdByte;
|
||||
uint16_t TDDataLen;
|
||||
SEGOFF16_t TDDataPtr;
|
||||
} DataBlock[MAX_DATA_BLKS];
|
||||
} PACKED t_PXENV_UNDI_TBD;
|
||||
|
||||
#define PXENV_UNDI_SET_MCAST_ADDRESS 0x0009
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
t_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf;
|
||||
} PACKED t_PXENV_UNDI_SET_MCAST_ADDRESS;
|
||||
|
||||
#define PXENV_UNDI_SET_STATION_ADDRESS 0x000A
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
MAC_ADDR StationAddress; /* Temp MAC addres to use */
|
||||
} PACKED t_PXENV_UNDI_SET_STATION_ADDRESS;
|
||||
|
||||
#define PXENV_UNDI_SET_PACKET_FILTER 0x000B
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
uint8_t filter; /* see UNDI_OPEN (0x0006) */
|
||||
} PACKED t_PXENV_UNDI_SET_PACKET_FILTER;
|
||||
|
||||
#define PXENV_UNDI_GET_INFORMATION 0x000C
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
uint16_t BaseIo; /* Adapter base I/O address */
|
||||
uint16_t IntNumber; /* Adapter IRQ number */
|
||||
uint16_t MaxTranUnit; /* Adapter maximum transmit unit */
|
||||
uint16_t HwType; /* Type of protocol at the hardware addr */
|
||||
# define ETHER_TYPE 1
|
||||
# define EXP_ETHER_TYPE 2
|
||||
# define IEEE_TYPE 6
|
||||
# define ARCNET_TYPE 7
|
||||
|
||||
uint16_t HwAddrLen; /* Length of hardware address */
|
||||
MAC_ADDR CurrentNodeAddress; /* Current hardware address */
|
||||
MAC_ADDR PermNodeAddress; /* Permanent hardware address */
|
||||
SEGSEL_t ROMAddress; /* Real mode ROM segment address */
|
||||
uint16_t RxBufCt; /* Receive queue length */
|
||||
uint16_t TxBufCt; /* Transmit queue length */
|
||||
} PACKED t_PXENV_UNDI_GET_INFORMATION;
|
||||
|
||||
#define PXENV_UNDI_GET_STATISTICS 0x000D
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
uint32_t XmitGoodFrames; /* Number of successful transmissions */
|
||||
uint32_t RcvGoodFrames; /* Number of good frames received */
|
||||
uint32_t RcvCRCErrors; /* Number of frames with CRC errors */
|
||||
uint32_t RcvResourceErrors; /* Number of frames dropped */
|
||||
} PACKED t_PXENV_UNDI_GET_STATISTICS;
|
||||
|
||||
#define PXENV_UNDI_CLEAR_STATISTICS 0x000E
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
} PACKED t_PXENV_UNDI_CLEAR_STATISTICS;
|
||||
|
||||
#define PXENV_UNDI_INITIATE_DIAGS 0x000F
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
} PACKED t_PXENV_UNDI_INITIATE_DIAGS;
|
||||
|
||||
#define PXENV_UNDI_FORCE_INTERRUPT 0x0010
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
} PACKED t_PXENV_UNDI_FORCE_INTERRUPT;
|
||||
|
||||
#define PXENV_UNDI_GET_MCAST_ADDRESS 0x0011
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
IP4_t InetAddr; /* IP mulicast address */
|
||||
MAC_ADDR MediaAddr; /* MAC multicast address */
|
||||
} PACKED t_PXENV_UNDI_GET_MCAST_ADDRESS;
|
||||
|
||||
#define PXENV_UNDI_GET_NIC_TYPE 0x0012
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
uint8_t NicType; /* Type of NIC */
|
||||
# define PCI_NIC 2
|
||||
# define PnP_NIC 3
|
||||
# define CardBus_NIC 4
|
||||
|
||||
union {
|
||||
struct {
|
||||
uint16_t Vendor_ID;
|
||||
uint16_t Dev_ID;
|
||||
uint8_t Base_Class;
|
||||
uint8_t Sub_Class;
|
||||
uint8_t Prog_Intf;
|
||||
uint8_t Rev;
|
||||
uint16_t BusDevFunc;
|
||||
uint16_t SubVendor_ID;
|
||||
uint16_t SubDevice_ID;
|
||||
} pci, cardbus;
|
||||
struct {
|
||||
uint32_t EISA_Dev_ID;
|
||||
uint8_t Base_Class;
|
||||
uint8_t Sub_Class;
|
||||
uint8_t Prog_Intf;
|
||||
uint16_t CardSelNum;
|
||||
} pnp;
|
||||
} info;
|
||||
} PACKED t_PXENV_UNDI_GET_NIC_TYPE;
|
||||
|
||||
#define PXENV_UNDI_GET_IFACE_INFO 0x0013
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
uint8_t IfaceType[16]; /* Name of MAC type in ASCII. */
|
||||
uint32_t LinkSpeed; /* Defined in NDIS 2.0 spec */
|
||||
uint32_t ServiceFlags; /* Defined in NDIS 2.0 spec */
|
||||
uint32_t Reserved[4]; /* must be 0 */
|
||||
} PACKED t_PXENV_UNDI_GET_IFACE_INFO;
|
||||
|
||||
#define PXENV_UNDI_ISR 0x0014
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
uint16_t FuncFlag; /* PXENV_UNDI_ISR_OUT_xxx */
|
||||
uint16_t BufferLength; /* Length of Frame */
|
||||
uint16_t FrameLength; /* Total length of reciever frame */
|
||||
uint16_t FrameHeaderLength; /* Length of the media header in Frame */
|
||||
SEGOFF16_t Frame; /* receive buffer */
|
||||
uint8_t ProtType; /* Protocol type */
|
||||
uint8_t PktType; /* Packet Type */
|
||||
# define PXENV_UNDI_ISR_IN_START 1
|
||||
# define PXENV_UNDI_ISR_IN_PROCESS 2
|
||||
# define PXENV_UNDI_ISR_IN_GET_NEXT 3
|
||||
|
||||
/* one of these will be returned for PXENV_UNDI_ISR_IN_START */
|
||||
# define PXENV_UNDI_ISR_OUT_OURS 0
|
||||
# define PXENV_UNDI_ISR_OUT_NOT_OURS 1
|
||||
|
||||
/*
|
||||
* one of these will bre returnd for PXEND_UNDI_ISR_IN_PROCESS
|
||||
* and PXENV_UNDI_ISR_IN_GET_NEXT
|
||||
*/
|
||||
# define PXENV_UNDI_ISR_OUT_DONE 0
|
||||
# define PXENV_UNDI_ISR_OUT_TRANSMIT 2
|
||||
# define PXENV_UNDI_ISR_OUT_RECEIVE 3
|
||||
# define PXENV_UNDI_ISR_OUT_BUSY 4
|
||||
} PACKED t_PXENV_UNDI_ISR;
|
||||
|
||||
#define PXENV_STOP_UNDI 0x0015
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
} PACKED t_PXENV_STOP_UNDI;
|
||||
|
||||
#define PXENV_TFTP_OPEN 0x0020
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
IP4_t ServerIPAddress;
|
||||
IP4_t GatewayIPAddress;
|
||||
uint8_t FileName[128];
|
||||
UDP_PORT_t TFTPPort;
|
||||
uint16_t PacketSize;
|
||||
} PACKED t_PXENV_TFTP_OPEN;
|
||||
|
||||
#define PXENV_TFTP_CLOSE 0x0021
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
} PACKED t_PXENV_TFTP_CLOSE;
|
||||
|
||||
#define PXENV_TFTP_READ 0x0022
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
uint16_t PacketNumber;
|
||||
uint16_t BufferSize;
|
||||
SEGOFF16_t Buffer;
|
||||
} PACKED t_PXENV_TFTP_READ;
|
||||
|
||||
#define PXENV_TFTP_READ_FILE 0x0023
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
uint8_t FileName[128];
|
||||
uint32_t BufferSize;
|
||||
ADDR32_t Buffer;
|
||||
IP4_t ServerIPAddress;
|
||||
IP4_t GatewayIPAdress;
|
||||
IP4_t McastIPAdress;
|
||||
UDP_PORT_t TFTPClntPort;
|
||||
UDP_PORT_t TFTPSrvPort;
|
||||
uint16_t TFTPOpenTimeOut;
|
||||
uint16_t TFTPReopenDelay;
|
||||
} PACKED t_PXENV_TFTP_READ_FILE;
|
||||
|
||||
#define PXENV_TFTP_GET_FSIZE 0x0025
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
IP4_t ServerIPAddress;
|
||||
IP4_t GatewayIPAdress;
|
||||
uint8_t FileName[128];
|
||||
uint32_t FileSize;
|
||||
} PACKED t_PXENV_TFTP_GET_FSIZE;
|
||||
|
||||
#define PXENV_UDP_OPEN 0x0030
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
IP4_t src_ip; /* IP address of this station */
|
||||
} PACKED t_PXENV_UDP_OPEN;
|
||||
|
||||
#define PXENV_UDP_CLOSE 0x0031
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
} PACKED t_PXENV_UDP_CLOSE;
|
||||
|
||||
#define PXENV_UDP_READ 0x0032
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
IP4_t src_ip; /* IP of sender */
|
||||
IP4_t dest_ip; /* Only accept packets sent to this IP */
|
||||
UDP_PORT_t s_port; /* UDP source port of sender */
|
||||
UDP_PORT_t d_port; /* Only accept packets sent to this port */
|
||||
uint16_t buffer_size; /* Size of the packet buffer */
|
||||
SEGOFF16_t buffer; /* SEG:OFF to the packet buffer */
|
||||
} PACKED t_PXENV_UDP_READ;
|
||||
|
||||
#define PXENV_UDP_WRITE 0x0033
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
IP4_t ip; /* dest ip addr */
|
||||
IP4_t gw; /* ip gateway */
|
||||
UDP_PORT_t src_port; /* source udp port */
|
||||
UDP_PORT_t dst_port; /* destination udp port */
|
||||
uint16_t buffer_size; /* Size of the packet buffer */
|
||||
SEGOFF16_t buffer; /* SEG:OFF to the packet buffer */
|
||||
} PACKED t_PXENV_UDP_WRITE;
|
||||
|
||||
#define PXENV_UNLOAD_STACK 0x0070
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
uint8_t reserved[10];
|
||||
} PACKED t_PXENV_UNLOAD_STACK;
|
||||
|
||||
|
||||
#define PXENV_GET_CACHED_INFO 0x0071
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
uint16_t PacketType; /* type (defined right here) */
|
||||
# define PXENV_PACKET_TYPE_DHCP_DISCOVER 1
|
||||
# define PXENV_PACKET_TYPE_DHCP_ACK 2
|
||||
# define PXENV_PACKET_TYPE_BINL_REPLY 3
|
||||
uint16_t BufferSize; /* max to copy, leave at 0 for pointer */
|
||||
SEGOFF16_t Buffer; /* copy to, leave at 0 for pointer */
|
||||
uint16_t BufferLimit; /* max size of buffer in BC dataseg ? */
|
||||
} PACKED t_PXENV_GET_CACHED_INFO;
|
||||
|
||||
|
||||
/* structure filled in by PXENV_GET_CACHED_INFO
|
||||
* (how we determine which IP we downloaded the initial bootstrap from)
|
||||
* words can't describe...
|
||||
*/
|
||||
typedef struct {
|
||||
uint8_t opcode;
|
||||
# define BOOTP_REQ 1
|
||||
# define BOOTP_REP 2
|
||||
uint8_t Hardware; /* hardware type */
|
||||
uint8_t Hardlen; /* hardware addr len */
|
||||
uint8_t Gatehops; /* zero it */
|
||||
uint32_t ident; /* random number chosen by client */
|
||||
uint16_t seconds; /* seconds since did initial bootstrap */
|
||||
uint16_t Flags; /* seconds since did initial bootstrap */
|
||||
# define BOOTP_BCAST 0x8000 /* ? */
|
||||
IP4_t cip; /* Client IP */
|
||||
IP4_t yip; /* Your IP */
|
||||
IP4_t sip; /* IP to use for next boot stage */
|
||||
IP4_t gip; /* Relay IP ? */
|
||||
MAC_ADDR CAddr; /* Client hardware address */
|
||||
uint8_t Sname[64]; /* Server's hostname (Optional) */
|
||||
uint8_t bootfile[128]; /* boot filename */
|
||||
union {
|
||||
# if 1
|
||||
# define BOOTP_DHCPVEND 1024 /* DHCP extended vendor field size */
|
||||
# else
|
||||
# define BOOTP_DHCPVEND 312 /* DHCP standard vendor field size */
|
||||
# endif
|
||||
uint8_t d[BOOTP_DHCPVEND]; /* raw array of vendor/dhcp options */
|
||||
struct {
|
||||
uint8_t magic[4]; /* DHCP magic cookie */
|
||||
# ifndef VM_RFC1048
|
||||
# define VM_RFC1048 0x63825363L /* ? */
|
||||
# endif
|
||||
uint32_t flags; /* bootp flags/opcodes */
|
||||
uint8_t pad[56]; /* I don't think intel knows what a
|
||||
union does... */
|
||||
} v;
|
||||
} vendor;
|
||||
} PACKED BOOTPLAYER;
|
||||
|
||||
#define PXENV_RESTART_TFTP 0x0073
|
||||
#define t_PXENV_RESTART_TFTP t_PXENV_TFTP_READ_FILE
|
||||
|
||||
#define PXENV_START_BASE 0x0075
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
} PACKED t_PXENV_START_BASE;
|
||||
|
||||
#define PXENV_STOP_BASE 0x0076
|
||||
typedef struct {
|
||||
PXENV_STATUS_t Status;
|
||||
} PACKED t_PXENV_STOP_BASE;
|
||||
|
||||
/*****************************************************************************
|
||||
* The following portion of this file is derived from netboot's
|
||||
* general.h86. Do not remove the copyright notice below.
|
||||
*****************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
* general.h86 - Common PXE definitions
|
||||
*
|
||||
* Copyright (C) 2003 Gero Kuhlmann <gero@gkminix.han.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/*
|
||||
**************************************************************************
|
||||
*
|
||||
* This file contains the Preboot API common definitions as
|
||||
* per Intels PXE specification version 2.0.
|
||||
*
|
||||
* Updated to comply with PXE specification version 2.1 by Michael Brown.
|
||||
*
|
||||
**************************************************************************
|
||||
*
|
||||
* Result codes returned in AX by a PXENV API service:
|
||||
*/
|
||||
#define PXENV_EXIT_SUCCESS 0x0000
|
||||
#define PXENV_EXIT_FAILURE 0x0001
|
||||
|
||||
|
||||
|
||||
/*
|
||||
**************************************************************************
|
||||
*
|
||||
* CPU types (defined in WfM 1.1):
|
||||
*/
|
||||
#define PXENV_CPU_X86 0
|
||||
#define PXENV_CPU_ALPHA 1
|
||||
#define PXENV_CPU_PPC 2
|
||||
|
||||
|
||||
|
||||
/*
|
||||
**************************************************************************
|
||||
*
|
||||
* Bus types (defined in WfM 1.1):
|
||||
*/
|
||||
#define PXENV_BUS_ISA 0
|
||||
#define PXENV_BUS_EISA 1
|
||||
#define PXENV_BUS_MCA 2
|
||||
#define PXENV_BUS_PCI 3
|
||||
#define PXENV_BUS_VESA 4
|
||||
#define PXENV_BUS_PCMCIA 5
|
||||
|
||||
|
||||
|
||||
/*
|
||||
**************************************************************************
|
||||
*
|
||||
* Status codes returned in the status word of the PXENV API parameter
|
||||
* structure. Some of these codes are also used to return status
|
||||
* information from a boot image loader back to the bootrom.
|
||||
*/
|
||||
|
||||
/* Generic API errors that are reported by the loader */
|
||||
#define PXENV_STATUS_SUCCESS 0x00
|
||||
#define PXENV_STATUS_FAILURE 0x01 /* general failure */
|
||||
#define PXENV_STATUS_BAD_FUNC 0x02 /* invalid function number */
|
||||
#define PXENV_STATUS_UNSUPPORTED 0x03 /* not yet supported */
|
||||
#define PXENV_STATUS_KEEP_UNDI 0x04 /* keep UNDI in memory */
|
||||
#define PXENV_STATUS_KEEP_ALL 0x05 /* keep everything in memory */
|
||||
#define PXENV_STATUS_OUT_OF_RESOURCES 0x06 /* also keep everything */
|
||||
|
||||
/* ARP/UDP errors (0x10 to 0x1F) */
|
||||
#define PXENV_STATUS_ARP_CANCELED 0x10 /* ARP canceled by keystroke */
|
||||
#define PXENV_STATUS_ARP_TIMEOUT 0x11 /* ARP timeout */
|
||||
#define PXENV_STATUS_UDP_CLOSED 0x18 /* UDP closed */
|
||||
#define PXENV_STATUS_UDP_OPEN 0x19 /* UDP already open */
|
||||
#define PXENV_STATUS_TFTP_CLOSED 0x1A /* TFTP closed */
|
||||
#define PXENV_STATUS_TFTP_OPEN 0x1B /* TFTP already opened */
|
||||
|
||||
/* BIOS/system errors (0x20 to 0x2F) */
|
||||
#define PXENV_STATUS_MCOPY_PROBLEM 0x20 /* can't copy into memory */
|
||||
|
||||
/* TFP errors (0x30 to 0x3F) */
|
||||
#define PXENV_STATUS_TFTP_CANNOT_ARP 0x30 /* TFTP ARP problem */
|
||||
#define PXENV_STATUS_TFTP_OPEN_CANCELED 0x31 /* TFTP open canceled by key */
|
||||
#define PXENV_STATUS_TFTP_OPEN_TIMEOUT 0x32 /* timeout during TFTP open */
|
||||
#define PXENV_STATUS_TFTP_UNKNOWN_OPCODE 0x33 /* unknown TFTP opcode */
|
||||
#define PXENV_STATUS_TFTP_READ_CANCELED 0x34 /* TFTP read canceled by key */
|
||||
#define PXENV_STATUS_TFTP_READ_TIMEOUT 0x35 /* timeout during TFTP read */
|
||||
#define PXENV_STATUS_TFTP_ERROR_OPCODE 0x36 /* bad TFTP opcode */
|
||||
#define PXENV_STATUS_TFTP_CANNOT_OPEN_CONNECTION \
|
||||
0x38 /* error during TFTP open */
|
||||
#define PXENV_STATUS_TFTP_CANNOT_READ_FROM_CONNECTION \
|
||||
0x39 /* error during TFTP read */
|
||||
#define PXENV_STATUS_TFTP_TOO_MANY_PACKAGES \
|
||||
0x3A /* too many packages */
|
||||
#define PXENV_STATUS_TFTP_FILE_NOT_FOUND 0x3B /* file not found */
|
||||
#define PXENV_STATUS_TFTP_ACCESS_VIOLATION 0x3C /* access violation */
|
||||
#define PXENV_STATUS_TFTP_NO_MCAST_ADDRESS 0x3D /* no multicast address */
|
||||
#define PXENV_STATUS_TFTP_NO_FILESIZE 0x3E /* unable to get file size */
|
||||
#define PXENV_STATUS_TFTP_INVALID_PACKET_SIZE \
|
||||
0x3F /* invalid packet size */
|
||||
|
||||
/* BOOTP errors (0x40 to 0x4F) */
|
||||
#define PXENV_STATUS_BOOTP_CANCELED 0x40 /* BOOTP canceled by key */
|
||||
#define PXENV_STATUS_BOOTP_TIMEOUT 0x41 /* timeout during BOOTP */
|
||||
#define PXENV_STATUS_BOOTP_NO_FILE 0x42 /* missing bootfile name */
|
||||
|
||||
/* DHCP errors (0x50 to 0x5F) */
|
||||
#define PXENV_STATUS_DHCP_CANCELED 0x50 /* DHCP canceled by key */
|
||||
#define PXENV_STATUS_DHCP_TIMEOUT 0x51 /* timeout during DHCP */
|
||||
#define PXENV_STATUS_DHCP_NO_IP_ADDRESS 0x52 /* missing IP address */
|
||||
#define PXENV_STATUS_DHCP_NO_BOOTFILE_NAME 0x53 /* missing bootfile name */
|
||||
#define PXENV_STATUS_DHCP_BAD_IP_ADDRESS 0x54 /* invalid IP address */
|
||||
|
||||
/* Driver errors (0x60 to 0x6F) */
|
||||
#define PXENV_STATUS_UNDI_INVALID_FUNCTION 0x60 /* invalid UNDI function */
|
||||
#define PXENV_STATUS_UNDI_MEDIATEST_FAILED 0x61 /* media test failed */
|
||||
#define PXENV_STATUS_UNDI_CANNOT_INIT_NIC_FOR_MCAST \
|
||||
0x62 /* cannot init for multicast */
|
||||
#define PXENV_STATUS_UNDI_CANNOT_INITIALIZE_NIC \
|
||||
0x63 /* cannot init NIC */
|
||||
#define PXENV_STATUS_UNDI_CANNOT_INITIALIZE_PHY \
|
||||
0x64 /* cannot init hardware */
|
||||
#define PXENV_STATUS_UNDI_CANNOT_READ_CONFIG_DATA \
|
||||
0x65 /* cannot read config data */
|
||||
#define PXENV_STATUS_UNDI_CANNOT_READ_INIT_DATA \
|
||||
0x66 /* cannot read init data */
|
||||
#define PXENV_STATUS_UNDI_BAD_MAC_ADDRESS 0x67 /* invalid hardware address */
|
||||
#define PXENV_STATUS_UNDI_BAD_EEPROM_CHECKSUM \
|
||||
0x68 /* invalid EEPROM checksum */
|
||||
#define PXENV_STATUS_UNDI_ERROR_SETTING_ISR 0x69
|
||||
#define PXENV_STATUS_UNDI_INVALID_STATE 0x6a /* invalid UNDI state */
|
||||
#define PXENV_STATUS_UNDI_TRANSMIT_ERROR 0x6b /* transmit error */
|
||||
#define PXENV_STATUS_UNDI_INVALID_PARAMETER \
|
||||
0x6c /* almost anything */
|
||||
|
||||
/* Bootstrap (.1) errors (0x70 to 0x7F) */
|
||||
#define PXENV_STATUS_BSTRAP_PROMPT_MENU 0x74 /* invalid bootstrap menu */
|
||||
#define PXENV_STATUS_BSTRAP_MCAST_ADDR 0x76 /* missing multicast address */
|
||||
#define PXENV_STATUS_BSTRAP_MISSING_LIST 0x77 /* missing file list */
|
||||
#define PXENV_STATUS_BSTRAP_NO_RESPONSE 0x78 /* no response from server */
|
||||
#define PXENV_STATUS_BSTRAP_FILE_TOO_BIG 0x79 /* next file too big */
|
||||
|
||||
/* Environment (.2) errors (0x80 to 0x8F) */
|
||||
|
||||
/* MTFTP errors (0x90 to 0x9F) */
|
||||
#define PXENV_STATUS_MTFTP_OPEN_CANCEL 0x91 /* MTFTP open canceled by key */
|
||||
#define PXENV_STATUS_MTFTP_OPEN_TIMEOUT 0x92 /* timeout during MTFTP open */
|
||||
#define PXENV_STATUS_MTFTP_UNKNOWN_OP 0x93 /* unknown TFTP opcode */
|
||||
#define PXENV_STATUS_MTFTP_READ_CANCEL 0x94 /* MTFTP read canceled by key */
|
||||
#define PXENV_STATUS_MTFTP_READ_TIMEOUT 0x95 /* timeout during MTFTP read */
|
||||
#define PXENV_STATUS_MTFTP_ERROR_OP 0x96 /* bad TFTP opcode */
|
||||
#define PXENV_STATUS_MTFTP_CANNOT_OPEN 0x98 /* error during MTFTP open */
|
||||
#define PXENV_STATUS_MTFTP_CANNOT_READ 0x99 /* error during MTFTP read */
|
||||
#define PXENV_STATUS_MTFTP_TOO_MANY 0x9A /* too many packages */
|
||||
#define PXENV_STATUS_MTFTP_PACK_SIZE 0x9B /* invalid package size */
|
||||
|
||||
/* Misc. errors (0xA0 to 0xAF) */
|
||||
#define PXENV_STATUS_BINL_CANCELED_BY_KEYSTROKE \
|
||||
0xA0 /* BINL canceled by key */
|
||||
#define PXENV_STATUS_BINL_NO_PXE_SERVER 0xA1 /* no BINL server found */
|
||||
#define PXENV_STATUS_NOT_AVAILABLE_IN_PMODE \
|
||||
0xA2 /* not avail. in prot mode */
|
||||
#define PXENV_STATUS_NOT_AVAILABLE_IN_RMODE \
|
||||
0xA3 /* not avail. in real mode */
|
||||
|
||||
/* BUSD errors (0xB0 to 0xBF) */
|
||||
#define PXENV_STATUS_BUSD_DEVICE_NOT_SUPPORTED \
|
||||
0xB0 /* BUSD services not enabled */
|
||||
#define PXENV_STATUS_BUSD_DEV_ENABLE 0xB1 /* BUSD device not enabled */
|
||||
|
||||
/* Loader errors (0xC0 to 0xCF) */
|
||||
#define PXENV_STATUS_LOADER_NO_FREE_BASE_MEMORY \
|
||||
0xC0 /* no free base memory */
|
||||
#define PXENV_STATUS_LOADER_NO_BC_ROMID 0xC1 /* no base code rom ID */
|
||||
#define PXENV_STATUS_LOADER_BAD_BC_ROMID 0xC2 /* bad base code rom ID */
|
||||
#define PXENV_STATUS_LOADER_BAD_BC_RUNTIME_IMAGE \
|
||||
0xC3 /* bad base code image */
|
||||
#define PXENV_STATUS_LOADER_NO_UNDI_ROMID 0xC4 /* no UNDI rom ID */
|
||||
#define PXENV_STATUS_LOADER_BAD_UNDI_ROMID 0xC5 /* bad UNDI rom ID */
|
||||
#define PXENV_STATUS_LOADER_UNDI_DRIVER_IMAGE \
|
||||
0xC6 /* bad UNDI runtime image */
|
||||
#define PXENV_STATUS_LOADER_NO_PXE_STRUCT 0xC8 /* missing !PXE struct */
|
||||
#define PXENV_STATUS_LOADER_NO_PXENV_STRUCT \
|
||||
0xC9 /* missing PXENV+ struct */
|
||||
#define PXENV_STATUS_LOADER_UNDI_START 0xCA /* UNDI not started */
|
||||
#define PXENV_STATUS_LOADER_BC_START 0xCB /* base code not started */
|
||||
|
||||
/* Reserved errors (0xD0 to 0xFF) */
|
||||
#define PXENV_STATUS_IMAGE_INVALID 0xD0 /* invalid boot image */
|
||||
#define PXENV_STATUS_STOP_BASE 0xD1 /* error stopping base code */
|
||||
#define PXENV_STATUS_UNLOAD_BASE 0xD2 /* error unloading base code */
|
||||
#define PXENV_STATUS_STOP_UNDI 0xD3 /* error stopping UNDI */
|
||||
#define PXENV_STATUS_CLEANUP_UNDI 0xD4 /* error cleaning up UNDI */
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* The remainder of this file is original to Etherboot.
|
||||
*****************************************************************************
|
||||
*/
|
||||
|
||||
/* Dummy PXE opcode for the loader routine. We do this to make the
|
||||
* API simpler
|
||||
*/
|
||||
#define PXENV_UNDI_LOADER 0x104d /* 'load' */
|
||||
|
||||
typedef struct undi_loader {
|
||||
union {
|
||||
struct {
|
||||
PXENV_STATUS_t Status;
|
||||
uint16_t ax;
|
||||
uint16_t bx;
|
||||
uint16_t dx;
|
||||
uint16_t di;
|
||||
uint16_t es;
|
||||
};
|
||||
t_PXENV_START_UNDI start_undi;
|
||||
};
|
||||
uint16_t undi_ds;
|
||||
uint16_t undi_cs;
|
||||
SEGOFF16_t pxe_ptr;
|
||||
SEGOFF16_t pxenv_ptr;
|
||||
} PACKED undi_loader_t;
|
||||
|
||||
/* Union used for PXE API calls; we don't know the type of the
|
||||
* structure until we interpret the opcode. Also, Status is available
|
||||
* in the same location for any opcode, and it's convenient to have
|
||||
* non-specific access to it.
|
||||
*/
|
||||
typedef union {
|
||||
PXENV_STATUS_t Status; /* Make it easy to read status
|
||||
for any operation */
|
||||
t_PXENV_START_UNDI start_undi;
|
||||
t_PXENV_UNDI_STARTUP undi_startup;
|
||||
t_PXENV_UNDI_CLEANUP undi_cleanup;
|
||||
t_PXENV_UNDI_INITIALIZE undi_initialize;
|
||||
t_PXENV_UNDI_RESET_ADAPTER undi_reset_adapter;
|
||||
t_PXENV_UNDI_SHUTDOWN undi_shutdown;
|
||||
t_PXENV_UNDI_OPEN undi_open;
|
||||
t_PXENV_UNDI_CLOSE undi_close;
|
||||
t_PXENV_UNDI_TRANSMIT undi_transmit;
|
||||
t_PXENV_UNDI_SET_MCAST_ADDRESS undi_set_mcast_address;
|
||||
t_PXENV_UNDI_SET_STATION_ADDRESS undi_set_station_address;
|
||||
t_PXENV_UNDI_SET_PACKET_FILTER undi_set_packet_filter;
|
||||
t_PXENV_UNDI_GET_INFORMATION undi_get_information;
|
||||
t_PXENV_UNDI_GET_STATISTICS undi_get_statistics;
|
||||
t_PXENV_UNDI_CLEAR_STATISTICS undi_clear_statistics;
|
||||
t_PXENV_UNDI_INITIATE_DIAGS undi_initiate_diags;
|
||||
t_PXENV_UNDI_FORCE_INTERRUPT undi_force_interrupt;
|
||||
t_PXENV_UNDI_GET_MCAST_ADDRESS undi_get_mcast_address;
|
||||
t_PXENV_UNDI_GET_NIC_TYPE undi_get_nic_type;
|
||||
t_PXENV_UNDI_GET_IFACE_INFO undi_get_iface_info;
|
||||
t_PXENV_UNDI_ISR undi_isr;
|
||||
t_PXENV_STOP_UNDI stop_undi;
|
||||
t_PXENV_TFTP_OPEN tftp_open;
|
||||
t_PXENV_TFTP_CLOSE tftp_close;
|
||||
t_PXENV_TFTP_READ tftp_read;
|
||||
t_PXENV_TFTP_READ_FILE tftp_read_file;
|
||||
t_PXENV_TFTP_GET_FSIZE tftp_get_fsize;
|
||||
t_PXENV_UDP_OPEN udp_open;
|
||||
t_PXENV_UDP_CLOSE udp_close;
|
||||
t_PXENV_UDP_READ udp_read;
|
||||
t_PXENV_UDP_WRITE udp_write;
|
||||
t_PXENV_UNLOAD_STACK unload_stack;
|
||||
t_PXENV_GET_CACHED_INFO get_cached_info;
|
||||
t_PXENV_RESTART_TFTP restart_tftp;
|
||||
t_PXENV_START_BASE start_base;
|
||||
t_PXENV_STOP_BASE stop_base;
|
||||
undi_loader_t loader;
|
||||
} t_PXENV_ANY;
|
||||
|
||||
/* PXE stack status indicator. See pxe_export.c for further
|
||||
* explanation.
|
||||
*/
|
||||
typedef enum {
|
||||
CAN_UNLOAD = 0,
|
||||
MIDWAY,
|
||||
READY
|
||||
} pxe_stack_state_t;
|
||||
|
||||
/* Data structures installed as part of a PXE stack. Architectures
|
||||
* will have extra information to append to the end of this.
|
||||
*/
|
||||
#define PXE_TFTP_MAGIC_COOKIE ( ( 'P'<<24 ) | ( 'x'<<16 ) | ( 'T'<<8 ) | 'f' )
|
||||
typedef struct {
|
||||
pxe_t pxe __attribute__ ((aligned(16)));
|
||||
pxenv_t pxenv __attribute__ ((aligned(16)));
|
||||
pxe_stack_state_t state;
|
||||
union {
|
||||
BOOTPLAYER cached_info;
|
||||
char packet[ETH_FRAME_LEN];
|
||||
struct {
|
||||
uint32_t magic_cookie;
|
||||
unsigned int len;
|
||||
int eof;
|
||||
char data[TFTP_MAX_PACKET];
|
||||
} tftpdata;
|
||||
struct {
|
||||
char *buffer;
|
||||
uint32_t offset;
|
||||
uint32_t bufferlen;
|
||||
} readfile;
|
||||
};
|
||||
struct {} arch_data __attribute__ ((aligned(16)));
|
||||
} pxe_stack_t;
|
||||
|
||||
#endif /* PXE_H */
|
||||
61
src/include/pxe_export.h
Normal file
61
src/include/pxe_export.h
Normal file
@@ -0,0 +1,61 @@
|
||||
/* Header for pxe_export.c
|
||||
*/
|
||||
|
||||
#ifndef PXE_EXPORT_H
|
||||
#define PXE_EXPORT_H
|
||||
|
||||
#include "pxe.h"
|
||||
|
||||
/* Function prototypes */
|
||||
extern int ensure_pxe_state ( pxe_stack_state_t wanted );
|
||||
|
||||
extern PXENV_EXIT_t pxenv_start_undi ( t_PXENV_START_UNDI * );
|
||||
extern PXENV_EXIT_t pxenv_undi_startup ( t_PXENV_UNDI_STARTUP * );
|
||||
extern PXENV_EXIT_t pxenv_undi_cleanup ( t_PXENV_UNDI_CLEANUP * );
|
||||
extern PXENV_EXIT_t pxenv_undi_initialize ( t_PXENV_UNDI_INITIALIZE * );
|
||||
extern PXENV_EXIT_t pxenv_undi_reset_adapter ( t_PXENV_UNDI_RESET_ADAPTER * );
|
||||
extern PXENV_EXIT_t pxenv_undi_shutdown ( t_PXENV_UNDI_SHUTDOWN * );
|
||||
extern PXENV_EXIT_t pxenv_undi_open ( t_PXENV_UNDI_OPEN * );
|
||||
extern PXENV_EXIT_t pxenv_undi_close ( t_PXENV_UNDI_CLOSE * );
|
||||
extern PXENV_EXIT_t pxenv_undi_transmit ( t_PXENV_UNDI_TRANSMIT * );
|
||||
extern PXENV_EXIT_t pxenv_undi_set_mcast_address (
|
||||
t_PXENV_UNDI_SET_MCAST_ADDRESS * );
|
||||
extern PXENV_EXIT_t pxenv_undi_set_station_address (
|
||||
t_PXENV_UNDI_SET_STATION_ADDRESS * );
|
||||
extern PXENV_EXIT_t pxenv_undi_set_packet_filter (
|
||||
t_PXENV_UNDI_SET_PACKET_FILTER * );
|
||||
extern PXENV_EXIT_t pxenv_undi_get_information (
|
||||
t_PXENV_UNDI_GET_INFORMATION * );
|
||||
extern PXENV_EXIT_t pxenv_undi_get_statistics ( t_PXENV_UNDI_GET_STATISTICS* );
|
||||
extern PXENV_EXIT_t pxenv_undi_clear_statistics (
|
||||
t_PXENV_UNDI_CLEAR_STATISTICS * );
|
||||
extern PXENV_EXIT_t pxenv_undi_initiate_diags ( t_PXENV_UNDI_INITIATE_DIAGS* );
|
||||
extern PXENV_EXIT_t pxenv_undi_force_interrupt (
|
||||
t_PXENV_UNDI_FORCE_INTERRUPT * );
|
||||
extern PXENV_EXIT_t pxenv_undi_get_mcast_address (
|
||||
t_PXENV_UNDI_GET_MCAST_ADDRESS * );
|
||||
extern PXENV_EXIT_t pxenv_undi_get_nic_type ( t_PXENV_UNDI_GET_NIC_TYPE * );
|
||||
extern PXENV_EXIT_t pxenv_undi_get_iface_info ( t_PXENV_UNDI_GET_IFACE_INFO *);
|
||||
extern PXENV_EXIT_t pxenv_undi_isr ( t_PXENV_UNDI_ISR * );
|
||||
extern PXENV_EXIT_t pxenv_stop_undi ( t_PXENV_STOP_UNDI * );
|
||||
extern PXENV_EXIT_t pxenv_tftp_open ( t_PXENV_TFTP_OPEN * );
|
||||
extern PXENV_EXIT_t pxenv_tftp_close ( t_PXENV_TFTP_CLOSE * );
|
||||
extern PXENV_EXIT_t pxenv_tftp_read ( t_PXENV_TFTP_READ * );
|
||||
extern PXENV_EXIT_t pxenv_tftp_read_file ( t_PXENV_TFTP_READ_FILE * );
|
||||
extern PXENV_EXIT_t pxenv_tftp_get_fsize ( t_PXENV_TFTP_GET_FSIZE * );
|
||||
extern PXENV_EXIT_t pxenv_udp_open ( t_PXENV_UDP_OPEN * );
|
||||
extern PXENV_EXIT_t pxenv_udp_close ( t_PXENV_UDP_CLOSE * );
|
||||
extern PXENV_EXIT_t pxenv_udp_read ( t_PXENV_UDP_READ * );
|
||||
extern PXENV_EXIT_t pxenv_udp_write ( t_PXENV_UDP_WRITE * );
|
||||
extern PXENV_EXIT_t pxenv_unload_stack ( t_PXENV_UNLOAD_STACK * );
|
||||
extern PXENV_EXIT_t pxenv_get_cached_info ( t_PXENV_GET_CACHED_INFO * );
|
||||
extern PXENV_EXIT_t pxenv_restart_tftp ( t_PXENV_RESTART_TFTP * );
|
||||
extern PXENV_EXIT_t pxenv_start_base ( t_PXENV_START_BASE * );
|
||||
extern PXENV_EXIT_t pxenv_stop_base ( t_PXENV_STOP_BASE * );
|
||||
|
||||
extern PXENV_EXIT_t pxe_api_call ( int opcode, t_PXENV_ANY *params );
|
||||
|
||||
/* Static variables */
|
||||
extern pxe_stack_t *pxe_stack;
|
||||
|
||||
#endif /* PXE_EXPORT_H */
|
||||
68
src/include/string.h
Normal file
68
src/include/string.h
Normal file
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
* Copyright (C) 1991, 1992 Linus Torvalds
|
||||
* Copyright (C) 2004 Tobias Lorenz
|
||||
*
|
||||
* string handling functions
|
||||
* based on linux/include/linux/ctype.h
|
||||
* and linux/include/linux/string.h
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef ETHERBOOT_STRING_H
|
||||
#define ETHERBOOT_STRING_H
|
||||
|
||||
#include "bits/string.h"
|
||||
|
||||
|
||||
/* *** FROM ctype.h *** */
|
||||
|
||||
#define isdigit(c) ((c & 0x04) != 0)
|
||||
#define islower(c) ((c & 0x02) != 0)
|
||||
//#define isspace(c) ((c & 0x20) != 0)
|
||||
#define isupper(c) ((c & 0x01) != 0)
|
||||
|
||||
static inline unsigned char tolower(unsigned char c)
|
||||
{
|
||||
if (isupper(c))
|
||||
c -= 'A'-'a';
|
||||
return c;
|
||||
}
|
||||
|
||||
static inline unsigned char toupper(unsigned char c)
|
||||
{
|
||||
if (islower(c))
|
||||
c -= 'a'-'A';
|
||||
return c;
|
||||
}
|
||||
|
||||
|
||||
/* *** FROM string.h *** */
|
||||
|
||||
int strnicmp(const char *s1, const char *s2, size_t len);
|
||||
char * strcpy(char * dest,const char *src);
|
||||
char * strncpy(char * dest,const char *src,size_t count);
|
||||
char * strcat(char * dest, const char * src);
|
||||
char * strncat(char *dest, const char *src, size_t count);
|
||||
int strcmp(const char * cs,const char * ct);
|
||||
int strncmp(const char * cs,const char * ct,size_t count);
|
||||
char * strchr(const char * s, int c);
|
||||
char * strrchr(const char * s, int c);
|
||||
size_t strlen(const char * s);
|
||||
size_t strnlen(const char * s, size_t count);
|
||||
size_t strspn(const char *s, const char *accept);
|
||||
char * strpbrk(const char * cs,const char * ct);
|
||||
char * strtok(char * s,const char * ct);
|
||||
char * strsep(char **s, const char *ct);
|
||||
void * memset(void * s,int c,size_t count);
|
||||
char * bcopy(const char * src, char * dest, int count);
|
||||
void * memcpy(void * dest,const void *src,size_t count);
|
||||
void * memmove(void * dest,const void *src,size_t count);
|
||||
int memcmp(const void * cs,const void * ct,size_t count);
|
||||
void * memscan(void * addr, int c, size_t size);
|
||||
char * strstr(const char * s1,const char * s2);
|
||||
void * memchr(const void *s, int c, size_t n);
|
||||
|
||||
#endif /* ETHERBOOT_STRING */
|
||||
33
src/include/sys_info.h
Normal file
33
src/include/sys_info.h
Normal file
@@ -0,0 +1,33 @@
|
||||
#ifndef SYS_INFO_H
|
||||
#define SYS_INFO_H
|
||||
|
||||
/* Information collected from firmware/bootloader */
|
||||
|
||||
struct sys_info {
|
||||
/* Values passed by bootloader */
|
||||
unsigned long boot_type;
|
||||
unsigned long boot_data;
|
||||
unsigned long boot_arg;
|
||||
|
||||
char *firmware; /* "PCBIOS", "LinuxBIOS", etc. */
|
||||
char *command_line; /* command line given to us */
|
||||
#if 0
|
||||
//By LYH
|
||||
//Will use meminfo in Etherboot
|
||||
/* memory map */
|
||||
int n_memranges;
|
||||
struct memrange {
|
||||
unsigned long long base;
|
||||
unsigned long long size;
|
||||
} *memrange;
|
||||
#endif
|
||||
};
|
||||
|
||||
void collect_sys_info(struct sys_info *info);
|
||||
void collect_elfboot_info(struct sys_info *info);
|
||||
void collect_linuxbios_info(struct sys_info *info);
|
||||
|
||||
/* Our name and version. I want to see single instance of these in the image */
|
||||
extern const char *program_name, *program_version;
|
||||
|
||||
#endif /* SYS_INFO_H */
|
||||
35
src/include/tcp.h
Normal file
35
src/include/tcp.h
Normal file
@@ -0,0 +1,35 @@
|
||||
#ifndef _TCP_H
|
||||
#define _TCP_H
|
||||
|
||||
#define TCP_INITIAL_TIMEOUT (3*TICKS_PER_SEC)
|
||||
#define TCP_MAX_TIMEOUT (60*TICKS_PER_SEC)
|
||||
#define TCP_MIN_TIMEOUT (TICKS_PER_SEC)
|
||||
#define TCP_MAX_RETRY 10
|
||||
#define TCP_MAX_HEADER ((int)sizeof(struct iphdr)+64)
|
||||
#define TCP_MIN_WINDOW (1500-TCP_MAX_HEADER)
|
||||
#define TCP_MAX_WINDOW (65535-TCP_MAX_HEADER)
|
||||
|
||||
|
||||
#define MAX_URL 80
|
||||
|
||||
|
||||
#define FIN 1
|
||||
#define SYN 2
|
||||
#define RST 4
|
||||
#define PSH 8
|
||||
#define ACK 16
|
||||
#define URG 32
|
||||
|
||||
|
||||
struct tcphdr {
|
||||
uint16_t src;
|
||||
uint16_t dst;
|
||||
int32_t seq;
|
||||
int32_t ack;
|
||||
uint16_t ctrl;
|
||||
uint16_t window;
|
||||
uint16_t chksum;
|
||||
uint16_t urgent;
|
||||
};
|
||||
|
||||
#endif /* _TCP_H */
|
||||
77
src/include/tftp.h
Normal file
77
src/include/tftp.h
Normal file
@@ -0,0 +1,77 @@
|
||||
#ifndef _TFTP_H
|
||||
#define _TFTP_H
|
||||
|
||||
#define TFTP_PORT 69
|
||||
#define TFTP_DEFAULTSIZE_PACKET 512
|
||||
#define TFTP_MAX_PACKET 1432 /* 512 */
|
||||
|
||||
#define TFTP_RRQ 1
|
||||
#define TFTP_WRQ 2
|
||||
#define TFTP_DATA 3
|
||||
#define TFTP_ACK 4
|
||||
#define TFTP_ERROR 5
|
||||
#define TFTP_OACK 6
|
||||
|
||||
#define TFTP_CODE_EOF 1
|
||||
#define TFTP_CODE_MORE 2
|
||||
#define TFTP_CODE_ERROR 3
|
||||
#define TFTP_CODE_BOOT 4
|
||||
#define TFTP_CODE_CFG 5
|
||||
|
||||
struct tftp_t {
|
||||
struct iphdr ip;
|
||||
struct udphdr udp;
|
||||
uint16_t opcode;
|
||||
union {
|
||||
uint8_t rrq[TFTP_DEFAULTSIZE_PACKET];
|
||||
struct {
|
||||
uint16_t block;
|
||||
uint8_t download[TFTP_MAX_PACKET];
|
||||
} data;
|
||||
struct {
|
||||
uint16_t block;
|
||||
} ack;
|
||||
struct {
|
||||
uint16_t errcode;
|
||||
uint8_t errmsg[TFTP_DEFAULTSIZE_PACKET];
|
||||
} err;
|
||||
struct {
|
||||
uint8_t data[TFTP_DEFAULTSIZE_PACKET+2];
|
||||
} oack;
|
||||
} u;
|
||||
} PACKED;
|
||||
|
||||
/* define a smaller tftp packet solely for making requests to conserve stack
|
||||
512 bytes should be enough */
|
||||
struct tftpreq_t {
|
||||
struct iphdr ip;
|
||||
struct udphdr udp;
|
||||
uint16_t opcode;
|
||||
union {
|
||||
uint8_t rrq[512];
|
||||
struct {
|
||||
uint16_t block;
|
||||
} ack;
|
||||
struct {
|
||||
uint16_t errcode;
|
||||
uint8_t errmsg[512-2];
|
||||
} err;
|
||||
} u;
|
||||
} PACKED;
|
||||
|
||||
struct tftpreq_info_t {
|
||||
const char *name;
|
||||
unsigned short port;
|
||||
unsigned short blksize;
|
||||
} PACKED;
|
||||
|
||||
struct tftpblk_info_t {
|
||||
char *data;
|
||||
unsigned int block;
|
||||
unsigned int len;
|
||||
int eof;
|
||||
} PACKED;
|
||||
|
||||
#define TFTP_MIN_PACKET (sizeof(struct iphdr) + sizeof(struct udphdr) + 4)
|
||||
|
||||
#endif /* _TFTP_H */
|
||||
62
src/include/timer.h
Normal file
62
src/include/timer.h
Normal file
@@ -0,0 +1,62 @@
|
||||
/* Defines for routines to implement a low-overhead timer for drivers */
|
||||
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2, or (at
|
||||
* your option) any later version.
|
||||
*/
|
||||
|
||||
#ifndef TIMER_H
|
||||
#define TIMER_H
|
||||
|
||||
/* Ports for the 8254 timer chip */
|
||||
#define TIMER2_PORT 0x42
|
||||
#define TIMER_MODE_PORT 0x43
|
||||
|
||||
/* Meaning of the mode bits */
|
||||
#define TIMER0_SEL 0x00
|
||||
#define TIMER1_SEL 0x40
|
||||
#define TIMER2_SEL 0x80
|
||||
#define READBACK_SEL 0xC0
|
||||
|
||||
#define LATCH_COUNT 0x00
|
||||
#define LOBYTE_ACCESS 0x10
|
||||
#define HIBYTE_ACCESS 0x20
|
||||
#define WORD_ACCESS 0x30
|
||||
|
||||
#define MODE0 0x00
|
||||
#define MODE1 0x02
|
||||
#define MODE2 0x04
|
||||
#define MODE3 0x06
|
||||
#define MODE4 0x08
|
||||
#define MODE5 0x0A
|
||||
|
||||
#define BINARY_COUNT 0x00
|
||||
#define BCD_COUNT 0x01
|
||||
|
||||
/* Timers tick over at this rate */
|
||||
#define CLOCK_TICK_RATE 1193180U
|
||||
#define TICKS_PER_MS (CLOCK_TICK_RATE/1000)
|
||||
|
||||
/* Parallel Peripheral Controller Port B */
|
||||
#define PPC_PORTB 0x61
|
||||
|
||||
/* Meaning of the port bits */
|
||||
#define PPCB_T2OUT 0x20 /* Bit 5 */
|
||||
#define PPCB_SPKR 0x02 /* Bit 1 */
|
||||
#define PPCB_T2GATE 0x01 /* Bit 0 */
|
||||
|
||||
/* Ticks must be between 0 and 65535 (0 == 65536)
|
||||
because it is a 16 bit counter */
|
||||
extern void load_timer2(unsigned int ticks);
|
||||
extern inline int timer2_running(void);
|
||||
extern void waiton_timer2(unsigned int ticks);
|
||||
|
||||
extern void setup_timers(void);
|
||||
extern void ndelay(unsigned int nsecs);
|
||||
extern void udelay(unsigned int usecs);
|
||||
extern void mdelay(unsigned int msecs);
|
||||
|
||||
|
||||
#endif /* TIMER_H */
|
||||
27
src/include/udp.h
Normal file
27
src/include/udp.h
Normal file
@@ -0,0 +1,27 @@
|
||||
#ifndef _UDP_H
|
||||
#define _UDP_H
|
||||
|
||||
#include "etherboot.h"
|
||||
#include "ip.h"
|
||||
|
||||
struct udp_pseudo_hdr {
|
||||
in_addr src;
|
||||
in_addr dest;
|
||||
uint8_t unused;
|
||||
uint8_t protocol;
|
||||
uint16_t len;
|
||||
} PACKED;
|
||||
struct udphdr {
|
||||
uint16_t src;
|
||||
uint16_t dest;
|
||||
uint16_t len;
|
||||
uint16_t chksum;
|
||||
struct {} payload;
|
||||
} PACKED;
|
||||
struct udppacket {
|
||||
struct iphdr ip;
|
||||
struct udphdr udp;
|
||||
struct {} payload;
|
||||
} PACKED;
|
||||
|
||||
#endif /* _UDP_H */
|
||||
Reference in New Issue
Block a user