[e16e8f2] | 1 | /* ----------------------------------------------------------------------- * |
---|
| 2 | * |
---|
| 3 | * Copyright 2001-2008 H. Peter Anvin - All Rights Reserved |
---|
| 4 | * |
---|
| 5 | * This program is free software; you can redistribute it and/or modify |
---|
| 6 | * it under the terms of the GNU General Public License as published by |
---|
| 7 | * the Free Software Foundation, Inc., 53 Temple Place Ste 330, |
---|
| 8 | * Boston MA 02111-1307, USA; either version 2 of the License, or |
---|
| 9 | * (at your option) any later version; incorporated herein by reference. |
---|
| 10 | * |
---|
| 11 | * ----------------------------------------------------------------------- */ |
---|
| 12 | |
---|
| 13 | /* |
---|
| 14 | * memdisk.h |
---|
| 15 | * |
---|
| 16 | * Miscellaneous header definitions |
---|
| 17 | */ |
---|
| 18 | |
---|
| 19 | #ifndef MEMDISK_H |
---|
| 20 | #define MEMDISK_H |
---|
| 21 | |
---|
| 22 | #include <stddef.h> |
---|
| 23 | |
---|
| 24 | /* We use the com32 interface for calling 16-bit code */ |
---|
| 25 | #include <com32.h> |
---|
| 26 | |
---|
| 27 | /* define it only for i386 */ |
---|
| 28 | #if __SIZEOF_POINTER__ == 4 |
---|
| 29 | #define __cdecl __attribute__((cdecl,regparm(0))) |
---|
| 30 | #endif |
---|
| 31 | |
---|
| 32 | void __cdecl intcall(uint8_t, com32sys_t *, com32sys_t *); |
---|
| 33 | |
---|
| 34 | /* Structure passed in from the real-mode code */ |
---|
| 35 | struct real_mode_args { |
---|
| 36 | uint32_t rm_return; |
---|
| 37 | uint32_t rm_intcall; |
---|
| 38 | uint32_t rm_bounce; |
---|
| 39 | uint32_t rm_base; |
---|
| 40 | uint32_t rm_handle_interrupt; |
---|
| 41 | uint32_t rm_gdt; |
---|
| 42 | uint32_t rm_size; |
---|
| 43 | uint32_t rm_pmjmp; |
---|
| 44 | uint32_t rm_rmjmp; |
---|
| 45 | }; |
---|
| 46 | extern struct real_mode_args rm_args; |
---|
| 47 | #define sys_bounce ((void *)rm_args.rm_bounce) |
---|
| 48 | |
---|
| 49 | /* This is the header in the boot sector/setup area */ |
---|
| 50 | struct setup_header { |
---|
| 51 | char cmdline[0x1f1]; |
---|
| 52 | uint8_t setup_secs; |
---|
| 53 | uint16_t syssize; |
---|
| 54 | uint16_t swap_dev; |
---|
| 55 | uint16_t ram_size; |
---|
| 56 | uint16_t vid_mode; |
---|
| 57 | uint16_t root_dev; |
---|
| 58 | uint16_t boot_flag; |
---|
| 59 | uint16_t jump; |
---|
| 60 | char header[4]; |
---|
| 61 | uint16_t version; |
---|
| 62 | uint32_t realmode_swtch; |
---|
| 63 | uint32_t start_sys; |
---|
| 64 | uint8_t type_of_loader; |
---|
| 65 | uint8_t loadflags; |
---|
| 66 | uint16_t setup_move_size; |
---|
| 67 | uint32_t code32_start; |
---|
| 68 | uint32_t ramdisk_image; |
---|
| 69 | uint32_t ramdisk_size; |
---|
| 70 | uint32_t bootsect_kludge; |
---|
| 71 | uint16_t head_end_ptr; |
---|
| 72 | uint16_t pad1; |
---|
| 73 | uint32_t cmd_line_ptr; |
---|
| 74 | uint32_t initrd_addr_max; |
---|
| 75 | uint32_t esdi; |
---|
| 76 | uint32_t edx; |
---|
| 77 | uint32_t sssp; |
---|
| 78 | uint32_t csip; |
---|
| 79 | }; |
---|
| 80 | #define shdr ((struct setup_header *)rm_args.rm_base) |
---|
| 81 | |
---|
| 82 | /* Standard routines */ |
---|
| 83 | void *memcpy(void *, const void *, size_t); |
---|
| 84 | void *memset(void *, int, size_t); |
---|
| 85 | void *memmove(void *, const void *, size_t); |
---|
| 86 | |
---|
| 87 | #define strcpy(a,b) __builtin_strcpy(a,b) |
---|
| 88 | |
---|
| 89 | static inline size_t strlen(const char *__a) |
---|
| 90 | { |
---|
| 91 | const char *__D; |
---|
| 92 | size_t __c; |
---|
| 93 | |
---|
| 94 | asm("repne;scasb":"=D"(__D), "=c"(__c) |
---|
| 95 | : "D"(__a), "c"(-1), "a"(0), "m"(*__a)); |
---|
| 96 | |
---|
| 97 | return __D - __a - 1; |
---|
| 98 | } |
---|
| 99 | |
---|
| 100 | /* memcpy() but returns a pointer to end of buffer */ |
---|
| 101 | static inline void *mempcpy(void *__d, const void *__s, unsigned int __n) |
---|
| 102 | { |
---|
| 103 | memcpy(__d, __s, __n); |
---|
| 104 | return (void *)((char *)__d + __n); |
---|
| 105 | } |
---|
| 106 | |
---|
| 107 | /* memcmp() */ |
---|
| 108 | static inline int memcmp(const void *__a, const void *__b, unsigned int __n) |
---|
| 109 | { |
---|
| 110 | const unsigned char *__aa = __a; |
---|
| 111 | const unsigned char *__bb = __b; |
---|
| 112 | int __d; |
---|
| 113 | |
---|
| 114 | while (__n--) { |
---|
| 115 | __d = *__bb++ - *__aa++; |
---|
| 116 | if (__d) |
---|
| 117 | return __d; |
---|
| 118 | } |
---|
| 119 | |
---|
| 120 | return 0; |
---|
| 121 | } |
---|
| 122 | |
---|
| 123 | static inline void sti(void) |
---|
| 124 | { |
---|
| 125 | asm volatile("sti"); |
---|
| 126 | } |
---|
| 127 | |
---|
| 128 | static inline void cli(void) |
---|
| 129 | { |
---|
| 130 | asm volatile("cli"); |
---|
| 131 | } |
---|
| 132 | |
---|
| 133 | /* Decompression */ |
---|
| 134 | extern int check_zip(void *indata, uint32_t size, uint32_t * zbytes_p, |
---|
| 135 | uint32_t * dbytes_p, uint32_t * orig_crc, |
---|
| 136 | uint32_t * offset_p); |
---|
| 137 | extern void *unzip(void *indata, uint32_t zbytes, uint32_t dbytes, |
---|
| 138 | uint32_t orig_crc, void *target); |
---|
| 139 | |
---|
| 140 | #endif |
---|