Compare commits

..

2 Commits

Author SHA1 Message Date
370f086d64 WIP 2023-06-23 16:51:10 +01:00
a029f4e13b [efi] Veto the VirtualBox E1kNetDxe driver
The VirtualBox E1kNetDxe driver has a Stop() method that relies on
being passed its own child device handle.  Unfortunately, the same
driver's Start() method never opens the parent device handle with
BY_CHILD_CONTROLLER attributes on behalf of the newly installed child
device handle, with the result that the UEFI device model is
completely unaware of the nominal parent-child relationship.  This
omission can be observed via the UEFI shell "devtree" command, which
will show the child SNP device handle as a standalone top-level device
handle, with no relationship to its underlying parent PCI device
handle.

The upshot of this omission is that the VirtualBox E1kNetDxe driver's
Stop() method is a pure no-op.  Calling DisconnectController() on the
PCI device handle will return successfully, but will not have actually
disconnected anything.  A subsequent attempt to open the handle on
behalf of iPXE's native Intel driver will get stuck in an infinite
loop inside OpenProtocol(), as the firmware repeatedly calls
DisconnectController() in an attempt to disconnect the E1kNetDxe
driver from the PCI device handle.

Work around this problem by adding the buggy VirtualBox E1kNetDxe
driver to the veto list.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
2023-06-23 16:51:10 +01:00
63 changed files with 188 additions and 640 deletions

View File

@ -50,10 +50,6 @@ $(BIN)/efidrv.cab : $(BIN)/alldrv.efis # $(ALL_drv.efi) is not yet defined
$(QM)$(ECHO) " [CAB] $@" $(QM)$(ECHO) " [CAB] $@"
$(Q)$(LCAB) -n -q $(ALL_drv.efi) $@ $(Q)$(LCAB) -n -q $(ALL_drv.efi) $@
$(BIN)/%.iso : $(BIN)/%.efi util/genfsimg $(BIN)/%.iso $(BIN)/%.usb : $(BIN)/%.efi util/genfsimg
$(QM)$(ECHO) " [GENFSIMG] $@"
$(Q)util/genfsimg -o $@ $<
$(BIN)/%.usb : $(BIN)/%.efi util/genfsimg
$(QM)$(ECHO) " [GENFSIMG] $@" $(QM)$(ECHO) " [GENFSIMG] $@"
$(Q)util/genfsimg -o $@ $< $(Q)util/genfsimg -o $@ $<

View File

@ -502,13 +502,6 @@ LDFLAGS += --gc-sections
# #
LDFLAGS += -static LDFLAGS += -static
# Use separate code segment if supported by linker
#
ZSC_TEST = $(LD) -z separate-code --version 2>&1 > /dev/null
ZSC_FLAGS := $(shell [ -z "`$(ZSC_TEST)`" ] && \
$(ECHO) '-z separate-code -z max-page-size=4096')
LDFLAGS += $(ZSC_FLAGS)
# compiler.h is needed for our linking and debugging system # compiler.h is needed for our linking and debugging system
# #
CFLAGS += -include include/compiler.h CFLAGS += -include include/compiler.h
@ -1009,7 +1002,6 @@ endif
# Device ID tables (using IDs from ROM definition file) # Device ID tables (using IDs from ROM definition file)
# #
define obj_pci_id_asm define obj_pci_id_asm
.section ".note.GNU-stack", "", $(ASM_TCHAR)progbits
.section ".pci_devlist.$(1)", "a", $(ASM_TCHAR)progbits .section ".pci_devlist.$(1)", "a", $(ASM_TCHAR)progbits
.globl pci_devlist_$(1) .globl pci_devlist_$(1)
pci_devlist_$(1): pci_devlist_$(1):
@ -1179,7 +1171,7 @@ BLIB = $(BIN)/blib.a
$(BLIB) : $(BLIB_OBJS) $(BLIB_LIST) $(MAKEDEPS) $(BLIB) : $(BLIB_OBJS) $(BLIB_LIST) $(MAKEDEPS)
$(Q)$(RM) $(BLIB) $(Q)$(RM) $(BLIB)
$(QM)$(ECHO) " [AR] $@" $(QM)$(ECHO) " [AR] $@"
$(Q)$(AR) rcD $@ $(sort $(BLIB_OBJS)) $(Q)$(AR) rD $@ $(sort $(BLIB_OBJS))
$(Q)$(OBJCOPY) --enable-deterministic-archives \ $(Q)$(OBJCOPY) --enable-deterministic-archives \
--prefix-symbols=$(SYMBOL_PREFIX) $@ --prefix-symbols=$(SYMBOL_PREFIX) $@
$(Q)$(RANLIB) -D $@ $(Q)$(RANLIB) -D $@

View File

@ -9,5 +9,4 @@ INCDIRS += arch/arm/include
# ARM-specific directories containing source files # ARM-specific directories containing source files
# #
SRCDIRS += arch/arm/core
SRCDIRS += arch/arm/interface/efi SRCDIRS += arch/arm/interface/efi

View File

@ -46,7 +46,7 @@ union arm32_io_qword {
* *
* This is not atomic for ARM32. * This is not atomic for ARM32.
*/ */
static __unused uint64_t arm32_readq ( volatile uint64_t *io_addr ) { static uint64_t arm32_readq ( volatile uint64_t *io_addr ) {
volatile union arm32_io_qword *ptr = volatile union arm32_io_qword *ptr =
container_of ( io_addr, union arm32_io_qword, qword ); container_of ( io_addr, union arm32_io_qword, qword );
union arm32_io_qword tmp; union arm32_io_qword tmp;
@ -64,8 +64,7 @@ static __unused uint64_t arm32_readq ( volatile uint64_t *io_addr ) {
* *
* This is not atomic for ARM32. * This is not atomic for ARM32.
*/ */
static __unused void arm32_writeq ( uint64_t data, static void arm32_writeq ( uint64_t data, volatile uint64_t *io_addr ) {
volatile uint64_t *io_addr ) {
volatile union arm32_io_qword *ptr = volatile union arm32_io_qword *ptr =
container_of ( io_addr, union arm32_io_qword, qword ); container_of ( io_addr, union arm32_io_qword, qword );
union arm32_io_qword tmp; union arm32_io_qword tmp;
@ -83,6 +82,7 @@ PROVIDE_IOAPI_INLINE ( arm, readl );
PROVIDE_IOAPI_INLINE ( arm, writeb ); PROVIDE_IOAPI_INLINE ( arm, writeb );
PROVIDE_IOAPI_INLINE ( arm, writew ); PROVIDE_IOAPI_INLINE ( arm, writew );
PROVIDE_IOAPI_INLINE ( arm, writel ); PROVIDE_IOAPI_INLINE ( arm, writel );
PROVIDE_IOAPI_INLINE ( arm, iodelay );
PROVIDE_IOAPI_INLINE ( arm, mb ); PROVIDE_IOAPI_INLINE ( arm, mb );
#ifdef __aarch64__ #ifdef __aarch64__
PROVIDE_IOAPI_INLINE ( arm, readq ); PROVIDE_IOAPI_INLINE ( arm, readq );
@ -91,4 +91,3 @@ PROVIDE_IOAPI_INLINE ( arm, writeq );
PROVIDE_IOAPI ( arm, readq, arm32_readq ); PROVIDE_IOAPI ( arm, readq, arm32_readq );
PROVIDE_IOAPI ( arm, writeq, arm32_writeq ); PROVIDE_IOAPI ( arm, writeq, arm32_writeq );
#endif #endif
PROVIDE_DUMMY_PIO ( arm );

View File

@ -9,4 +9,6 @@
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <ipxe/io.h>
#endif /* _BITS_PCI_IO_H */ #endif /* _BITS_PCI_IO_H */

View File

@ -15,8 +15,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#define IOAPI_PREFIX_arm __arm_ #define IOAPI_PREFIX_arm __arm_
#endif #endif
#include <ipxe/dummy_pio.h>
/* /*
* Memory space mappings * Memory space mappings
* *
@ -79,6 +77,55 @@ ARM_WRITEX ( w, uint16_t, "h", "" );
ARM_WRITEX ( l, uint32_t, "", "" ); ARM_WRITEX ( l, uint32_t, "", "" );
#endif #endif
/*
* Dummy PIO reads and writes up to 32 bits
*
* There is no common standard for I/O-space access for ARM, and
* non-MMIO peripherals are vanishingly rare. Provide dummy
* implementations that will allow code to link and should cause
* drivers to simply fail to detect hardware at runtime.
*
*/
#define ARM_INX( _suffix, _type ) \
static inline __always_inline _type \
IOAPI_INLINE ( arm, in ## _suffix ) ( volatile _type *io_addr __unused) { \
return ~( (_type) 0 ); \
} \
static inline __always_inline void \
IOAPI_INLINE ( arm, ins ## _suffix ) ( volatile _type *io_addr __unused, \
_type *data, unsigned int count ) { \
memset ( data, 0xff, count * sizeof ( *data ) ); \
}
ARM_INX ( b, uint8_t );
ARM_INX ( w, uint16_t );
ARM_INX ( l, uint32_t );
#define ARM_OUTX( _suffix, _type ) \
static inline __always_inline void \
IOAPI_INLINE ( arm, out ## _suffix ) ( _type data __unused, \
volatile _type *io_addr __unused ) { \
/* Do nothing */ \
} \
static inline __always_inline void \
IOAPI_INLINE ( arm, outs ## _suffix ) ( volatile _type *io_addr __unused, \
const _type *data __unused, \
unsigned int count __unused ) { \
/* Do nothing */ \
}
ARM_OUTX ( b, uint8_t );
ARM_OUTX ( w, uint16_t );
ARM_OUTX ( l, uint32_t );
/*
* Slow down I/O
*
*/
static inline __always_inline void
IOAPI_INLINE ( arm, iodelay ) ( void ) {
/* Nothing to do */
}
/* /*
* Memory barrier * Memory barrier
* *
@ -93,7 +140,4 @@ IOAPI_INLINE ( arm, mb ) ( void ) {
#endif #endif
} }
/* Dummy PIO */
DUMMY_PIO ( arm );
#endif /* _IPXE_ARM_IO_H */ #endif /* _IPXE_ARM_IO_H */

View File

@ -1,6 +1,5 @@
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ) FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
.section ".note.GNU-stack", "", %progbits
.text .text
/* Must match jmp_buf structure layout */ /* Must match jmp_buf structure layout */

View File

@ -9,7 +9,6 @@
* Interrupt handlers * Interrupt handlers
**************************************************************************** ****************************************************************************
*/ */
.section ".note.GNU-stack", "", @progbits
.section ".text", "ax", @progbits .section ".text", "ax", @progbits
.code32 .code32

View File

@ -1,6 +1,5 @@
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ) FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
.section ".note.GNU-stack", "", @progbits
.text .text
.arch i386 .arch i386
.code32 .code32

View File

@ -1,4 +1,3 @@
.section ".note.GNU-stack", "", @progbits
.arch i386 .arch i386
.section ".data", "aw", @progbits .section ".data", "aw", @progbits

View File

@ -20,7 +20,6 @@ CFLAGS += -fshort-wchar
# LoongArch64-specific directories containing source files # LoongArch64-specific directories containing source files
SRCDIRS += arch/loong64/core SRCDIRS += arch/loong64/core
SRCDIRS += arch/loong64/interface/efi
# Include platform-specific Makefile # Include platform-specific Makefile
MAKEDEPS += arch/loong64/Makefile.$(PLATFORM) MAKEDEPS += arch/loong64/Makefile.$(PLATFORM)

View File

@ -1,14 +0,0 @@
# -*- makefile -*- : Force emacs to use Makefile mode
# Specify EFI image builder
#
ELF2EFI = $(ELF2EFI64)
# Specify EFI boot file
#
EFI_BOOT_FILE = bootloongarch64.efi
# Include generic EFI Makefile
#
MAKEDEPS += Makefile.efi
include Makefile.efi

View File

@ -1,46 +0,0 @@
/*
* Copyright (c) 2023, Xiaotian Wu <wuxiaotian@loongson.cn>
*
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA.
*
* You can also choose to distribute this program under the terms of
* the Unmodified Binary Distribution Licence (as given in the file
* COPYING.UBDL), provided that you have satisfied its requirements.
*/
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <ipxe/io.h>
#include <ipxe/loong64_io.h>
/** @file
*
* iPXE I/O API for LoongArch64
*
*/
PROVIDE_IOAPI_INLINE ( loong64, phys_to_bus );
PROVIDE_IOAPI_INLINE ( loong64, bus_to_phys );
PROVIDE_IOAPI_INLINE ( loong64, readb );
PROVIDE_IOAPI_INLINE ( loong64, readw );
PROVIDE_IOAPI_INLINE ( loong64, readl );
PROVIDE_IOAPI_INLINE ( loong64, readq );
PROVIDE_IOAPI_INLINE ( loong64, writeb );
PROVIDE_IOAPI_INLINE ( loong64, writew );
PROVIDE_IOAPI_INLINE ( loong64, writel );
PROVIDE_IOAPI_INLINE ( loong64, writeq );
PROVIDE_IOAPI_INLINE ( loong64, mb );
PROVIDE_DUMMY_PIO ( loong64 );

View File

@ -12,6 +12,4 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
/** Page shift */ /** Page shift */
#define PAGE_SHIFT 12 #define PAGE_SHIFT 12
#include <ipxe/loong64_io.h>
#endif /* _BITS_IO_H */ #endif /* _BITS_IO_H */

View File

@ -9,6 +9,4 @@
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <ipxe/efi/efiloong64_nap.h> #endif /* _BITS_MAP_H */
#endif /* _BITS_NAP_H */

View File

@ -1,18 +0,0 @@
#ifndef _IPXE_EFILOONG64_NAP_H
#define _IPXE_EFILOONG64_NAP_H
/** @file
*
* EFI CPU sleeping
*
*/
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#ifdef NAP_EFILOONG64
#define NAP_PREFIX_efiloong64
#else
#define NAP_PREFIX_efiloong64 __efiloong64_
#endif
#endif /* _IPXE_EFILOONG64_NAP_H */

View File

@ -1,82 +0,0 @@
#ifndef _IPXE_LOONG64_IO_H
#define _IPXE_LOONG64_IO_H
/** @file
*
* iPXE I/O API for LoongArch64
*
*/
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#ifdef IOAPI_LOONG64
#define IOAPI_PREFIX_loong64
#else
#define IOAPI_PREFIX_loong64 __loong64_
#endif
#include <ipxe/dummy_pio.h>
/*
* Memory space mappings
*
*/
/*
* Physical<->Bus address mappings
*
*/
static inline __always_inline unsigned long
IOAPI_INLINE ( loong64, phys_to_bus ) ( unsigned long phys_addr ) {
return phys_addr;
}
static inline __always_inline unsigned long
IOAPI_INLINE ( loong64, bus_to_phys ) ( unsigned long bus_addr ) {
return bus_addr;
}
/*
* MMIO reads and writes up to native word size
*
*/
#define LOONG64_READX( _suffix, _type, _insn_suffix ) \
static inline __always_inline _type \
IOAPI_INLINE ( loong64, read ## _suffix ) ( volatile _type *io_addr ) { \
_type data; \
__asm__ __volatile__ ( "ld." _insn_suffix " %0, %1" \
: "=r" ( data ) : "m" ( *io_addr ) ); \
return data; \
}
LOONG64_READX ( b, uint8_t, "bu");
LOONG64_READX ( w, uint16_t, "hu");
LOONG64_READX ( l, uint32_t, "wu");
LOONG64_READX ( q, uint64_t, "d");
#define LOONG64_WRITEX( _suffix, _type, _insn_suffix ) \
static inline __always_inline void \
IOAPI_INLINE ( loong64, write ## _suffix ) ( _type data, \
volatile _type *io_addr ) { \
__asm__ __volatile__ ( "st." _insn_suffix " %0, %1" \
: : "r" ( data ), "m" ( *io_addr ) ); \
}
LOONG64_WRITEX ( b, uint8_t, "b");
LOONG64_WRITEX ( w, uint16_t, "h");
LOONG64_WRITEX ( l, uint32_t, "w" );
LOONG64_WRITEX ( q, uint64_t, "d");
/*
* Memory barrier
*
*/
static inline __always_inline void
IOAPI_INLINE ( loong64, mb ) ( void ) {
__asm__ __volatile__ ( "dbar 0" );
}
/* Dummy PIO */
DUMMY_PIO ( loong64 );
#endif /* _IPXE_LOONG64_IO_H */

View File

@ -1,53 +0,0 @@
/*
* Copyright (c) 2023, Xiaotian Wu <wuxiaotian@loongson.cn>
*
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA.
*
* You can also choose to distribute this program under the terms of
* the Unmodified Binary Distribution Licence (as given in the file
* COPYING.UBDL), provided that you have satisfied its requirements.
*/
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <ipxe/nap.h>
#include <ipxe/efi/efi.h>
/** @file
*
* iPXE CPU sleeping API for EFI
*
*/
/**
* Sleep until next interrupt
*
*/
static void efiloong64_cpu_nap ( void ) {
/*
* I can't find any EFI API that allows us to put the CPU to
* sleep. The CpuSleep() function is defined in CpuLib.h, but
* isn't part of any exposed protocol so we have no way to
* call it.
*
* The EFI shell doesn't seem to bother sleeping the CPU; it
* just sits there idly burning power.
*
*/
__asm__ __volatile__ ( "idle 0" );
}
PROVIDE_NAP ( efiloong64, cpu_nap, efiloong64_cpu_nap );

View File

@ -13,13 +13,6 @@ LDSCRIPT_PREFIX = arch/x86/scripts/prefixonly.lds
# #
LDFLAGS += -N --no-check-sections LDFLAGS += -N --no-check-sections
# Do not warn about RWX segments (required by most prefixes)
#
WRWX_TEST = $(LD) --warn-rwx-segments --version 2>&1 > /dev/null
WRWX_FLAGS := $(shell [ -z "`$(WRWX_TEST)`" ] && \
$(ECHO) '--no-warn-rwx-segments')
LDFLAGS += $(WRWX_FLAGS)
# Media types. # Media types.
# #
MEDIA += rom MEDIA += rom
@ -61,15 +54,9 @@ LIST_NAME_mrom := ROMS
LIST_NAME_pcirom := ROMS LIST_NAME_pcirom := ROMS
LIST_NAME_isarom := ROMS LIST_NAME_isarom := ROMS
# ISO images # ISO or FAT filesystem images
NON_AUTO_MEDIA += iso NON_AUTO_MEDIA += iso
$(BIN)/%.iso : $(BIN)/%.lkrn util/genfsimg $(BIN)/%.iso $(BIN)/%.sdsk: $(BIN)/%.lkrn util/genfsimg
$(QM)$(ECHO) " [GENFSIMG] $@"
$(Q)util/genfsimg -o $@ $<
# FAT filesystem images (via syslinux)
NON_AUTO_MEDIA += sdsk
$(BIN)/%.sdsk : $(BIN)/%.lkrn util/genfsimg
$(QM)$(ECHO) " [GENFSIMG] $@" $(QM)$(ECHO) " [GENFSIMG] $@"
$(Q)util/genfsimg -o $@ $< $(Q)util/genfsimg -o $@ $<

View File

@ -22,7 +22,6 @@
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ) FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
.section ".note.GNU-stack", "", @progbits
.text .text
.arch i386 .arch i386
.code16 .code16

View File

@ -1,6 +1,5 @@
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ) FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
.section ".note.GNU-stack", "", @progbits
.arch i386 .arch i386
#ifdef __x86_64__ #ifdef __x86_64__

View File

@ -1,6 +1,5 @@
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ) FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
.section ".note.GNU-stack", "", @progbits
.arch i386 .arch i386
/**************************************************************************** /****************************************************************************

View File

@ -10,7 +10,6 @@ FILE_LICENCE ( GPL2_OR_LATER )
#define PIC1_ICR 0x20 #define PIC1_ICR 0x20
#define PIC2_ICR 0xa0 #define PIC2_ICR 0xa0
.section ".note.GNU-stack", "", @progbits
.text .text
.arch i386 .arch i386
.code16 .code16

View File

@ -290,38 +290,29 @@ static const char *bios_ansi_input = "";
struct bios_key { struct bios_key {
/** Scancode */ /** Scancode */
uint8_t scancode; uint8_t scancode;
/** Relative key value */ /** Key code */
uint16_t rkey; uint16_t key;
} __attribute__ (( packed )); } __attribute__ (( packed ));
/**
* Define a BIOS key mapping
*
* @v scancode Scancode
* @v key iPXE key code
* @v bioskey BIOS key mapping
*/
#define BIOS_KEY( scancode, key ) { scancode, KEY_REL ( key ) }
/** Mapping from BIOS scan codes to iPXE key codes */ /** Mapping from BIOS scan codes to iPXE key codes */
static const struct bios_key bios_keys[] = { static const struct bios_key bios_keys[] = {
BIOS_KEY ( 0x53, KEY_DC ), { 0x53, KEY_DC },
BIOS_KEY ( 0x48, KEY_UP ), { 0x48, KEY_UP },
BIOS_KEY ( 0x50, KEY_DOWN ), { 0x50, KEY_DOWN },
BIOS_KEY ( 0x4b, KEY_LEFT ), { 0x4b, KEY_LEFT },
BIOS_KEY ( 0x4d, KEY_RIGHT ), { 0x4d, KEY_RIGHT },
BIOS_KEY ( 0x47, KEY_HOME ), { 0x47, KEY_HOME },
BIOS_KEY ( 0x4f, KEY_END ), { 0x4f, KEY_END },
BIOS_KEY ( 0x49, KEY_PPAGE ), { 0x49, KEY_PPAGE },
BIOS_KEY ( 0x51, KEY_NPAGE ), { 0x51, KEY_NPAGE },
BIOS_KEY ( 0x3f, KEY_F5 ), { 0x3f, KEY_F5 },
BIOS_KEY ( 0x40, KEY_F6 ), { 0x40, KEY_F6 },
BIOS_KEY ( 0x41, KEY_F7 ), { 0x41, KEY_F7 },
BIOS_KEY ( 0x42, KEY_F8 ), { 0x42, KEY_F8 },
BIOS_KEY ( 0x43, KEY_F9 ), { 0x43, KEY_F9 },
BIOS_KEY ( 0x44, KEY_F10 ), { 0x44, KEY_F10 },
BIOS_KEY ( 0x85, KEY_F11 ), { 0x85, KEY_F11 },
BIOS_KEY ( 0x86, KEY_F12 ), { 0x86, KEY_F12 },
}; };
/** /**
@ -332,7 +323,7 @@ static const struct bios_key bios_keys[] = {
*/ */
static const char * bios_ansi_seq ( unsigned int scancode ) { static const char * bios_ansi_seq ( unsigned int scancode ) {
static char buf[ 5 /* "[" + two digits + terminator + NUL */ ]; static char buf[ 5 /* "[" + two digits + terminator + NUL */ ];
unsigned int rkey; unsigned int key;
unsigned int terminator; unsigned int terminator;
unsigned int n; unsigned int n;
unsigned int i; unsigned int i;
@ -347,9 +338,9 @@ static const char * bios_ansi_seq ( unsigned int scancode ) {
continue; continue;
/* Construct escape sequence */ /* Construct escape sequence */
rkey = bios_keys[i].rkey; key = bios_keys[i].key;
n = KEY_ANSI_N ( rkey ); n = KEY_ANSI_N ( key );
terminator = KEY_ANSI_TERMINATOR ( rkey ); terminator = KEY_ANSI_TERMINATOR ( key );
*(tmp++) = '['; *(tmp++) = '[';
if ( n ) if ( n )
tmp += sprintf ( tmp, "%d", n ); tmp += sprintf ( tmp, "%d", n );
@ -488,7 +479,6 @@ struct console_driver bios_console __console_driver = {
static __asmcall __used void bios_inject ( struct i386_all_regs *ix86 ) { static __asmcall __used void bios_inject ( struct i386_all_regs *ix86 ) {
unsigned int discard_a; unsigned int discard_a;
unsigned int scancode; unsigned int scancode;
unsigned int rkey;
unsigned int i; unsigned int i;
uint16_t keypress; uint16_t keypress;
int key; int key;
@ -531,10 +521,9 @@ static __asmcall __used void bios_inject ( struct i386_all_regs *ix86 ) {
/* Handle special keys */ /* Handle special keys */
if ( key >= KEY_MIN ) { if ( key >= KEY_MIN ) {
rkey = KEY_REL ( key );
for ( i = 0 ; i < ( sizeof ( bios_keys ) / for ( i = 0 ; i < ( sizeof ( bios_keys ) /
sizeof ( bios_keys[0] ) ) ; i++ ) { sizeof ( bios_keys[0] ) ) ; i++ ) {
if ( bios_keys[i].rkey == rkey ) { if ( bios_keys[i].key == key ) {
scancode = bios_keys[i].scancode; scancode = bios_keys[i].scancode;
keypress = ( scancode << 8 ); keypress = ( scancode << 8 );
break; break;

View File

@ -23,7 +23,6 @@
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ) FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
.section ".note.GNU-stack", "", @progbits
.text .text
.arch i386 .arch i386
.code16 .code16

View File

@ -26,7 +26,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
#include <librm.h> #include <librm.h>
.section ".note.GNU-stack", "", @progbits
.arch i386 .arch i386
/**************************************************************************** /****************************************************************************

View File

@ -21,7 +21,6 @@ FILE_LICENCE ( GPL2_OR_LATER )
#include "librm.h" #include "librm.h"
.section ".note.GNU-stack", "", @progbits
.text .text
.code32 .code32

View File

@ -5,7 +5,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
#define STACK_SEG 0x0200 #define STACK_SEG 0x0200
#define STACK_SIZE 0x2000 #define STACK_SIZE 0x2000
.section ".note.GNU-stack", "", @progbits
.text .text
.arch i386 .arch i386
.section ".prefix", "awx", @progbits .section ".prefix", "awx", @progbits

View File

@ -24,7 +24,6 @@ FILE_LICENCE ( GPL2_ONLY )
.equ SYSSEG, 0x1000 /* system loaded at SYSSEG<<4 */ .equ SYSSEG, 0x1000 /* system loaded at SYSSEG<<4 */
.section ".note.GNU-stack", "", @progbits
.org 0 .org 0
.arch i386 .arch i386
.text .text

View File

@ -36,7 +36,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
#define PSP_CMDLINE_LEN 0x80 #define PSP_CMDLINE_LEN 0x80
#define PSP_CMDLINE_START 0x81 #define PSP_CMDLINE_START 0x81
.section ".note.GNU-stack", "", @progbits
.text .text
.arch i386 .arch i386
.org 0 .org 0

View File

@ -2,7 +2,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
#include <librm.h> #include <librm.h>
.section ".note.GNU-stack", "", @progbits
.text .text
.arch i386 .arch i386
.section ".prefix", "awx", @progbits .section ".prefix", "awx", @progbits

View File

@ -26,7 +26,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
#include <librm.h> #include <librm.h>
.section ".note.GNU-stack", "", @progbits
.arch i386 .arch i386
/* Image compression enabled */ /* Image compression enabled */

View File

@ -4,7 +4,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
#define BZI_LOAD_HIGH_ADDR 0x100000 #define BZI_LOAD_HIGH_ADDR 0x100000
.section ".note.GNU-stack", "", @progbits
.text .text
.arch i386 .arch i386
.code16 .code16

View File

@ -1,6 +1,5 @@
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ) FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
.section ".note.GNU-stack", "", @progbits
.text .text
.arch i386 .arch i386
.section ".prefix", "awx", @progbits .section ".prefix", "awx", @progbits

View File

@ -41,7 +41,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
#define _pcirom_start _mrom_start #define _pcirom_start _mrom_start
#include "pciromprefix.S" #include "pciromprefix.S"
.section ".note.GNU-stack", "", @progbits
.text .text
.arch i386 .arch i386
.code16 .code16

View File

@ -2,7 +2,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
#include <librm.h> #include <librm.h>
.section ".note.GNU-stack", "", @progbits
.text .text
.arch i386 .arch i386
.code16 .code16

View File

@ -1,6 +1,5 @@
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ) FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
.section ".note.GNU-stack", "", @progbits
.org 0 .org 0
.text .text
.arch i386 .arch i386

View File

@ -11,7 +11,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
#define PXE_HACK_EB54 0x0001 #define PXE_HACK_EB54 0x0001
.section ".note.GNU-stack", "", @progbits
.text .text
.arch i386 .arch i386
.org 0 .org 0

View File

@ -8,7 +8,6 @@
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ) FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
.section ".note.GNU-stack", "", @progbits
.text .text
.arch i386 .arch i386
.org 0 .org 0

View File

@ -54,7 +54,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
#define BUSTYPE "PCIR" #define BUSTYPE "PCIR"
#endif #endif
.section ".note.GNU-stack", "", @progbits
.text .text
.code16 .code16
.arch i386 .arch i386

View File

@ -2,7 +2,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
#include <librm.h> #include <librm.h>
.section ".note.GNU-stack", "", @progbits
.text .text
.code16 .code16
.arch i386 .arch i386

View File

@ -43,7 +43,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
**************************************************************************** ****************************************************************************
*/ */
.section ".note.GNU-stack", "", @progbits
.text .text
.arch i486 .arch i486
.section ".prefix.lib", "ax", @progbits .section ".prefix.lib", "ax", @progbits

View File

@ -2,7 +2,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
#include <config/console.h> #include <config/console.h>
.section ".note.GNU-stack", "", @progbits
.text .text
.arch i386 .arch i386
.section ".prefix", "awx", @progbits .section ".prefix", "awx", @progbits

View File

@ -24,7 +24,6 @@
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ) FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
.section ".note.GNU-stack", "", @progbits
.arch i386 .arch i386
/**************************************************************************** /****************************************************************************

View File

@ -31,7 +31,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
/* Breakpoint for when debugging under bochs */ /* Breakpoint for when debugging under bochs */
#define BOCHSBP xchgw %bx, %bx #define BOCHSBP xchgw %bx, %bx
.section ".note.GNU-stack", "", @progbits
.text .text
.arch i386 .arch i386
.section ".text16", "awx", @progbits .section ".text16", "awx", @progbits

View File

@ -83,8 +83,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
#define if64 if 0 #define if64 if 0
#endif #endif
.section ".note.GNU-stack", "", @progbits
/**************************************************************************** /****************************************************************************
* Global descriptor table * Global descriptor table
* *

View File

@ -38,7 +38,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#define SIGFPE 8 #define SIGFPE 8
#define SIGSTKFLT 16 #define SIGSTKFLT 16
.section ".note.GNU-stack", "", @progbits
.section ".text.gdbmach_interrupt", "ax", @progbits .section ".text.gdbmach_interrupt", "ax", @progbits
.code64 .code64

View File

@ -1,6 +1,5 @@
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ) FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
.section ".note.GNU-stack", "", @progbits
.text .text
.code64 .code64

View File

@ -67,9 +67,4 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#define IMAGE_GZIP /* GZIP image support */ #define IMAGE_GZIP /* GZIP image support */
#endif #endif
#if defined ( __loongarch__ )
#define IOAPI_LOONG64
#define NAP_EFILOONG64
#endif
#endif /* CONFIG_DEFAULTS_EFI_H */ #endif /* CONFIG_DEFAULTS_EFI_H */

View File

@ -285,7 +285,6 @@ void intf_shutdown ( struct interface *intf, int rc ) {
intf_nullify ( intf ); intf_nullify ( intf );
/* Transfer destination to temporary interface */ /* Transfer destination to temporary interface */
intf_temp_init ( &tmp, intf );
tmp.dest = intf->dest; tmp.dest = intf->dest;
intf->dest = &null_intf; intf->dest = &null_intf;

View File

@ -28,7 +28,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <ctype.h>
#include <errno.h> #include <errno.h>
#include <getopt.h> #include <getopt.h>
#include <ipxe/netdevice.h> #include <ipxe/netdevice.h>
@ -36,7 +35,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <ipxe/settings.h> #include <ipxe/settings.h>
#include <ipxe/params.h> #include <ipxe/params.h>
#include <ipxe/timer.h> #include <ipxe/timer.h>
#include <ipxe/keys.h>
#include <ipxe/parseopt.h> #include <ipxe/parseopt.h>
#include <config/branding.h> #include <config/branding.h>
@ -215,7 +213,6 @@ int parse_flag ( char *text __unused, int *flag ) {
* @ret rc Return status code * @ret rc Return status code
*/ */
int parse_key ( char *text, unsigned int *key ) { int parse_key ( char *text, unsigned int *key ) {
int rc;
/* Interpret single characters as being a literal key character */ /* Interpret single characters as being a literal key character */
if ( text[0] && ! text[1] ) { if ( text[0] && ! text[1] ) {
@ -224,17 +221,7 @@ int parse_key ( char *text, unsigned int *key ) {
} }
/* Otherwise, interpret as an integer */ /* Otherwise, interpret as an integer */
if ( ( rc = parse_integer ( text, key ) ) < 0 ) return parse_integer ( text, key );
return rc;
/* For backwards compatibility with existing scripts, treat
* integers between the ASCII range and special key range as
* being relative special key values.
*/
if ( ( ! isascii ( *key ) ) && ( *key < KEY_MIN ) )
*key += KEY_MIN;
return 0;
} }
/** /**

View File

@ -60,7 +60,7 @@ static struct xfer_metadata dummy_metadata;
* @ret rc Return status code * @ret rc Return status code
*/ */
int xfer_vredirect ( struct interface *intf, int type, va_list args ) { int xfer_vredirect ( struct interface *intf, int type, va_list args ) {
struct interface tmp; struct interface tmp = INTF_INIT ( null_intf_desc );
struct interface *dest; struct interface *dest;
xfer_vredirect_TYPE ( void * ) *op = xfer_vredirect_TYPE ( void * ) *op =
intf_get_dest_op_no_passthru ( intf, xfer_vredirect, &dest ); intf_get_dest_op_no_passthru ( intf, xfer_vredirect, &dest );
@ -85,7 +85,6 @@ int xfer_vredirect ( struct interface *intf, int type, va_list args ) {
* If redirection fails, then send intf_close() to the * If redirection fails, then send intf_close() to the
* parent interface. * parent interface.
*/ */
intf_temp_init ( &tmp, intf );
intf_plug ( &tmp, dest ); intf_plug ( &tmp, dest );
rc = xfer_vreopen ( dest, type, args ); rc = xfer_vreopen ( dest, type, args );
if ( rc == 0 ) { if ( rc == 0 ) {

View File

@ -300,9 +300,9 @@ static int af_packet_nic_probe ( struct linux_device *device,
return 0; return 0;
err_settings:
unregister_netdev(netdev); unregister_netdev(netdev);
err_register: err_register:
err_settings:
netdev_nullify(netdev); netdev_nullify(netdev);
netdev_put(netdev); netdev_put(netdev);
return rc; return rc;

View File

@ -56,10 +56,6 @@ struct tap_nic {
int fd; int fd;
}; };
/** Default MAC address */
static const uint8_t tap_default_mac[ETH_ALEN] =
{ 0x52, 0x54, 0x00, 0x12, 0x34, 0x56 };
/** Open the TAP device */ /** Open the TAP device */
static int tap_open(struct net_device * netdev) static int tap_open(struct net_device * netdev)
{ {
@ -206,7 +202,6 @@ static int tap_probe(struct linux_device *device, struct linux_device_request *r
nic = netdev->priv; nic = netdev->priv;
linux_set_drvdata(device, netdev); linux_set_drvdata(device, netdev);
netdev->dev = &device->dev; netdev->dev = &device->dev;
memcpy ( netdev->hw_addr, tap_default_mac, ETH_ALEN );
memset(nic, 0, sizeof(*nic)); memset(nic, 0, sizeof(*nic));
/* Look for the mandatory if setting */ /* Look for the mandatory if setting */
@ -236,9 +231,9 @@ static int tap_probe(struct linux_device *device, struct linux_device_request *r
return 0; return 0;
err_settings:
unregister_netdev(netdev); unregister_netdev(netdev);
err_register: err_register:
err_settings:
netdev_nullify(netdev); netdev_nullify(netdev);
netdev_put(netdev); netdev_put(netdev);
return rc; return rc;

View File

@ -95,7 +95,7 @@ static unsigned int usbkbd_map ( unsigned int keycode, unsigned int modifiers,
} }
} else if ( keycode <= USBKBD_KEY_UP ) { } else if ( keycode <= USBKBD_KEY_UP ) {
/* Special keys */ /* Special keys */
static const unsigned int special[] = { static const uint16_t special[] = {
0, 0, 0, 0, 0, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_F9, 0, 0, 0, 0, 0, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_F9,
KEY_F10, KEY_F11, KEY_F12, 0, 0, 0, KEY_IC, KEY_HOME, KEY_F10, KEY_F11, KEY_F12, 0, 0, 0, KEY_IC, KEY_HOME,
KEY_PPAGE, KEY_DC, KEY_END, KEY_NPAGE, KEY_RIGHT, KEY_PPAGE, KEY_DC, KEY_END, KEY_NPAGE, KEY_RIGHT,
@ -110,7 +110,7 @@ static unsigned int usbkbd_map ( unsigned int keycode, unsigned int modifiers,
if ( leds & USBKBD_LED_NUM_LOCK ) { if ( leds & USBKBD_LED_NUM_LOCK ) {
key = "1234567890." [ keycode - USBKBD_KEY_PAD_1 ]; key = "1234567890." [ keycode - USBKBD_KEY_PAD_1 ];
} else { } else {
static const unsigned int keypad[] = { static const uint16_t keypad[] = {
KEY_END, KEY_DOWN, KEY_NPAGE, KEY_LEFT, 0, KEY_END, KEY_DOWN, KEY_NPAGE, KEY_LEFT, 0,
KEY_RIGHT, KEY_HOME, KEY_UP, KEY_PPAGE, KEY_RIGHT, KEY_HOME, KEY_UP, KEY_PPAGE,
KEY_IC, KEY_DC KEY_IC, KEY_DC

View File

@ -9,17 +9,6 @@
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
/**
* Check if character is ASCII
*
* @v character Character
* @ret is_ascii Character is an ASCII character
*/
static inline int isascii ( int character ) {
return ( character <= '\x7f' );
}
/** /**
* Check if character is a decimal digit * Check if character is a decimal digit
* *

View File

@ -1,64 +0,0 @@
#ifndef _IPXE_DUMMY_PIO_H
#define _IPXE_DUMMY_PIO_H
/** @file
*
* Dummy PIO reads and writes up to 32 bits
*
* There is no common standard for I/O-space access for non-x86 CPU
* families, and non-MMIO peripherals are vanishingly rare. Provide
* dummy implementations that will allow code to link and should cause
* drivers to simply fail to detect hardware at runtime.
*/
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#define DUMMY_INX( _prefix, _suffix, _type ) \
static inline __always_inline _type \
IOAPI_INLINE ( _prefix, in ## _suffix ) ( volatile _type *io_addr __unused) { \
return ~( (_type) 0 ); \
} \
static inline __always_inline void \
IOAPI_INLINE ( _prefix, ins ## _suffix ) ( volatile _type *io_addr __unused, \
_type *data, unsigned int count ) {\
memset ( data, 0xff, count * sizeof ( *data ) ); \
}
#define DUMMY_OUTX( _prefix, _suffix, _type ) \
static inline __always_inline void \
IOAPI_INLINE ( _prefix, out ## _suffix ) ( _type data __unused, \
volatile _type *io_addr __unused ){\
/* Do nothing */ \
} \
static inline __always_inline void \
IOAPI_INLINE ( _prefix, outs ## _suffix ) ( volatile _type *io_addr __unused, \
const _type *data __unused, \
unsigned int count __unused ) { \
/* Do nothing */ \
}
#define DUMMY_IODELAY( _prefix ) \
static inline __always_inline void \
IOAPI_INLINE ( _prefix, iodelay ) ( void ) { \
/* Nothing to do */ \
}
#define DUMMY_PIO( _prefix ) \
DUMMY_INX ( _prefix, b, uint8_t ); \
DUMMY_INX ( _prefix, w, uint16_t ); \
DUMMY_INX ( _prefix, l, uint32_t ); \
DUMMY_OUTX ( _prefix, b, uint8_t ); \
DUMMY_OUTX ( _prefix, w, uint16_t ); \
DUMMY_OUTX ( _prefix, l, uint32_t ); \
DUMMY_IODELAY ( _prefix );
#define PROVIDE_DUMMY_PIO( _prefix ) \
PROVIDE_IOAPI_INLINE ( _prefix, inb ); \
PROVIDE_IOAPI_INLINE ( _prefix, inw ); \
PROVIDE_IOAPI_INLINE ( _prefix, inl ); \
PROVIDE_IOAPI_INLINE ( _prefix, outb ); \
PROVIDE_IOAPI_INLINE ( _prefix, outw ); \
PROVIDE_IOAPI_INLINE ( _prefix, outl ); \
PROVIDE_IOAPI_INLINE ( _prefix, iodelay );
#endif /* _IPXE_DUMMY_PIO_H */

View File

@ -133,30 +133,17 @@ struct interface {
struct interface *dest; struct interface *dest;
/** Reference counter /** Reference counter
* *
* If this interface is not part of a reference-counted object * If this interface is not part of a reference-counted
* then this field is NULL. * object, this field may be NULL.
*/ */
struct refcnt *refcnt; struct refcnt *refcnt;
/** Interface descriptor /** Interface descriptor */
*
* If this is a temporary outbound-only interface created by
* intf_temp_init() then this field is NULL.
*/
struct interface_descriptor *desc; struct interface_descriptor *desc;
/** Original interface properties */ /** Original interface descriptor
union { *
/** Original interface descriptor * Used by intf_reinit().
* */
* Used by intf_reinit(). struct interface_descriptor *original;
*/
struct interface_descriptor *desc;
/** Original interface
*
* Used for temporary outbound-only interfaces created
* by intf_temp_init().
*/
struct interface *intf;
} original;
}; };
extern void intf_plug ( struct interface *intf, struct interface *dest ); extern void intf_plug ( struct interface *intf, struct interface *dest );
@ -206,7 +193,7 @@ static inline void intf_init ( struct interface *intf,
intf->dest = &null_intf; intf->dest = &null_intf;
intf->refcnt = refcnt; intf->refcnt = refcnt;
intf->desc = desc; intf->desc = desc;
intf->original.desc = desc; intf->original = desc;
} }
/** /**
@ -214,38 +201,13 @@ static inline void intf_init ( struct interface *intf,
* *
* @v descriptor Object interface descriptor * @v descriptor Object interface descriptor
*/ */
#define INTF_INIT( descriptor ) { \ #define INTF_INIT( descriptor ) { \
.dest = &null_intf, \ .dest = &null_intf, \
.refcnt = NULL, \ .refcnt = NULL, \
.desc = &(descriptor), \ .desc = &(descriptor), \
.original = { \ .original = &(descriptor), \
.desc = &(descriptor), \
}, \
} }
/**
* Initialise a temporary outbound-only object interface
*
* @v intf Temporary outbound-only object interface
* @v original Original object interface
*/
static inline void intf_temp_init ( struct interface *intf,
struct interface *original ) {
intf->dest = &null_intf;
intf->desc = NULL;
intf->original.intf = original;
}
/**
* Get original interface
*
* @v intf Object interface (possibly a temporary interface)
* @ret intf Original object interface
*/
static inline struct interface * intf_origin ( struct interface *intf ) {
return ( intf->desc ? intf : intf->original.intf );
}
/** /**
* Get object interface destination and operation method (without pass-through) * Get object interface destination and operation method (without pass-through)
* *
@ -278,7 +240,7 @@ static inline struct interface * intf_origin ( struct interface *intf ) {
* *
* Use as the first argument to DBGC() or equivalent macro. * Use as the first argument to DBGC() or equivalent macro.
*/ */
#define INTF_COL( intf ) intf_object ( intf_origin ( intf ) ) #define INTF_COL( intf ) intf_object ( intf )
/** printf() format string for INTF_DBG() */ /** printf() format string for INTF_DBG() */
#define INTF_FMT "%p+%zx" #define INTF_FMT "%p+%zx"
@ -289,9 +251,7 @@ static inline struct interface * intf_origin ( struct interface *intf ) {
* @v intf Object interface * @v intf Object interface
* @ret args printf() argument list corresponding to INTF_FMT * @ret args printf() argument list corresponding to INTF_FMT
*/ */
#define INTF_DBG( intf ) \ #define INTF_DBG( intf ) intf_object ( intf ), (intf)->desc->offset
intf_object ( intf_origin ( intf ) ), \
intf_origin ( intf )->desc->offset
/** printf() format string for INTF_INTF_DBG() */ /** printf() format string for INTF_INTF_DBG() */
#define INTF_INTF_FMT INTF_FMT "->" INTF_FMT #define INTF_INTF_FMT INTF_FMT "->" INTF_FMT
@ -313,7 +273,7 @@ static inline struct interface * intf_origin ( struct interface *intf ) {
static inline void intf_reinit ( struct interface *intf ) { static inline void intf_reinit ( struct interface *intf ) {
/* Restore original interface descriptor */ /* Restore original interface descriptor */
intf->desc = intf->original.desc; intf->desc = intf->original;
} }
#endif /* _IPXE_INTERFACE_H */ #endif /* _IPXE_INTERFACE_H */

View File

@ -52,10 +52,10 @@ struct keymap {
#define KEYMAP_PSEUDO 0x80 #define KEYMAP_PSEUDO 0x80
/** Ctrl key flag */ /** Ctrl key flag */
#define KEYMAP_CTRL 0x01000000 #define KEYMAP_CTRL 0x0100
/** CapsLock key flag */ /** CapsLock key flag */
#define KEYMAP_CAPSLOCK 0x02000000 #define KEYMAP_CAPSLOCK 0x0200
/** Undo CapsLock key flag /** Undo CapsLock key flag
* *
@ -64,13 +64,13 @@ struct keymap {
* in order to correctly handle keyboard mappings that swap alphabetic * in order to correctly handle keyboard mappings that swap alphabetic
* and non-alphabetic keys. * and non-alphabetic keys.
*/ */
#define KEYMAP_CAPSLOCK_UNDO 0x04000000 #define KEYMAP_CAPSLOCK_UNDO 0x0400
/** Undo and redo CapsLock key flags */ /** Undo and redo CapsLock key flags */
#define KEYMAP_CAPSLOCK_REDO ( KEYMAP_CAPSLOCK | KEYMAP_CAPSLOCK_UNDO ) #define KEYMAP_CAPSLOCK_REDO ( KEYMAP_CAPSLOCK | KEYMAP_CAPSLOCK_UNDO )
/** AltGr key flag */ /** AltGr key flag */
#define KEYMAP_ALTGR 0x08000000 #define KEYMAP_ALTGR 0x0800
extern unsigned int key_remap ( unsigned int character ); extern unsigned int key_remap ( unsigned int character );
extern struct keymap * keymap_find ( const char *name ); extern struct keymap * keymap_find ( const char *name );

View File

@ -49,58 +49,19 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#define ESC 0x1b #define ESC 0x1b
/* /*
* Special keys outside the normal Unicode range * Special keys outside the normal ASCII range
*
* *
* The names are chosen to match those used by curses. The values are * The names are chosen to match those used by curses. The values are
* chosen to facilitate easy conversion from a received ANSI escape * chosen to facilitate easy conversion from a received ANSI escape
* sequence to a KEY_XXX constant. * sequence to a KEY_XXX constant.
*
* Note that the values are exposed to iPXE commands via parse_key()
* and therefore may not be changed without breaking existing scripts.
*/ */
/** #define KEY_ANSI( n, terminator ) ( 0x100 * ( (n) + 1 ) + (terminator) )
* Minimum value for special keypresses #define KEY_ANSI_N( key ) ( ( (key) / 0x100 ) - 1 )
*
* This value is chosen to lie above the maximum Unicode code point
* value 0x10ffff.
*/
#define KEY_MIN 0x110000
/**
* Construct relative key value for special key
*
* @v key Key value
* @ret rkey Relative key value
*/
#define KEY_REL( key ) ( (key) - KEY_MIN )
/**
* Construct ANSI escape sequence key value
*
* @v n ANSI escape sequence numeric portion, or 0 for none
* @v terminator ANSI escape sequence terminating character
* @ret key Key value
*/
#define KEY_ANSI( n, terminator ) \
( KEY_MIN + ( ( (n) + 1 ) << 8 ) + (terminator) )
/**
* Extract ANSI escape sequence numeric portion
*
* @v key Key value (or relative key value)
* @ret n ANSI escape sequence numeric portion, or 0 for none
*/
#define KEY_ANSI_N( key ) ( ( ( (key) >> 8 ) & 0xff ) - 1 )
/**
* Extract ANSI escape sequence terminating character
*
* @v key Key value (or relative key value)
* @ret terminator ANSI escape sequence terminating character
*/
#define KEY_ANSI_TERMINATOR( key ) ( (key) & 0xff ) #define KEY_ANSI_TERMINATOR( key ) ( (key) & 0xff )
#define KEY_MIN 0x101
#define KEY_UP KEY_ANSI ( 0, 'A' ) /**< Up arrow */ #define KEY_UP KEY_ANSI ( 0, 'A' ) /**< Up arrow */
#define KEY_DOWN KEY_ANSI ( 0, 'B' ) /**< Down arrow */ #define KEY_DOWN KEY_ANSI ( 0, 'B' ) /**< Down arrow */
#define KEY_RIGHT KEY_ANSI ( 0, 'C' ) /**< Right arrow */ #define KEY_RIGHT KEY_ANSI ( 0, 'C' ) /**< Right arrow */

View File

@ -201,8 +201,8 @@ static int efi_veto_uninstall ( struct efi_veto *veto ) {
* @v protocol Opened protocol * @v protocol Opened protocol
* @ret rc Return status code * @ret rc Return status code
*/ */
static int efi_veto_close_protocol ( struct efi_veto *veto, EFI_HANDLE handle, static int efi_veto_openers ( struct efi_veto *veto, EFI_HANDLE handle,
EFI_GUID *protocol ) { EFI_GUID *protocol ) {
EFI_BOOT_SERVICES *bs = efi_systab->BootServices; EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
EFI_HANDLE driver = veto->driver; EFI_HANDLE driver = veto->driver;
EFI_HANDLE image = veto->image; EFI_HANDLE image = veto->image;
@ -255,13 +255,13 @@ static int efi_veto_close_protocol ( struct efi_veto *veto, EFI_HANDLE handle,
} }
/** /**
* Close handle potentially opened by an EFI driver * Close and/or uninstall handle potentially used by an EFI driver
* *
* @v veto Driver veto * @v veto Driver veto
* @v handle Potentially opened handle * @v handle Potentially opened handle
* @ret rc Return status code * @ret rc Return status code
*/ */
static int efi_veto_close_handle ( struct efi_veto *veto, EFI_HANDLE handle ) { static int efi_veto_handle ( struct efi_veto *veto, EFI_HANDLE handle ) {
EFI_BOOT_SERVICES *bs = efi_systab->BootServices; EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
EFI_HANDLE driver = veto->driver; EFI_HANDLE driver = veto->driver;
EFI_GUID **protocols; EFI_GUID **protocols;
@ -285,8 +285,7 @@ static int efi_veto_close_handle ( struct efi_veto *veto, EFI_HANDLE handle ) {
/* Close each protocol */ /* Close each protocol */
for ( i = 0 ; i < count ; i++ ) { for ( i = 0 ; i < count ; i++ ) {
protocol = protocols[ count - i - 1]; protocol = protocols[ count - i - 1];
if ( ( rc = efi_veto_close_protocol ( veto, handle, if ( ( rc = efi_veto_openers ( veto, handle, protocol ) ) != 0 )
protocol ) ) != 0 )
goto err_close; goto err_close;
} }
@ -300,12 +299,12 @@ static int efi_veto_close_handle ( struct efi_veto *veto, EFI_HANDLE handle ) {
} }
/** /**
* Close all remaining handles opened by an EFI driver * Close and/or uninstall all remaining handles used by an EFI driver
* *
* @v veto Driver veto * @v veto Driver veto
* @ret rc Return status code * @ret rc Return status code
*/ */
static int efi_veto_close ( struct efi_veto *veto ) { static int efi_veto_handles ( struct efi_veto *veto ) {
EFI_BOOT_SERVICES *bs = efi_systab->BootServices; EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
EFI_HANDLE driver = veto->driver; EFI_HANDLE driver = veto->driver;
EFI_HANDLE *handles; EFI_HANDLE *handles;
@ -324,17 +323,15 @@ static int efi_veto_close ( struct efi_veto *veto ) {
goto err_list; goto err_list;
} }
/* Close each handle */ /* Close and/or uninstall each handle */
for ( i = 0 ; i < count ; i++ ) { for ( i = 0 ; i < count ; i++ ) {
handle = handles[ count - i - 1 ]; handle = handles[ count - i - 1 ];
if ( ( rc = efi_veto_close_handle ( veto, handle ) ) != 0 ) if ( ( rc = efi_veto_handle ( veto, handle ) ) != 0 )
goto err_close; goto err_close;
} }
/* Success */ /* Success */
rc = 0; rc = 0;
DBGC2 ( driver, "EFIVETO %s closed all remaining handles\n",
efi_handle_name ( driver ) );
err_close: err_close:
bs->FreePool ( handles ); bs->FreePool ( handles );
@ -360,8 +357,8 @@ static int efi_veto_destroy ( struct efi_veto *veto ) {
if ( ( rc = efi_veto_uninstall ( veto ) ) != 0 ) if ( ( rc = efi_veto_uninstall ( veto ) ) != 0 )
return rc; return rc;
/* Close any remaining opened handles */ /* Close and/or uninstall any remaining handles */
if ( ( rc = efi_veto_close ( veto ) ) != 0 ) if ( ( rc = efi_veto_handles ( veto ) ) != 0 )
return rc; return rc;
DBGC ( driver, "EFIVETO %s forcibly removed\n", DBGC ( driver, "EFIVETO %s forcibly removed\n",
@ -494,6 +491,37 @@ efi_veto_vmware_uefipxebc ( EFI_DRIVER_BINDING_PROTOCOL *binding __unused,
return 1; return 1;
} }
/**
* Veto VirtualBox E1kNetDxe driver
*
* @v binding Driver binding protocol
* @v loaded Loaded image protocol
* @v wtf Component name protocol, if present
* @v manufacturer Manufacturer name, if present
* @v name Driver name, if present
* @ret vetoed Driver is to be vetoed
*/
static int
efi_veto_vbox_e1knet ( EFI_DRIVER_BINDING_PROTOCOL *binding __unused,
EFI_LOADED_IMAGE_PROTOCOL *loaded __unused,
EFI_COMPONENT_NAME_PROTOCOL *wtf __unused,
const char *manufacturer, const CHAR16 *name ) {
static const CHAR16 e1knet[] = L"E1000 network interface card Driver";
static const char *vbox = "innotek GmbH";
/* Check manufacturer and driver name */
if ( ! manufacturer )
return 0;
if ( ! name )
return 0;
if ( strcmp ( manufacturer, vbox ) != 0 )
return 0;
if ( memcmp ( name, e1knet, sizeof ( e1knet ) ) != 0 )
return 0;
return 1;
}
/** Driver vetoes */ /** Driver vetoes */
static struct efi_veto_candidate efi_vetoes[] = { static struct efi_veto_candidate efi_vetoes[] = {
{ {
@ -508,6 +536,10 @@ static struct efi_veto_candidate efi_vetoes[] = {
.name = "VMware UefiPxeBc", .name = "VMware UefiPxeBc",
.veto = efi_veto_vmware_uefipxebc, .veto = efi_veto_vmware_uefipxebc,
}, },
{
.name = "VirtualBox E1kNetDxe",
.veto = efi_veto_vbox_e1knet,
},
}; };
/** /**

View File

@ -656,7 +656,7 @@ static void free_netdev ( struct refcnt *refcnt ) {
struct net_device *netdev = struct net_device *netdev =
container_of ( refcnt, struct net_device, refcnt ); container_of ( refcnt, struct net_device, refcnt );
assert ( ! timer_running ( &netdev->link_block ) ); stop_timer ( &netdev->link_block );
netdev_tx_flush ( netdev ); netdev_tx_flush ( netdev );
netdev_rx_flush ( netdev ); netdev_rx_flush ( netdev );
clear_settings ( netdev_settings ( netdev ) ); clear_settings ( netdev_settings ( netdev ) );
@ -879,9 +879,6 @@ void netdev_close ( struct net_device *netdev ) {
/* Close the device */ /* Close the device */
netdev->op->close ( netdev ); netdev->op->close ( netdev );
/* Stop link block timer */
stop_timer ( &netdev->link_block );
/* Flush TX and RX queues */ /* Flush TX and RX queues */
netdev_tx_flush ( netdev ); netdev_tx_flush ( netdev );
netdev_rx_flush ( netdev ); netdev_rx_flush ( netdev );

View File

@ -4,7 +4,6 @@
set -e set -e
set -u set -u
set -x
# Print usage message # Print usage message
# #
@ -18,58 +17,28 @@ help() {
echo " -s SCRIPT use executable script" echo " -s SCRIPT use executable script"
} }
# Get big-endian hex value from binary file
#
get_be() {
local FILENAME
local OFFSET
local LEN
FILENAME="${1}"
OFFSET="${2}"
LEN="${3}"
od -j "${OFFSET}" -N "${LEN}" -A n -t x1 -- "${FILENAME}" | tr -d " "
}
# Get little-endian hex value from binary file
#
get_le() {
local FILENAME
local OFFSET
local LEN
local BYTE
local VALUE
FILENAME="${1}"
OFFSET="${2}"
LEN="${3}"
VALUE=""
while [ "${LEN}" -gt 0 ] ; do
LEN=$(( "${LEN}" - 1 ))
BYTE=$(get_be "${FILENAME}" $(( "${OFFSET}" + "${LEN}" )) 1)
VALUE="${VALUE}${BYTE}"
done
echo "${VALUE}"
}
# Get hex byte from binary file # Get hex byte from binary file
# #
get_byte() { get_byte() {
get_be "${1}" "${2}" 1 local FILENAME
local OFFSET
FILENAME="${1}"
OFFSET="${2}"
od -j "${OFFSET}" -N 1 -A n -t x1 -- "${FILENAME}" | tr -d " "
} }
# Get little-endian hex word from binary file # Get hex word from binary file
# #
get_word() { get_word() {
get_le "${1}" "${2}" 2 local FILENAME
} local OFFSET
# Get little-endian hex dword from binary file FILENAME="${1}"
# OFFSET="${2}"
get_dword() {
get_le "${1}" "${2}" 4 od -j "${OFFSET}" -N 2 -A n -t x1 -- "${FILENAME}" | tr -d " "
} }
# Get appropriate EFI boot filename for CPU architecture # Get appropriate EFI boot filename for CPU architecture
@ -82,31 +51,31 @@ efi_boot_name() {
FILENAME="${1}" FILENAME="${1}"
MZSIG=$(get_word "${FILENAME}" 0) MZSIG=$(get_word "${FILENAME}" 0)
if [ "${MZSIG}" != "5a4d" ] ; then if [ "${MZSIG}" != "4d5a" ] ; then
echo "${FILENAME}: invalid MZ header" >&2 echo "${FILENAME}: invalid MZ header" >&2
exit 1 exit 1
fi fi
PEOFF=$(get_byte "${FILENAME}" 0x3c) PEOFF=$(get_byte "${FILENAME}" 0x3c)
PESIG=$(get_word "${FILENAME}" 0x${PEOFF}) PESIG=$(get_word "${FILENAME}" 0x${PEOFF})
if [ "${PESIG}" != "4550" ] ; then if [ "${PESIG}" != "5045" ] ; then
echo "${FILENAME}: invalid PE header" >&2 echo "${FILENAME}: invalid PE header" >&2
exit 1 exit 1
fi fi
ARCH=$(get_word "${FILENAME}" $(( 0x${PEOFF} + 4 )) ) ARCH=$(get_word "${FILENAME}" $(( 0x${PEOFF} + 4 )) )
case "${ARCH}" in case "${ARCH}" in
"014c" ) "4c01" )
echo "BOOTIA32.EFI" echo "BOOTIA32.EFI"
;; ;;
"8664" ) "6486" )
echo "BOOTX64.EFI" echo "BOOTX64.EFI"
;; ;;
"01c2" ) "c201" )
echo "BOOTARM.EFI" echo "BOOTARM.EFI"
;; ;;
"6264" ) "6462" )
echo "BOOTLOONGARCH64.EFI" echo "BOOTLOONGARCH64.EFI"
;; ;;
"aa64" ) "64aa" )
echo "BOOTAA64.EFI" echo "BOOTAA64.EFI"
;; ;;
* ) * )
@ -148,28 +117,6 @@ copy_syslinux_file() {
return 1 return 1
} }
# Create EFI boot partition
#
create_esp() {
local FILENAME
local BOOTCAT
local PLATFORM
local START
local COUNT
FILENAME="${1}"
BOOTCAT=$(( 0x$(get_dword "${FILENAME}" 0x8847) * 0x800 ))
PLATFORM=$(get_byte "${FILENAME}" $(( ${BOOTCAT} + 0x01 )) )
if [ "${PLATFORM}" != "ef" ] ; then
echo "${FILENAME}: missing EFI boot catalog" >&2
exit 1
fi
START=$(( 0x$(get_dword "${FILENAME}" $(( ${BOOTCAT} + 0x28 )) ) * 4 ))
COUNT=$(( 0x$(get_word "${FILENAME}" $(( ${BOOTCAT} + 0x26 )) ) * 4 ))
echo "${START},${COUNT},0xef;" | sfdisk -f -w never "${FILENAME}"
}
# Parse command-line options # Parse command-line options
# #
OUTFILE= OUTFILE=
@ -287,17 +234,12 @@ done
# #
if [ -n "${ISOIMG}" ] ; then if [ -n "${ISOIMG}" ] ; then
ISOARGS="-J -R -l" ISOARGS="-J -R -l"
if [ -n "${LKRN}" ] ; then copy_syslinux_file "isolinux.bin" "${ISODIR}"
copy_syslinux_file "isolinux.bin" "${ISODIR}" copy_syslinux_file "ldlinux.c32" "${ISODIR}" 2>/dev/null || true
copy_syslinux_file "ldlinux.c32" "${ISODIR}" 2>/dev/null || true ISOARGS="${ISOARGS} -no-emul-boot -eltorito-boot isolinux.bin"
ISOARGS="${ISOARGS} -no-emul-boot -eltorito-boot isolinux.bin" ISOARGS="${ISOARGS} -boot-load-size 4 -boot-info-table"
ISOARGS="${ISOARGS} -boot-load-size 4 -boot-info-table"
fi
if [ -n "${LKRN}" -a -n "${EFI}" ] ; then
ISOARGS="${ISOARGS} -eltorito-alt-boot"
fi
if [ -n "${EFI}" ] ; then if [ -n "${EFI}" ] ; then
ISOARGS="${ISOARGS} -no-emul-boot -e esp.img" ISOARGS="${ISOARGS} -eltorito-alt-boot -no-emul-boot -e esp.img"
else else
FATIMG= FATIMG=
fi fi
@ -367,7 +309,6 @@ if [ -n "${ISOIMG}" ] ; then
-appid "iPXE - Open Source Network Boot Firmware" \ -appid "iPXE - Open Source Network Boot Firmware" \
-publisher "ipxe.org" -sysid "iPXE" -o "${ISOIMG}" \ -publisher "ipxe.org" -sysid "iPXE" -o "${ISOIMG}" \
${ISOARGS} "${ISODIR}" ${ISOARGS} "${ISODIR}"
create_esp "${ISOIMG}"
if isohybrid --version >/dev/null 2>&1 ; then if isohybrid --version >/dev/null 2>&1 ; then
ISOHYBRIDARGS= ISOHYBRIDARGS=
if [ -n "${EFI}" ] ; then if [ -n "${EFI}" ] ; then