53 #define NBI_MAGIC 0x1B031336UL 56 #define NBI_NONVENDOR_LENGTH(len) ( ( (len) & 0x0f ) << 2 ) 57 #define NBI_VENDOR_LENGTH(len) ( ( (len) & 0xf0 ) >> 2 ) 58 #define NBI_LENGTH(len) ( NBI_NONVENDOR_LENGTH(len) + NBI_VENDOR_LENGTH(len) ) 61 #define NBI_PROGRAM_RETURNS(flags) ( (flags) & ( 1 << 8 ) ) 62 #define NBI_LINEAR_EXEC_ADDR(flags) ( (flags) & ( 1 << 31 ) ) 65 #define NBI_HEADER_LENGTH 512 85 #define NBI_LOADADDR_FLAGS(flags) ( (flags) & 0x03 ) 86 #define NBI_LOADADDR_ABS 0x00 87 #define NBI_LOADADDR_AFTER 0x01 88 #define NBI_LOADADDR_END 0x02 89 #define NBI_LOADADDR_BEFORE 0x03 90 #define NBI_LAST_SEGHEADER(flags) ( (flags) & ( 1 << 2 ) ) 113 DBGC (
image,
"NBI %p could not prepare segment: %s\n",
176 DBGC (
image,
"NBI %p invalid segheader length 0\n",
213 filesz, memsz ) ) != 0 ) {
228 DBGC (
image,
"NBI %p length wrong (file %zd, metadata %zd)\n",
246 DBGC (
image,
"NBI %p executing 16-bit image at %04x:%04x\n",
image,
281 struct ebinfo loaderinfo = {
288 DBGC (
image,
"NBI %p executing 32-bit image at %lx\n",
298 "addl $12, %%esp\n\t" 307 :
"ecx",
"edx",
"memory" );
323 if ( ! boot_netdev ) {
324 DBGC (
image,
"NBI %p could not identify a network device\n",
385 if ( ! may_return ) {
387 DBGC (
image,
"NBI %p returned %d from non-returnable image\n",
#define PHYS_CODE(asm_code_str)
struct arbelprm_rc_send_wqe rc
userptr_t data
Raw file image.
#define NBI_LOADADDR_AFTER
static int nbi_boot32(struct image *image, struct imgheader *imgheader)
Boot a 32-bit NBI image.
#define ENOEXEC
Exec format error.
static __always_inline void copy_from_user(void *dest, userptr_t src, off_t src_off, size_t len)
Copy data from user buffer.
int create_fakedhcpack(struct net_device *netdev, void *data, size_t max_len)
Create fake DHCPACK packet.
An executable image type.
#define PROBE_NORMAL
Normal image probe priority.
userptr_t phys_to_user(unsigned long phys_addr)
Convert physical address to user pointer.
#define DHCP_EB_FEATURE_NBI
NBI format.
#define FEATURE_IMAGE
Image formats.
#define NBI_LOADADDR_FLAGS(flags)
static __always_inline unsigned long virt_to_phys(volatile const void *addr)
Convert virtual address to a physical address.
Access to external ("user") memory.
#define NBI_LAST_SEGHEADER(flags)
#define NBI_LOADADDR_BEFORE
char * name
Name of this image type.
Executable image segments.
userptr_t userptr_add(userptr_t userptr, off_t offset)
Add offset to user pointer.
#define NBI_HEADER_LENGTH
NBI header length.
static int nbi_boot16(struct image *image, struct imgheader *imgheader)
Boot a 16-bit NBI image.
uint32_t userptr_t
A pointer to a user buffer.
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
int prep_segment(userptr_t segment, size_t filesz, size_t memsz)
Prepare segment for loading.
#define NBI_PROGRAM_RETURNS(flags)
static int nbi_prepare_dhcp(struct image *image)
Prepare DHCP parameter block for NBI image.
#define __unused
Declare a variable or data structure as unused.
unsigned int extmemsize(void)
Get size of extended memory.
#define NBI_LINEAR_EXEC_ADDR(flags)
static int nbi_probe(struct image *image)
Probe NBI image.
struct net_device * last_opened_netdev(void)
Get most recently opened network device.
char * strerror(int errno)
Retrieve string representation of error number.
size_t len
Length of raw file image.
static int nbi_prepare_segment(struct image *image, size_t offset __unused, userptr_t dest, size_t filesz, size_t memsz)
Prepare a segment for an NBI image.
__asm__ __volatile__("call *%9" :"=a"(result), "=c"(discard_ecx), "=d"(discard_edx) :"d"(0), "a"(code), "b"(0), "c"(in_phys), "D"(0), "S"(out_phys), "m"(hypercall))
#define ENODEV
No such device.
Network device management.
const int product_major_version
Product major version.
__asm__(".section \".rodata\", \"a\", " PROGBITS "\n\t" "\nprivate_key_data:\n\t" ".size private_key_data, ( . - private_key_data )\n\t" ".equ private_key_len, ( . - private_key_data )\n\t" ".previous\n\t")
static int nbi_load_segment(struct image *image, size_t offset, userptr_t dest, size_t filesz, size_t memsz __unused)
Load a segment for an NBI image.
#define __from_data16(pointer)
static int nbi_exec(struct image *image)
Execute a loaded NBI image.
if(len >=6 *4) __asm__ __volatile__("movsl" if(len >=5 *4) __asm__ __volatile__("movsl" if(len >=4 *4) __asm__ __volatile__("movsl" if(len >=3 *4) __asm__ __volatile__("movsl" if(len >=2 *4) __asm__ __volatile__("movsl" if(len >=1 *4) __asm__ __volatile__("movsl" if((len % 4) >=2) __asm__ __volatile__("movsw" if((len % 2) >=1) __asm__ __volatile__("movsb" return dest
FEATURE(FEATURE_IMAGE, "NBI", DHCP_EB_FEATURE_NBI, 1)
static __always_inline userptr_t real_to_user(unsigned int segment, unsigned int offset)
Convert segment:offset address to user buffer.
uint16_t offset
Offset to command line.
static int nbi_process_segments(struct image *image, struct imgheader *imgheader, int(*process)(struct image *image, size_t offset, userptr_t dest, size_t filesz, size_t memsz))
Process segments of an NBI image.
static void shutdown_boot(void)
Shut down system for OS boot.
#define REAL_CODE(asm_code_str)
const int product_minor_version
Product minor version.
struct image_type nbi_image_type __image_type(PROBE_NORMAL)
NBI image type.
void memcpy_user(userptr_t dest, off_t dest_off, userptr_t src, off_t src_off, size_t len)
Copy data between user buffers.
#define NBI_MAGIC
NBI magic number.