diff options
| author | Matt Fleming <matt.fleming@intel.com> | 2012-07-27 10:41:30 +0100 |
|---|---|---|
| committer | Matt Fleming <matt.fleming@intel.com> | 2012-07-30 09:51:36 +0100 |
| commit | 0d6f330878173c7ba45b884f3e41ce40b917c73c (patch) | |
| tree | 0a887066d35d8b01914330d6ab6818fe015a5a9d /com32/include/syslinux | |
| parent | 0fcd9a48603497dcc2727570a50a4401bb0fd085 (diff) | |
| parent | f0bbf9dd40f37f8c4870a33784996efd56955a75 (diff) | |
| download | syslinux-0d6f330878173c7ba45b884f3e41ce40b917c73c.tar.gz | |
Merge remote-tracking branch 'mfleming/elflink' into for-hpa/elflink/firmware
Conflicts:
Makefile
com32/elflink/ldlinux/adv.c
com32/elflink/ldlinux/kernel.c
com32/elflink/ldlinux/ldlinux.c
com32/include/bitsize/stddef.h
com32/include/bitsize/stdint.h
com32/include/stdint.h
com32/include/sys/module.h
com32/include/sys/x86_64/bitops.h
com32/include/syslinux/linux.h
com32/lib/Makefile
com32/lib/sys/ansicon_write.c
com32/lib/sys/module/elfutils.h
com32/lib/sys/vesa/efi/fill.h
com32/lib/syslinux/load_linux.c
com32/lib/syslinux/serial.c
com32/lib/syslinux/shuffle.c
core/conio.c
core/elflink/config.c
core/elflink/load_env32.c
core/graphics.c
core/include/graphics.h
core/init.c
core/pxelinux.asm
mk/elf.mk
mk/lib.mk
Diffstat (limited to 'com32/include/syslinux')
| -rw-r--r-- | com32/include/syslinux/boot.h | 12 | ||||
| -rw-r--r-- | com32/include/syslinux/config.h | 9 | ||||
| -rw-r--r-- | com32/include/syslinux/disk.h | 180 | ||||
| -rw-r--r-- | com32/include/syslinux/features.h | 10 | ||||
| -rw-r--r-- | com32/include/syslinux/firmware.h | 12 | ||||
| -rw-r--r-- | com32/include/syslinux/linux.h | 29 | ||||
| -rw-r--r-- | com32/include/syslinux/movebits.h | 9 | ||||
| -rw-r--r-- | com32/include/syslinux/pxe_api.h | 4 |
8 files changed, 249 insertions, 16 deletions
diff --git a/com32/include/syslinux/boot.h b/com32/include/syslinux/boot.h index 21bea01a..aea32d9c 100644 --- a/com32/include/syslinux/boot.h +++ b/com32/include/syslinux/boot.h @@ -40,7 +40,7 @@ int syslinux_run_command(const char *); __noreturn syslinux_run_default(void); -void syslinux_local_boot(uint16_t flags); +void syslinux_local_boot(int16_t flags); void syslinux_final_cleanup(uint16_t flags); @@ -48,6 +48,13 @@ void syslinux_chain_bootstrap(uint16_t flags, const void *bootstrap, uint32_t bootstrap_len, uint32_t edx, uint32_t esi, uint16_t ds); +struct image_types { + const char *name; + uint32_t type; +}; + +extern const struct image_types image_boot_types[]; + #define IMAGE_TYPE_KERNEL 0 #define IMAGE_TYPE_LINUX 1 #define IMAGE_TYPE_BOOT 2 @@ -57,6 +64,9 @@ void syslinux_chain_bootstrap(uint16_t flags, const void *bootstrap, #define IMAGE_TYPE_COMBOOT 6 #define IMAGE_TYPE_COM32 7 #define IMAGE_TYPE_CONFIG 8 +#define IMAGE_TYPE_LOCALBOOT 9 + +uint32_t parse_image_type(const char *cmdline); void syslinux_run_kernel_image(const char *filename, const char *cmdline, uint32_t ipappend_flags, uint32_t type); diff --git a/com32/include/syslinux/config.h b/com32/include/syslinux/config.h index 79a4750e..7bdcdd6b 100644 --- a/com32/include/syslinux/config.h +++ b/com32/include/syslinux/config.h @@ -164,10 +164,10 @@ static inline const struct syslinux_serial_console_info return &__syslinux_serial_console_info; } -extern __nocommon const char *__syslinux_config_file; +extern char ConfigName[]; static inline const char *syslinux_config_file(void) { - return __syslinux_config_file; + return ConfigName; } struct syslinux_ipappend_strings { @@ -181,4 +181,9 @@ static inline const struct syslinux_ipappend_strings return &__syslinux_ipappend_strings; } +static inline enum syslinux_filesystem syslinux_filesystem(void) +{ + return syslinux_derivative_info()->c.filesystem; +} + #endif /* _SYSLINUX_CONFIG_H */ diff --git a/com32/include/syslinux/disk.h b/com32/include/syslinux/disk.h new file mode 100644 index 00000000..f96ca686 --- /dev/null +++ b/com32/include/syslinux/disk.h @@ -0,0 +1,180 @@ +/* ----------------------------------------------------------------------- * + * + * Copyright 2003-2009 H. Peter Anvin - All Rights Reserved + * Copyright 2009-2010 Intel Corporation; author: H. Peter Anvin + * Copyright (C) 2010 Shao Miller + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall + * be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * ----------------------------------------------------------------------- */ + +/** + * @file syslinux/disk.h + * + * Deal with disks and partitions + */ + +#ifndef _SYSLINUX_DISK_H +#define _SYSLINUX_DISK_H + +#include <com32.h> +#include <stdint.h> + +#define SECTOR 512u /* bytes/sector */ + +struct disk_info { + int disk; + int ebios; /* EBIOS supported on this disk */ + int cbios; /* CHS geometry is valid */ + uint32_t bps; /* bytes per sector */ + uint64_t lbacnt; /* total amount of sectors */ + uint32_t cyl; + uint32_t head; + uint32_t spt; +}; + +struct disk_ebios_dapa { + uint16_t len; + uint16_t count; + uint16_t off; + uint16_t seg; + uint64_t lba; +} __attribute__ ((packed)); + +struct disk_ebios_eparam { + uint16_t len; + uint16_t info; + uint32_t cyl; + uint32_t head; + uint32_t spt; + uint64_t lbacnt; + uint16_t bps; /* bytes per sector */ + uint32_t edd; + uint16_t dpi_sig; + uint8_t dpi_len; + char reserved1[3]; + char hostbus[4]; + char if_type[8]; + char if_path[8]; + char dev_path[8]; + char reserved2; + uint8_t checksum; +} __attribute__ ((packed)); + +/** + * CHS (cylinder, head, sector) value extraction macros. + * Taken from WinVBlock. None expand to an lvalue. +*/ +#define chs_head(chs) chs[0] +#define chs_sector(chs) (chs[1] & 0x3F) +#define chs_cyl_high(chs) (((uint16_t)(chs[1] & 0xC0)) << 2) +#define chs_cyl_low(chs) ((uint16_t)chs[2]) +#define chs_cylinder(chs) (chs_cyl_high(chs) | chs_cyl_low(chs)) +typedef uint8_t disk_chs[3]; + +/* A DOS partition table entry */ +struct disk_dos_part_entry { + uint8_t active_flag; /* 0x80 if "active" */ + disk_chs start; + uint8_t ostype; + disk_chs end; + uint32_t start_lba; + uint32_t length; +} __attribute__ ((packed)); + +/* A DOS MBR */ +struct disk_dos_mbr { + char code[440]; + uint32_t disk_sig; + char pad[2]; + struct disk_dos_part_entry table[4]; + uint16_t sig; +} __attribute__ ((packed)); +#define disk_mbr_sig_magic 0xAA55 + +/** + * A GPT disk/partition GUID + * + * Be careful with endianness, you must adjust it yourself + * iff you are directly using the fourth data chunk. + * There might be a better header for this... + */ +struct guid { + uint32_t data1; + uint16_t data2; + uint16_t data3; + uint64_t data4; +} __attribute__ ((packed)); + +/* A GPT partition */ +struct disk_gpt_part_entry { + struct guid type; + struct guid uid; + uint64_t lba_first; + uint64_t lba_last; + uint64_t attribs; + char name[72]; +} __attribute__ ((packed)); + +/* A GPT header */ +struct disk_gpt_header { + char sig[8]; + union { + struct { + uint16_t minor; + uint16_t major; + } fields __attribute__ ((packed)); + uint32_t uint32; + char raw[4]; + } rev __attribute__ ((packed)); + uint32_t hdr_size; + uint32_t chksum; + char reserved1[4]; + uint64_t lba_cur; + uint64_t lba_alt; + uint64_t lba_first_usable; + uint64_t lba_last_usable; + struct guid disk_guid; + uint64_t lba_table; + uint32_t part_count; + uint32_t part_size; + uint32_t table_chksum; + char reserved2[1]; +} __attribute__ ((packed)); +static const char disk_gpt_sig_magic[] = "EFI PART"; + +extern int disk_int13_retry(const com32sys_t * inreg, com32sys_t * outreg); +extern int disk_get_params(int disk, struct disk_info *const diskinfo); +extern void *disk_read_sectors(const struct disk_info *const diskinfo, + uint64_t lba, uint8_t count); +extern int disk_write_sectors(const struct disk_info *const diskinfo, + uint64_t lba, const void *data, uint8_t count); +extern int disk_write_verify_sectors(const struct disk_info *const diskinfo, + uint64_t lba, const void *buf, uint8_t count); +extern void disk_dos_part_dump(const struct disk_dos_part_entry *const part); +extern void guid_to_str(char *buf, const struct guid *const id); +extern int str_to_guid(const char *buf, struct guid *const id); +extern void disk_gpt_part_dump(const struct disk_gpt_part_entry *const + gpt_part); +extern void disk_gpt_header_dump(const struct disk_gpt_header *const gpt); + +#endif /* _SYSLINUX_DISK_H */ diff --git a/com32/include/syslinux/features.h b/com32/include/syslinux/features.h index 4bebda49..d25d08d5 100644 --- a/com32/include/syslinux/features.h +++ b/com32/include/syslinux/features.h @@ -31,18 +31,16 @@ #define SYSLINUX_FEATURE_LOCAL_BOOT (0*8+0) #define SYSLINUX_FEATURE_NOOP_IDLE (0*8+1) -extern struct __syslinux_feature_flags { - unsigned int len; - const unsigned char *ptr; -} __syslinux_feature_flags; +extern uint8_t feature_flags; +extern uint8_t feature_flags_len; static inline int syslinux_has_feature(unsigned int __flag) { unsigned int __byte = __flag >> 3; unsigned int __bit = __flag & 7; - if (__byte <= __syslinux_feature_flags.len) - return (__syslinux_feature_flags.ptr[__byte] >> __bit) & 1; + if (__byte <= feature_flags_len) + return (feature_flags[__byte] >> __bit) & 1; else return 0; } diff --git a/com32/include/syslinux/firmware.h b/com32/include/syslinux/firmware.h index 456ba662..05f97630 100644 --- a/com32/include/syslinux/firmware.h +++ b/com32/include/syslinux/firmware.h @@ -3,10 +3,12 @@ #include <syslinux/memscan.h> +struct term_state; + struct output_ops { void (*erase) (int, int, int, int, uint8_t); void (*write_char) (uint8_t, uint8_t); - void (*showcursor) (uint16_t); + void (*showcursor) (const struct term_state *); void (*scroll_up) (uint8_t, uint8_t, uint8_t); void (*set_cursor) (int, int, bool); void (*beep) (void); @@ -16,7 +18,8 @@ struct output_ops { }; struct input_ops { - char (*getchar)(void); + char (*getchar)(char *); + int (*pollchar)(void); }; struct adv_ops { @@ -26,6 +29,7 @@ struct adv_ops { struct disk_private; struct initramfs; +struct setup_data; struct firmware { void (*init)(void); @@ -35,11 +39,11 @@ struct firmware { struct disk *(*disk_init)(void *); struct output_ops *o_ops; struct input_ops *i_ops; - char *(*get_config_file_name)(void); void (*get_serial_console_info)(uint16_t *, uint16_t *, uint16_t *); bool (*ipappend_strings)(char **, int *); struct adv_ops *adv_ops; - int (*boot_linux)(void *, size_t, struct initramfs *, char *); + int (*boot_linux)(void *, size_t, struct initramfs *, + struct setup_data *, char *); }; extern struct firmware *firmware; diff --git a/com32/include/syslinux/linux.h b/com32/include/syslinux/linux.h index abc71dc1..a8c6f2f5 100644 --- a/com32/include/syslinux/linux.h +++ b/com32/include/syslinux/linux.h @@ -1,6 +1,7 @@ /* ----------------------------------------------------------------------- * * * Copyright 2007-2008 H. Peter Anvin - All Rights Reserved + * Copyright 2012 Intel Corporation; author: H. Peter Anvin * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation @@ -52,6 +53,22 @@ struct initramfs { }; #define INITRAMFS_MAX_ALIGN 4096 +struct setup_data_header { + uint64_t next; + uint32_t type; + uint32_t len; +} __packed; + +struct setup_data { + struct setup_data *prev, *next; + const void *data; + struct setup_data_header hdr; +}; + +#define SETUP_NONE 0 +#define SETUP_E820_EXT 1 +#define SETUP_DTB 2 + struct linux_header { uint8_t boot_sector_1[0x0020]; uint16_t old_cmd_line_magic; @@ -134,7 +151,9 @@ struct screen_info { } __packed; int syslinux_boot_linux(void *kernel_buf, size_t kernel_size, - struct initramfs *initramfs, char *cmdline); + struct initramfs *initramfs, + struct setup_data *setup_data, + char *cmdline); /* Initramfs manipulation functions */ @@ -169,4 +188,12 @@ static inline uint32_t initramfs_size(struct initramfs *initramfs) return size; } +/* Setup data manipulation functions */ + +struct setup_data *setup_data_init(void); +int setup_data_add(struct setup_data *head, uint32_t type, + const void *data, size_t data_len); +int setup_data_load(struct setup_data *head, uint32_t type, + const char *filename); + #endif /* _SYSLINUX_LINUX_H */ diff --git a/com32/include/syslinux/movebits.h b/com32/include/syslinux/movebits.h index 54ee7ff9..8bcdf3ed 100644 --- a/com32/include/syslinux/movebits.h +++ b/com32/include/syslinux/movebits.h @@ -83,7 +83,12 @@ int syslinux_memmap_find(struct syslinux_memmap *list, addr_t * start, addr_t * len, addr_t align); /* Debugging functions */ -void syslinux_dump_movelist(FILE * file, struct syslinux_movelist *ml); -void syslinux_dump_memmap(FILE * file, struct syslinux_memmap *memmap); +#ifdef DEBUG +void syslinux_dump_movelist(struct syslinux_movelist *ml); +void syslinux_dump_memmap(struct syslinux_memmap *memmap); +#else +#define syslinux_dump_movelist(x) ((void)0) +#define syslinux_dump_memmap(x) ((void)0) +#endif #endif /* _SYSLINUX_MOVEBITS_H */ diff --git a/com32/include/syslinux/pxe_api.h b/com32/include/syslinux/pxe_api.h index 27166b0b..203ab38f 100644 --- a/com32/include/syslinux/pxe_api.h +++ b/com32/include/syslinux/pxe_api.h @@ -568,4 +568,8 @@ typedef struct s_PXENV_UNLOAD_STACK { #define PXENV_STATUS_LOADER_UNDI_START 0xca #define PXENV_STATUS_LOADER_BC_START 0xcb +int __weak pxe_call(int, void *); +void __weak unload_pxe(uint16_t flags); +uint32_t __weak dns_resolv(const char *); + #endif /* _SYSLINUX_PXE_API_H */ |
