Merge branch 'master' into pathbased syslinux-4.00-pre20
authorH. Peter Anvin <hpa@zytor.com>
Sun, 14 Feb 2010 21:57:50 +0000 (13:57 -0800)
committerH. Peter Anvin <hpa@zytor.com>
Sun, 14 Feb 2010 21:57:50 +0000 (13:57 -0800)
Resolved Conflicts:
com32/Makefile
com32/include/syslinux/pxe.h
core/pxelinux.asm
core/syslinux.ld

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
14 files changed:
1  2 
Makefile
com32/Makefile
com32/include/syslinux/pxe.h
com32/lib/Makefile
com32/sysdump/cpuid.c
core/comboot.inc
core/diskstart.inc
core/isolinux.asm
core/layout.inc
core/pxelinux.asm
core/stack.inc
core/syslinux.ld
doc/comboot.txt
mtools/syslinux.c

diff --cc Makefile
Simple merge
diff --cc com32/Makefile
@@@ -1,3 -1,4 +1,4 @@@
- SUBDIRS = tools lib gpllib libutil modules mboot menu samples rosh cmenu hdt gfxboot
 -SUBDIRS = lib gpllib libutil modules mboot menu samples rosh cmenu \
++SUBDIRS = tools lib gpllib libutil modules mboot menu samples rosh cmenu \
+         hdt gfxboot sysdump
  all tidy dist clean spotless install:
        set -e; for d in $(SUBDIRS); do $(MAKE) -C $$d $@; done
  #ifndef _SYSLINUX_PXE_H
  #define _SYSLINUX_PXE_H
  
 -#include <stdint.h>
 -#include <netinet/in.h>
 -#include <klibc/compiler.h>
 -#include <com32.h>
 -
 -/* PXE spec structures and definitions.  These mostly follow the PXE
 -   spec, except when the PXE spec is unnecessarily stupid.  Of course,
 -   that is most of the time. */
 -
 -/* Basic types; use Unix-like _t convention instead of SCREAMING; also
 -   re-use types we already have, like in_addr_t. */
 -
 -typedef uint16_t pxenv_status_t;
 -
 -#define MAC_ADDR_LEN  16
 -typedef uint8_t mac_addr_t[MAC_ADDR_LEN];
 -
 -/* "Protected mode segment descriptor" according to PXE... */
 -typedef struct {
 -    uint16_t segaddr;
 -    uint32_t physaddr;
 -    uint16_t segsize;
 -} __packed pxe_segdesc_t;
 -
 -typedef far_ptr_t segoff16_t;
 -
 -typedef struct {
 -    uint8_t opcode;
 -#define BOOTP_REQ 1
 -#define BOOTP_REP 2
 -    uint8_t Hardware;
 -    uint8_t Hardlen;
 -    uint8_t Gatehops;
 -    uint32_t ident;
 -    uint16_t seconds;
 -    uint16_t Flags;
 -#define BOOTP_BCAST 0x8000
 -    in_addr_t cip;            /* Client IP address */
 -    in_addr_t yip;            /* You IP address */
 -    in_addr_t sip;            /* next server IP address */
 -    in_addr_t gip;            /*relay agent IP address */
 -    mac_addr_t CAddr;
 -    uint8_t Sname[64];
 -    uint8_t bootfile[128];
 -    union {
 -#define BOOTP_DHCPVEND 1024
 -      uint8_t d[BOOTP_DHCPVEND];
 -      struct {
 -          uint8_t magic[4];
 -#define VM_RFC1048 0x63825363L
 -          uint32_t flags;
 -          uint8_t pad[56];
 -      } v;
 -    } vendor;
 -} __packed pxe_bootp_t;
 -
 -/* Function calling structures and constants */
 -
 -typedef struct s_PXENV_GET_CACHED_INFO {
 -    pxenv_status_t Status;
 -    uint16_t PacketType;
 -#define PXENV_PACKET_TYPE_DHCP_DISCOVER 1
 -#define PXENV_PACKET_TYPE_DHCP_ACK 2
 -#define PXENV_PACKET_TYPE_CACHED_REPLY 3
 -    uint16_t BufferSize;
 -    segoff16_t Buffer;
 -    uint16_t BufferLimit;
 -} __packed t_PXENV_GET_CACHED_INFO;
 -
 -typedef struct s_PXENV_START_UNDI {
 -    pxenv_status_t Status;
 -    uint16_t AX;
 -    uint16_t BX;
 -    uint16_t DX;
 -    uint16_t DI;
 -    uint16_t ES;
 -} __packed t_PXENV_START_UNDI;
 -
 -typedef struct s_PXENV_STOP_UNDI {
 -    pxenv_status_t Status;
 -} __packed t_PXENV_STOP_UNDI;
 -
 -typedef struct s_PXENV_START_BASE {
 -    pxenv_status_t Status;
 -} __packed t_PXENV_START_BASE;
 -
 -typedef struct s_PXENV_STOP_BASE {
 -    pxenv_status_t Status;
 -} __packed t_PXENV_STOP_BASE;
 -
 -typedef struct s_PXENV_TFTP_OPEN {
 -    pxenv_status_t Status;
 -    in_addr_t ServerIPAddress;
 -    in_addr_t GatewayIPAddress;
 -    uint8_t FileName[128];
 -    in_port_t TFTPPort;
 -    uint16_t PacketSize;
 -} __packed t_PXENV_TFTP_OPEN;
 -
 -typedef struct s_PXENV_TFTP_CLOSE {
 -    pxenv_status_t Status;
 -} __packed t_PXENV_TFTP_CLOSE;
 -
 -typedef struct s_PXENV_TFTP_READ {
 -    pxenv_status_t Status;
 -    uint16_t PacketNumber;
 -    uint16_t BufferSize;
 -    segoff16_t Buffer;
 -} __packed t_PXENV_TFTP_READ;
 -
 -typedef struct s_PXENV_TFTP_READ_FILE {
 -    pxenv_status_t Status;
 -    uint8_t FileName[128];
 -    uint32_t BufferSize;
 -    void *Buffer;
 -    in_addr_t ServerIPAddress;
 -    in_addr_t GatewayIPAddress;
 -    in_addr_t McastIPAddress;
 -    in_port_t TFTPClntPort;
 -    in_port_t TFTPSrvPort;
 -    uint16_t TFTPOpenTimeOut;
 -    uint16_t TFTPReopenDelay;
 -} __packed t_PXENV_TFTP_READ_FILE;
 -
 -typedef struct s_PXENV_TFTP_GET_FSIZE {
 -    pxenv_status_t Status;
 -    in_addr_t ServerIPAddress;
 -    in_addr_t GatewayIPAddress;
 -    uint8_t FileName[128];
 -    uint32_t FileSize;
 -} __packed t_PXENV_TFTP_GET_FSIZE;
 -
 -typedef struct s_PXENV_UDP_OPEN {
 -    pxenv_status_t status;
 -    in_addr_t src_ip;
 -} __packed t_PXENV_UDP_OPEN;
 -
 -typedef struct s_PXENV_UDP_CLOSE {
 -    pxenv_status_t status;
 -} __packed t_PXENV_UDP_CLOSE;
 -
 -typedef struct s_PXENV_UDP_WRITE {
 -    pxenv_status_t status;
 -    in_addr_t ip;
 -    in_addr_t gw;
 -    in_port_t src_port;
 -    in_port_t dst_port;
 -    uint16_t buffer_size;
 -    segoff16_t buffer;
 -} __packed t_PXENV_UDP_WRITE;
 -
 -typedef struct s_PXENV_UDP_READ {
 -    pxenv_status_t status;
 -    in_addr_t src_ip;
 -    in_addr_t dest_ip;
 -    in_port_t s_port;
 -    in_port_t d_port;
 -    uint16_t buffer_size;
 -    segoff16_t buffer;
 -} __packed t_PXENV_UDP_READ;
 -
 -typedef struct s_PXENV_UNDI_STARTUP {
 -    pxenv_status_t Status;
 -} __packed t_PXENV_UNDI_STARTUP;
 -
 -typedef struct s_PXENV_UNDI_CLEANUP {
 -    pxenv_status_t Status;
 -} __packed t_PXENV_UNDI_CLEANUP;
 -
 -typedef struct s_PXENV_UNDI_INITIALIZE {
 -    pxenv_status_t Status;
 -    void *ProtocolIni;
 -    uint8_t reserved[8];
 -} __packed t_PXENV_UNDI_INITIALIZE;
 -
 -#define MAXNUM_MCADDR 8
 -typedef struct s_PXENV_UNDI_MCAST_ADDRESS {
 -    uint16_t MCastAddrCount;
 -    mac_addr_t McastAddr[MAXNUM_MCADDR];
 -} __packed t_PXENV_UNDI_MCAST_ADDRESS;
 -
 -typedef struct s_PXENV_UNDI_RESET {
 -    pxenv_status_t Status;
 -    t_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf;
 -} __packed t_PXENV_UNDI_RESET;
 -
 -typedef struct s_PXENV_UNDI_SHUTDOWN {
 -    pxenv_status_t Status;
 -} __packed t_PXENV_UNDI_SHUTDOWN;
 -
 -typedef struct s_PXENV_UNDI_OPEN {
 -    pxenv_status_t Status;
 -    uint16_t OpenFlag;
 -    uint16_t PktFilter;
 -#define FLTR_DIRECTED 0x0001
 -#define FLTR_BRDCST 0x0002
 -#define FLTR_PRMSCS 0x0004
 -#define FLTR_SRC_RTG 0x0008
 -     t_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf;
 -} __packed t_PXENV_UNDI_OPEN;
 -
 -typedef struct s_PXENV_UNDI_CLOSE {
 -    pxenv_status_t Status;
 -} __packed t_PXENV_UNDI_CLOSE;
 -
 -typedef struct s_PXENV_UNDI_TRANSMIT {
 -    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 s_PXENV_UNDI_TBD {
 -    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;
 -
 -typedef struct s_PXENV_UNDI_SET_MCAST_ADDRESS {
 -    pxenv_status_t Status;
 -     t_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf;
 -} __packed t_PXENV_UNDI_SET_MCAST_ADDR;
 -
 -typedef struct s_PXENV_UNDI_SET_STATION_ADDRESS {
 -    pxenv_status_t Status;
 -    mac_addr_t StationAddress;
 -} __packed t_PXENV_UNDI_SET_STATION_ADDR;
 -
 -typedef struct s_PXENV_UNDI_SET_PACKET_FILTER {
 -    pxenv_status_t Status;
 -    uint8_t filter;
 -} __packed t_PXENV_UNDI_SET_PACKET_FILTER;
 -
 -typedef struct s_PXENV_UNDI_GET_INFORMATION {
 -    pxenv_status_t Status;
 -    uint16_t BaseIo;
 -    uint16_t IntNumber;
 -    uint16_t MaxTranUnit;
 -    uint16_t HwType;
 -#define ETHER_TYPE 1
 -#define EXP_ETHER_TYPE 2
 -#define IEEE_TYPE 6
 -#define ARCNET_TYPE 7
 -    uint16_t HwAddrLen;
 -    mac_addr_t CurrentNodeAddress;
 -    mac_addr_t PermNodeAddress;
 -    uint16_t ROMAddress;
 -    uint16_t RxBufCt;
 -    uint16_t TxBufCt;
 -} __packed t_PXENV_UNDI_GET_INFORMATION;
 -
 -typedef struct s_PXENV_UNDI_GET_STATISTICS {
 -    pxenv_status_t Status;
 -    uint32_t XmtGoodFrames;
 -    uint32_t RcvGoodFrames;
 -    uint32_t RcvCRCErrors;
 -    uint32_t RcvResourceErrors;
 -} __packed t_PXENV_UNDI_GET_STATISTICS;
 -
 -typedef struct s_PXENV_UNDI_CLEAR_STATISTICS {
 -    pxenv_status_t Status;
 -} __packed t_PXENV_UNDI_CLEAR_STATISTICS;
 -
 -typedef struct s_PXENV_UNDI_INITIATE_DIAGS {
 -    pxenv_status_t Status;
 -} __packed t_PXENV_UNDI_INITIATE_DIAGS;
 -
 -typedef struct s_PXENV_UNDI_FORCE_INTERRUPT {
 -    pxenv_status_t Status;
 -} __packed t_PXENV_UNDI_FORCE_INTERRUPT;
 -
 -typedef struct s_PXENV_UNDI_GET_MCAST_ADDRESS {
 -    pxenv_status_t Status;
 -    in_addr_t InetAddr;
 -    mac_addr_t MediaAddr;
 -} __packed t_PXENV_UNDI_GET_MCAST_ADDR;
 -
 -typedef struct s_PXENV_UNDI_GET_NIC_TYPE {
 -    pxenv_status_t Status;
 -    uint8_t NicType;
 -#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;
 -      } __packed pnp;
 -    } __packed info;
 -} __packed t_PXENV_UNDI_GET_NIC_TYPE;
 -
 -typedef struct s_PXENV_UNDI_GET_IFACE_INFO {
 -    pxenv_status_t Status;
 -    uint8_t IfaceType[16];
 -    uint32_t LinkSpeed;
 -    uint32_t ServiceFlags;
 -    uint32_t Reserved[4];
 -} __packed t_PXENV_UNDI_GET_NDIS_INFO;
 -
 -typedef struct s_PXENV_UNDI_GET_STATE {
 -#define PXE_UNDI_GET_STATE_STARTED 1
 -#define PXE_UNDI_GET_STATE_INITIALIZED 2
 -#define PXE_UNDI_GET_STATE_OPENED 3
 -    pxenv_status_t Status;
 -    uint8_t UNDIstate;
 -} __packed t_PXENV_UNDI_GET_STATE;
 -
 -typedef struct s_PXENV_UNDI_ISR {
 -    pxenv_status_t Status;
 -    uint16_t FuncFlag;
 -    uint16_t BufferLength;
 -    uint16_t FrameLength;
 -    uint16_t FrameHeaderLength;
 -    segoff16_t Frame;
 -    uint8_t ProtType;
 -    uint8_t PktType;
 -} __packed t_PXENV_UNDI_ISR;
 -#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_USR_OUT_NOT_OURS 1
 -/* One of these will be returned for
 -   PXENV_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
 -
 -/* Function numbers and error codes */
 -
 -#define PXENV_TFTP_OPEN                       0x0020
 -#define PXENV_TFTP_CLOSE              0x0021
 -#define PXENV_TFTP_READ                       0x0022
 -#define PXENV_TFTP_READ_FILE          0x0023
 -#define PXENV_TFTP_READ_FILE_PMODE    0x0024
 -#define PXENV_TFTP_GET_FSIZE          0x0025
 -
 -#define PXENV_UDP_OPEN                        0x0030
 -#define PXENV_UDP_CLOSE                       0x0031
 -#define PXENV_UDP_READ                        0x0032
 -#define PXENV_UDP_WRITE                       0x0033
 -
 -#define PXENV_START_UNDI              0x0000
 -#define PXENV_UNDI_STARTUP            0x0001
 -#define PXENV_UNDI_CLEANUP            0x0002
 -#define PXENV_UNDI_INITIALIZE         0x0003
 -#define PXENV_UNDI_RESET_NIC          0x0004
 -#define PXENV_UNDI_SHUTDOWN           0x0005
 -#define PXENV_UNDI_OPEN                       0x0006
 -#define PXENV_UNDI_CLOSE              0x0007
 -#define PXENV_UNDI_TRANSMIT           0x0008
 -#define PXENV_UNDI_SET_MCAST_ADDR     0x0009
 -#define PXENV_UNDI_SET_STATION_ADDR   0x000A
 -#define PXENV_UNDI_SET_PACKET_FILTER  0x000B
 -#define PXENV_UNDI_GET_INFORMATION    0x000C
 -#define PXENV_UNDI_GET_STATISTICS     0x000D
 -#define PXENV_UNDI_CLEAR_STATISTICS   0x000E
 -#define PXENV_UNDI_INITIATE_DIAGS     0x000F
 -#define PXENV_UNDI_FORCE_INTERRUPT    0x0010
 -#define PXENV_UNDI_GET_MCAST_ADDR     0x0011
 -#define PXENV_UNDI_GET_NIC_TYPE               0x0012
 -#define PXENV_UNDI_GET_IFACE_INFO     0x0013
 -#define PXENV_UNDI_ISR                        0x0014
 -#define       PXENV_STOP_UNDI                 0x0015  /* Overlap...? */
 -#define PXENV_UNDI_GET_STATE          0x0015  /* Overlap...? */
 -
 -#define PXENV_UNLOAD_STACK            0x0070
 -#define PXENV_GET_CACHED_INFO         0x0071
 -#define PXENV_RESTART_DHCP            0x0072
 -#define PXENV_RESTART_TFTP            0x0073
 -#define PXENV_MODE_SWITCH             0x0074
 -#define PXENV_START_BASE              0x0075
 -#define PXENV_STOP_BASE                       0x0076
 -
 -#define PXENV_EXIT_SUCCESS 0x0000
 -#define PXENV_EXIT_FAILURE 0x0001
 -
 -#define PXENV_STATUS_SUCCESS 0x00
 -#define PXENV_STATUS_FAILURE 0x01
 -#define PXENV_STATUS_BAD_FUNC 0x02
 -#define PXENV_STATUS_UNSUPPORTED 0x03
 -#define PXENV_STATUS_KEEP_UNDI 0x04
 -#define PXENV_STATUS_KEEP_ALL 0x05
 -#define PXENV_STATUS_OUT_OF_RESOURCES 0x06
 -#define PXENV_STATUS_ARP_TIMEOUT 0x11
 -#define PXENV_STATUS_UDP_CLOSED 0x18
 -#define PXENV_STATUS_UDP_OPEN 0x19
 -#define PXENV_STATUS_TFTP_CLOSED 0x1A
 -#define PXENV_STATUS_TFTP_OPEN 0x1B
 -#define PXENV_STATUS_MCOPY_PROBLEM 0x20
 -#define PXENV_STATUS_BIS_INTEGRITY_FAILURE 0x21
 -#define PXENV_STATUS_BIS_VALIDATE_FAILURE 0x22
 -#define PXENV_STATUS_BIS_INIT_FAILURE 0x23
 -#define PXENV_STATUS_BIS_SHUTDOWN_FAILURE 0x24
 -#define PXENV_STATUS_BIS_GBOA_FAILURE 0x25
 -#define PXENV_STATUS_BIS_FREE_FAILURE 0x26
 -#define PXENV_STATUS_BIS_GSI_FAILURE 0x27
 -#define PXENV_STATUS_BIS_BAD_CKSUM 0x28
 -#define PXENV_STATUS_TFTP_CANNOT_ARP_ADDRESS 0x30
 -#define PXENV_STATUS_TFTP_OPEN_TIMEOUT 0x32
 -
 -#define PXENV_STATUS_TFTP_UNKNOWN_OPCODE 0x33
 -#define PXENV_STATUS_TFTP_READ_TIMEOUT 0x35
 -#define PXENV_STATUS_TFTP_ERROR_OPCODE 0x36
 -#define PXENV_STATUS_TFTP_CANNOT_OPEN_CONNECTION 0x38
 -#define PXENV_STATUS_TFTP_CANNOT_READ_FROM_CONNECTION 0x39
 -#define PXENV_STATUS_TFTP_TOO_MANY_PACKAGES 0x3A
 -#define PXENV_STATUS_TFTP_FILE_NOT_FOUND 0x3B
 -#define PXENV_STATUS_TFTP_ACCESS_VIOLATION 0x3C
 -#define PXENV_STATUS_TFTP_NO_MCAST_ADDRESS 0x3D
 -#define PXENV_STATUS_TFTP_NO_FILESIZE 0x3E
 -#define PXENV_STATUS_TFTP_INVALID_PACKET_SIZE 0x3F
 -#define PXENV_STATUS_DHCP_TIMEOUT 0x51
 -#define PXENV_STATUS_DHCP_NO_IP_ADDRESS 0x52
 -#define PXENV_STATUS_DHCP_NO_BOOTFILE_NAME 0x53
 -#define PXENV_STATUS_DHCP_BAD_IP_ADDRESS 0x54
 -#define PXENV_STATUS_UNDI_INVALID_FUNCTION 0x60
 -#define PXENV_STATUS_UNDI_MEDIATEST_FAILED 0x61
 -#define PXENV_STATUS_UNDI_CANNOT_INIT_NIC_FOR_MCAST 0x62
 -#define PXENV_STATUS_UNDI_CANNOT_INITIALIZE_NIC 0x63
 -#define PXENV_STATUS_UNDI_CANNOT_INITIALIZE_PHY 0x64
 -#define PXENV_STATUS_UNDI_CANNOT_READ_CONFIG_DATA 0x65
 -#define PXENV_STATUS_UNDI_CANNOT_READ_INIT_DATA 0x66
 -#define PXENV_STATUS_UNDI_BAD_MAC_ADDRESS 0x67
 -#define PXENV_STATUS_UNDI_BAD_EEPROM_CHECKSUM 0x68
 -#define PXENV_STATUS_UNDI_ERROR_SETTING_ISR 0x69
 -#define PXENV_STATUS_UNDI_INVALID_STATE 0x6A
 -#define PXENV_STATUS_UNDI_TRANSMIT_ERROR 0x6B
 -#define PXENV_STATUS_UNDI_INVALID_PARAMETER 0x6C
 -#define PXENV_STATUS_BSTRAP_PROMPT_MENU 0x74
 -#define PXENV_STATUS_BSTRAP_MCAST_ADDR 0x76
 -#define PXENV_STATUS_BSTRAP_MISSING_LIST 0x77
 -#define PXENV_STATUS_BSTRAP_NO_RESPONSE 0x78
 -#define PXENV_STATUS_BSTRAP_FILE_TOO_BIG 0x79
 -#define PXENV_STATUS_BINL_CANCELED_BY_KEYSTROKE 0xA0
 -#define PXENV_STATUS_BINL_NO_PXE_SERVER 0xA1
 -#define PXENV_STATUS_NOT_AVAILABLE_IN_PMODE 0xA2
 -#define PXENV_STATUS_NOT_AVAILABLE_IN_RMODE 0xA3
 -#define PXENV_STATUS_BUSD_DEVICE_NOT_SUPPORTED 0xB0
 -#define PXENV_STATUS_LOADER_NO_FREE_BASE_MEMORY 0xC0
 -#define PXENV_STATUS_LOADER_NO_BC_ROMID 0xC1
 -#define PXENV_STATUS_LOADER_BAD_BC_ROMID 0xC2
 -#define PXENV_STATUS_LOADER_BAD_BC_RUNTIME_IMAGE 0xC3
 -#define PXENV_STATUS_LOADER_NO_UNDI_ROMID 0xC4
 -#define PXENV_STATUS_LOADER_BAD_UNDI_ROMID 0xC5
 -#define PXENV_STATUS_LOADER_BAD_UNDI_DRIVER_IMAGE 0xC6
 -#define PXENV_STATUS_LOADER_NO_PXE_STRUCT 0xC8
 -#define PXENV_STATUS_LOADER_NO_PXENV_STRUCT 0xC9
 -#define PXENV_STATUS_LOADER_UNDI_START 0xCA
 -#define PXENV_STATUS_LOADER_BC_START 0xCB
 +#include <syslinux/pxe_api.h>
  
  /* SYSLINUX-defined PXE utility functions */
 -int pxe_get_cached_info(int level, void **buf, size_t * len);
 +int pxe_get_cached_info(int level, void **buf, size_t *len);
  int pxe_get_nic_type(t_PXENV_UNDI_GET_NIC_TYPE * gnt);
+ uint32_t pxe_dns(const char *hostname);
  
  #endif /* _SYSLINUX_PXE_H */
Simple merge
index 0000000,40b2061..5bfd4f0
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,112 +1,112 @@@
 -    asm("cpuid"
 -      : "=a" (data->eax), "=b" (data->ebx),
+ /*
+  * Dump CPUID information
+  */
+ #include <stdio.h>
+ #include <string.h>
+ #include <stdlib.h>
+ #include <com32.h>
+ #include <sys/cpu.h>
+ #include "sysdump.h"
+ #include "backend.h"
+ struct cpuid_data {
+     uint32_t eax, ebx, ecx, edx;
+ };
+ struct cpuid_info {
+     uint32_t eax, ecx;
+     struct cpuid_data data;
+ };
+ static bool has_eflag(uint32_t flag)
+ {
+       uint32_t f0, f1;
+       asm("pushfl ; "
+           "pushfl ; "
+           "popl %0 ; "
+           "movl %0,%1 ; "
+           "xorl %2,%1 ; "
+           "pushl %1 ; "
+           "popfl ; "
+           "pushfl ; "
+           "popl %1 ; "
+           "popfl"
+           : "=&r" (f0), "=&r" (f1)
+           : "ri" (flag));
+       return !!((f0^f1) & flag);
+ }
+ static inline void get_cpuid(uint32_t eax, uint32_t ecx,
+                            struct cpuid_data *data)
+ {
++    asm("pushl %%ebx ; cpuid ; movl %%ebx,%1 ; popl %%ebx"
++      : "=a" (data->eax), "=r" (data->ebx),
+         "=c" (data->ecx), "=d" (data->edx)
+       : "a" (eax), "c" (ecx));
+ }
+ #define CPUID_CHUNK 128
+ void dump_cpuid(struct backend *be)
+ {
+     struct cpuid_info *buf = NULL;
+     int nentry, nalloc;
+     uint32_t region;
+     struct cpuid_data base_leaf;
+     uint32_t base, leaf, count;
+     struct cpuid_data invalid_leaf;
+     struct cpuid_data data;
+     if (!has_eflag(EFLAGS_ID))
+       return;
+     printf("Dumping CPUID... ");
+     nentry = nalloc = 0;
+     /* Find out what the CPU returns for invalid leaves */
+     get_cpuid(0, 0, &base_leaf);
+     get_cpuid(base_leaf.eax+1, 0, &invalid_leaf);
+     for (region = 0 ; region <= 0xffff ; region++) {
+       base = region << 16;
+       get_cpuid(base, 0, &base_leaf);
+       if (region && !memcmp(&base_leaf, &invalid_leaf, sizeof base_leaf))
+           continue;
+       if ((base_leaf.eax ^ base) & 0xffff0000)
+           continue;
+       for (leaf = base ; leaf <= base_leaf.eax ; leaf++) {
+           get_cpuid(leaf, 0, &data);
+           count = 0;
+           do {
+               if (nentry >= nalloc) {
+                   nalloc += CPUID_CHUNK;
+                   buf = realloc(buf, nalloc*sizeof *buf);
+                   if (!buf)
+                       return;         /* FAILED */
+               }
+               buf[nentry].eax = leaf;
+               buf[nentry].ecx = count;
+               buf[nentry].data = data;
+               nentry++;
+               count++;
+               get_cpuid(leaf, count, &data);
+           } while (memcmp(&data, &buf[nentry-1].data, sizeof data) &&
+                    (data.eax | data.ebx | data.ecx | data.edx));
+       }
+     }
+     if (nentry)
+       cpio_writefile(be, "cpuid", buf, nentry*sizeof *buf);
+     free(buf);
+     printf("done.\n");
+ }
Simple merge
@@@ -34,7 -33,6 +34,7 @@@ PartInfo      equ StackBuf            ; Saved partitio
  FloppyTable   equ PartInfo+16         ; Floppy info table (must follow PartInfo)
  OrigFDCTabPtr equ StackBuf-8          ; The 2nd high dword on the stack
  OrigESDI      equ StackBuf-4          ; The high dword on the stack
- StackTop      equ OrigFDCTabPtr       ; The start of the canonical stack
++StackHome     equ OrigFDCTabPtr       ; The start of the canonical stack
  
  ;
  ; Primary entry point.  Tempting as though it may be, we can't put the
@@@ -187,7 -203,6 +187,7 @@@ StackBuf   equ STACK_TOP-44        ; 44 bytes ne
                                        ; the bootsector chainloading
                                        ; code!
  OrigESDI      equ StackBuf-4          ; The high dword on the stack
- StackTop      equ OrigESDI
++StackHome     equ OrigESDI
  
  bootsec               equ $
  
diff --cc core/layout.inc
Simple merge
@@@ -105,17 -212,12 +105,13 @@@ BOOTIFStr       resb 7                  ; Space for "BOOTIF=
  packet_buf    resb 2048               ; Transfer packet
  packet_buf_size       equ $-packet_buf
  
 -;
 -; Location of the stack.
 -;
 +              section .text16
-               ;
-               ; PXELINUX needs more BSS than the other derivatives;
-               ; therefore we relocate it from 7C00h on startup.
-               ;
- StackBuf      equ $-44                ; Base of stack if we use our own
- StackTop      equ StackBuf
+ StackBuf      equ STACK_TOP-44        ; Base of stack if we use our own
++StackHome     equ StackBuf
  
 -              section .text
 +              ; PXE loads the whole file, but assume it can't be more
 +              ; than (384-31)K in size.
 +MaxLMA                equ 384*1024
  
  ;
  ; Primary entry point.
@@@ -533,20 -2897,139 +544,17 @@@ exten_table_end
                dd 0, 0                 ; Need 8 null bytes here
  
  ;
 -; PXE unload sequences
 -;
 -new_api_unload:
 -              db PXENV_UDP_CLOSE
 -              db PXENV_UNDI_SHUTDOWN
 -              db PXENV_UNLOAD_STACK
 -              db PXENV_STOP_UNDI
 -              db 0
 -old_api_unload:
 -              db PXENV_UDP_CLOSE
 -              db PXENV_UNDI_SHUTDOWN
 -              db PXENV_UNLOAD_STACK
 -              db PXENV_UNDI_CLEANUP
 -              db 0
 -
 -;
 -; PXE query packets partially filled in
 -;
 -              section .bss
 -pxe_bootp_query_pkt:
 -.status:      resw 1                  ; Status
 -.packettype:  resw 1                  ; Boot server packet type
 -.buffersize:  resw 1                  ; Packet size
 -.buffer:      resw 2                  ; seg:off of buffer
 -.bufferlimit: resw 1                  ; Unused
 -
 -              section .data
 -pxe_udp_open_pkt:
 -.status:      dw 0                    ; Status
 -.sip:         dd 0                    ; Source (our) IP
 -
 -pxe_udp_close_pkt:
 -.status:      dw 0                    ; Status
 -
 -pxe_udp_write_pkt:
 -.status:      dw 0                    ; Status
 -.sip:         dd 0                    ; Server IP
 -.gip:         dd 0                    ; Gateway IP
 -.lport:               dw 0                    ; Local port
 -.rport:               dw 0                    ; Remote port
 -.buffersize:  dw 0                    ; Size of packet
 -.buffer:      dw 0, 0                 ; seg:off of buffer
 -
 -pxe_udp_read_pkt:
 -.status:      dw 0                    ; Status
 -.sip:         dd 0                    ; Source IP
 -.dip:         dd 0                    ; Destination (our) IP
 -.rport:               dw 0                    ; Remote port
 -.lport:               dw 0                    ; Local port
 -.buffersize:  dw 0                    ; Max packet size
 -.buffer:      dw 0, 0                 ; seg:off of buffer
 -
 -%if GPXE
 -
 -gpxe_file_api_check:
 -.status:      dw 0                    ; Status
 -.size:                dw 20                   ; Size in bytes
 -.magic:               dd 0x91d447b2           ; Magic number
 -.provider:    dd 0
 -.apimask:     dd 0
 -.flags:               dd 0
 -
 -gpxe_file_open:
 -.status:      dw 0                    ; Status
 -.filehandle:  dw 0                    ; FileHandle
 -.filename:    dd 0                    ; seg:off of FileName
 -.reserved:    dd 0
 -
 -gpxe_get_file_size:
 -.status:      dw 0                    ; Status
 -.filehandle:  dw 0                    ; FileHandle
 -.filesize:    dd 0                    ; FileSize
 -
 -gpxe_file_read:
 -.status:      dw 0                    ; Status
 -.filehandle:  dw 0                    ; FileHandle
 -.buffersize:  dw 0                    ; BufferSize
 -.buffer:      dd 0                    ; seg:off of buffer
 -
 -%endif ; GPXE
 -
 -;
  ; Misc initialized (data) variables
  ;
 -              alignz 4
 -BaseStack     dd StackBuf             ; ESP of base stack
 -              dw 0                    ; SS of base stack
 -NextSocket    dw 49152                ; Counter for allocating socket numbers
 +              section .data16
-               alignz 4
-                 global BaseStack, KeepPXE
- BaseStack     dd StackTop             ; ESP of base stack
-               dw 0                    ; SS of base stack
++                global KeepPXE
  KeepPXE               db 0                    ; Should PXE be kept around?
  
  ;
 -; TFTP commands
 -;
 -tftp_tail     db 'octet', 0                           ; Octet mode
 -tsize_str     db 'tsize' ,0                           ; Request size
 -tsize_len     equ ($-tsize_str)
 -              db '0', 0
 -blksize_str   db 'blksize', 0                         ; Request large blocks
 -blksize_len   equ ($-blksize_str)
 -              asciidec TFTP_LARGEBLK
 -              db 0
 -tftp_tail_len equ ($-tftp_tail)
 -
 -              alignz 2
 -;
 -; Options negotiation parsing table (string pointer, string len, offset
 -; into socket structure)
 -;
 -tftp_opt_table:
 -              dw tsize_str, tsize_len, tftp_filesize
 -              dw blksize_str, blksize_len, tftp_blksize
 -tftp_opts     equ ($-tftp_opt_table)/6
 -
 -;
 -; Error packet to return on TFTP protocol error
 -; Most of our errors are OACK parsing errors, so use that error code
 -;
 -tftp_proto_err        dw TFTP_ERROR                           ; ERROR packet
 -              dw TFTP_EOPTNEG                         ; ERROR 8: OACK error
 -              db 'TFTP protocol error', 0             ; Error message
 -tftp_proto_err_len equ ($-tftp_proto_err)
 -
 -              alignz 4
 -ack_packet_buf:       dw TFTP_ACK, 0                          ; TFTP ACK packet
 -
 -;
  ; IP information (initialized to "unknown" values)
 -MyIP          dd 0                    ; My IP address
 -ServerIP      dd 0                    ; IP address of boot server
 -Netmask               dd 0                    ; Netmask of this subnet
 -Gateway               dd 0                    ; Default router
 -ServerPort    dw TFTP_PORT            ; TFTP server port
 -
++              alignz 4
 +                global MyIP
 +MyIP          dd 0                    ; My IP address 
  ;
  ; Variables that are uninitialized in SYSLINUX but initialized here
  ;
diff --cc core/stack.inc
                xor %1,%1
                mov ds,%1
                mov es,%1
- %if IS_PXELINUX
 -%if IS_SYSLINUX || IS_EXTLINUX
 -                mov ss,%1                       ; Just in case...
 -                mov sp,StackBuf-2*5           ; Reset stack
 -%elif IS_PXELINUX
                lss esp,[BaseStack]
- %else
 -%elif IS_ISOLINUX
--              mov ss,%1
-               mov esp,StackTop
 -              mov sp,StackBuf-2*2
 -%else
 -              NEED TO KNOW HOW TO RESET STACK
--%endif
                sti
                cld
  %endmacro
  
++              section .data16
++              alignz 4
++              global BaseStack
++BaseStack     dd StackHome            ; ESP of the "home" stack pointer
++              dw 0                    ; SS of the "home" stack pointer
++
++              section .text16
++
  %endif ; _STACK_INC
@@@ -20,17 -20,8 +20,16 @@@ OUTPUT_ARCH(i386
  EXTERN(_start)
  ENTRY(_start)
  
- STACK16_LEN =  4096;
 +STACK32_LEN = 65536;
 +
  SECTIONS
  {
 +      /* Prefix structure for the compression program */
 +      . = 0;
 +      .prefix : {
 +              *(.prefix)
 +      }
 +
        /* "Early" sections (before the load) */
        . = 0x0800;
  
        __replacestub_len = __replacestub_end - __replacestub_start;
        __replacestub_dwords = (__replacestub_len + 3) >> 2;
  
 -      /* Stack */
 +      . = ALIGN(16);
 +      __gentextnr_lma = .;
 +      .gentextnr : AT(__gentextnr_lma) {
 +              __gentextnr_start = .;
 +              *(.gentextnr)
 +              __gentextnr_end = .;
 +      }
 +      __gentextnr_len = __gentextnr_end - __gentextnr_start;
 +      __gentextnr_dwords = (__gentextnr_len + 3) >> 2;
  
-       /* 16-bit stack */
-       STACK16_BASE = 0x7c00 - STACK16_LEN;
-       . = STACK16_BASE;
-       .stack16 : AT(STACK16_BASE) {
+       . = STACK_BASE;
 -      .stack : AT(STACK_BASE) {
 -              __stack_start = .;
++      .stack16 : AT(STACK_BASE) {
 +              __stack16_start = .;
-               . += STACK16_LEN;
+               . += STACK_LEN;
 -              __stack_end = .;
 +              __stack16_end = .;
        }
 -      __stack_len = __stack_end - __stack_start;
 -      __stack_dwords = (__stack_len + 3) >> 2;
 +      __stack16_len = __stack16_end - __stack16_start;
 +      __stack16_dwords = (__stack16_len + 3) >> 2;
  
        /* Initialized sections */
  
diff --cc doc/comboot.txt
Simple merge
Simple merge