wok annotate gpxe/stuff/default_boot.u @ rev 1002

gpxe: fix floppy bot
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sun Jul 06 18:15:46 2008 +0000 (2008-07-06)
parents da7eea2e2d10
children e591dc06c14f
rev   line source
pascal@1001 1 --- gpxe-0.9.3/src/arch/i386/interface/pxe/pxe_call.c
pascal@1001 2 +++ gpxe-0.9.3/src/arch/i386/interface/pxe/pxe_call.c
pascal@1001 3 @@ -96,6 +96,8 @@
pascal@1001 4 PXENV_EXIT_t ( * file_select ) ( struct s_PXENV_FILE_SELECT * );
pascal@1001 5 PXENV_EXIT_t ( * file_read ) ( struct s_PXENV_FILE_READ * );
pascal@1001 6 PXENV_EXIT_t ( * get_file_size ) ( struct s_PXENV_GET_FILE_SIZE * );
pascal@1001 7 + PXENV_EXIT_t ( * file_exec ) ( struct s_PXENV_FILE_EXEC * );
pascal@1001 8 + PXENV_EXIT_t ( * file_api_check ) ( struct s_PXENV_FILE_API_CHECK * );
pascal@1001 9 };
pascal@1001 10
pascal@1001 11 /**
pascal@1001 12 @@ -294,6 +296,14 @@
pascal@1001 13 pxenv_call.get_file_size = pxenv_get_file_size;
pascal@1001 14 param_len = sizeof ( pxenv_any.get_file_size );
pascal@1001 15 break;
pascal@1001 16 + case PXENV_FILE_EXEC:
pascal@1001 17 + pxenv_call.file_exec = pxenv_file_exec;
pascal@1001 18 + param_len = sizeof ( pxenv_any.file_exec );
pascal@1001 19 + break;
pascal@1001 20 + case PXENV_FILE_API_CHECK:
pascal@1001 21 + pxenv_call.file_api_check = pxenv_file_api_check;
pascal@1001 22 + param_len = sizeof ( pxenv_any.file_api_check );
pascal@1001 23 + break;
pascal@1001 24 default:
pascal@1001 25 DBG ( "PXENV_UNKNOWN_%hx", opcode );
pascal@1001 26 pxenv_call.unknown = pxenv_unknown;
pascal@1001 27
pascal@962 28 --- gpxe-0.9.3/src/arch/i386/prefix/lkrnprefix.S
pascal@962 29 +++ gpxe-0.9.3/src/arch/i386/prefix/lkrnprefix.S
pascal@1001 30 @@ -441,6 +441,8 @@
pascal@962 31 /* Calculated lcall to _start with %cs:0000 = image start */
pascal@962 32 lret
pascal@962 33
pascal@962 34 +boot_url:
pascal@1001 35 + .space 256, 0
pascal@962 36
pascal@962 37 .org PREFIXSIZE
pascal@962 38 /*
pascal@1002 39 @@ -453,6 +457,13 @@
pascal@962 40 movw %bx, %ss
pascal@962 41 movw $_estack16, %sp
pascal@962 42
pascal@962 43 + /* Copy our boot_url structure to the forced_url variable */
pascal@1002 44 + push %cs
pascal@1002 45 + pop %ds
pascal@962 46 + movw %bx, %es
pascal@962 47 + movw $forced_url, %di
pascal@962 48 + movw $boot_url, %si
pascal@1001 49 + movw $256, %cx
pascal@962 50 + rep movsb
pascal@962 51 +
pascal@962 52 /* Jump to .text16 segment */
pascal@962 53 pushw %ax
pascal@962 54 pushw $1f
pascal@962 55
pascal@962 56 --- gpxe-0.9.3/src/arch/i386/prefix/pxeprefix.S
pascal@962 57 +++ gpxe-0.9.3/src/arch/i386/prefix/pxeprefix.S
pascal@1001 58 @@ -19,6 +19,9 @@
pascal@962 59 .section ".prefix"
pascal@962 60 /* Set up our non-stack segment registers */
pascal@962 61 jmp $0x7c0, $1f
pascal@1001 62 +#define PXELOADER_KEEP_UNDI
pascal@962 63 +boot_url:
pascal@1001 64 + .space 256, 0
pascal@962 65 1: movw %cs, %ax
pascal@962 66 movw %ax, %ds
pascal@962 67 movw $0x40, %ax /* BIOS data segment access */
pascal@1001 68 @@ -703,16 +706,22 @@
pascal@962 69 /* Set up real-mode stack */
pascal@962 70 movw %bx, %ss
pascal@962 71 movw $_estack16, %sp
pascal@962 72 -
pascal@962 73 + movw %bx, %es
pascal@962 74 +
pascal@962 75 #ifdef PXELOADER_KEEP_UNDI
pascal@962 76 /* Copy our undi_device structure to the preloaded_undi variable */
pascal@962 77 - movw %bx, %es
pascal@962 78 movw $preloaded_undi, %di
pascal@962 79 movw $undi_device, %si
pascal@962 80 movw $undi_device_size, %cx
pascal@962 81 rep movsb
pascal@962 82 #endif
pascal@962 83
pascal@962 84 + /* Copy our boot_url structure to the forced_url variable */
pascal@962 85 + movw $forced_url, %di
pascal@962 86 + movw $boot_url, %si
pascal@1001 87 + movw $256, %cx
pascal@962 88 + rep movsb
pascal@962 89 +
pascal@962 90 /* Jump to .text16 segment with %ds pointing to .data16 */
pascal@962 91 movw %bx, %ds
pascal@962 92 pushw %ax
pascal@962 93
pascal@1001 94 --- gpxe-0.9.3/src/include/pxe_api.h
pascal@1001 95 +++ gpxe-0.9.3/src/include/pxe_api.h
pascal@1001 96 @@ -1684,6 +1684,54 @@
pascal@1001 97
pascal@1001 98 /** @} */ /* pxenv_get_file_size */
pascal@1001 99
pascal@1001 100 +/** @defgroup pxenv_file_exec PXENV_FILE_EXEC
pascal@1001 101 + *
pascal@1001 102 + * FILE EXEC
pascal@1001 103 + *
pascal@1001 104 + * @{
pascal@1001 105 + */
pascal@1001 106 +
pascal@1001 107 +/** PXE API function code for pxenv_file_exec() */
pascal@1001 108 +#define PXENV_FILE_EXEC 0x00e5
pascal@1001 109 +
pascal@1001 110 +/** Parameter block for pxenv_file_exec() */
pascal@1001 111 +struct s_PXENV_FILE_EXEC {
pascal@1001 112 + PXENV_STATUS_t Status; /**< PXE status code */
pascal@1001 113 + SEGOFF16_t Command; /**< Command to execute */
pascal@1001 114 +} PACKED;
pascal@1001 115 +
pascal@1001 116 +typedef struct s_PXENV_FILE_EXEC PXENV_FILE_EXEC_t;
pascal@1001 117 +
pascal@1001 118 +extern PXENV_EXIT_t pxenv_file_exec ( struct s_PXENV_FILE_EXEC *file_exec );
pascal@1001 119 +
pascal@1001 120 +/** @} */ /* pxenv_file_exec */
pascal@1001 121 +
pascal@1001 122 +/** @defgroup pxenv_file_api_check PXENV_FILE_API_CHECK
pascal@1001 123 + *
pascal@1001 124 + * FILE API CHECK
pascal@1001 125 + *
pascal@1001 126 + * @{
pascal@1001 127 + */
pascal@1001 128 +
pascal@1001 129 +/** PXE API function code for pxenv_file_api_check() */
pascal@1001 130 +#define PXENV_FILE_API_CHECK 0x00e6
pascal@1001 131 +
pascal@1001 132 +/** Parameter block for pxenv_file_api_check() */
pascal@1001 133 +struct s_PXENV_FILE_API_CHECK {
pascal@1001 134 + PXENV_STATUS_t Status; /**< PXE status code */
pascal@1001 135 + UINT16_t Size; /**< Size of structure */
pascal@1001 136 + UINT32_t Magic; /**< Magic number */
pascal@1001 137 + UINT32_t Provider; /**< Implementation identifier */
pascal@1001 138 + UINT32_t APIMask; /**< Supported API functions */
pascal@1001 139 + UINT32_t Flags; /**< Reserved for the future */
pascal@1001 140 +} PACKED;
pascal@1001 141 +
pascal@1001 142 +typedef struct s_PXENV_FILE_API_CHECK PXENV_FILE_API_CHECK_t;
pascal@1001 143 +
pascal@1001 144 +extern PXENV_EXIT_t pxenv_file_api_check ( struct s_PXENV_FILE_API_CHECK *file_api_check );
pascal@1001 145 +
pascal@1001 146 +/** @} */ /* pxenv_file_api_check */
pascal@1001 147 +
pascal@1001 148 /** @} */ /* pxe_file_api */
pascal@1001 149
pascal@1001 150 /** @defgroup pxe_loader_api PXE Loader API
pascal@1001 151
pascal@1001 152 --- gpxe-0.9.3/src/include/pxe.h
pascal@1001 153 +++ gpxe-0.9.3/src/include/pxe.h
pascal@1001 154 @@ -63,6 +63,8 @@
pascal@1001 155 struct s_PXENV_FILE_SELECT file_select;
pascal@1001 156 struct s_PXENV_FILE_READ file_read;
pascal@1001 157 struct s_PXENV_GET_FILE_SIZE get_file_size;
pascal@1001 158 + struct s_PXENV_FILE_EXEC file_exec;
pascal@1001 159 + struct s_PXENV_FILE_API_CHECK file_api_check;
pascal@1001 160 };
pascal@1001 161
pascal@1001 162 typedef union u_PXENV_ANY PXENV_ANY_t;
pascal@1001 163
pascal@1001 164 --- gpxe-0.9.3/src/interface/pxe/pxe_file.c
pascal@1001 165 +++ gpxe-0.9.3/src/interface/pxe/pxe_file.c
pascal@1001 166 @@ -31,7 +31,7 @@
pascal@1001 167 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
pascal@1001 168 */
pascal@1001 169
pascal@1001 170 -FEATURE ( FEATURE_MISC, "PXEXT", DHCP_EB_FEATURE_PXE_EXT, 1 );
pascal@1001 171 +FEATURE ( FEATURE_MISC, "PXEXT", DHCP_EB_FEATURE_PXE_EXT, 2 );
pascal@1001 172
pascal@1001 173 /**
pascal@1001 174 * FILE OPEN
pascal@1001 175 @@ -189,3 +189,76 @@
pascal@1001 176 get_file_size->Status = PXENV_STATUS_SUCCESS;
pascal@1001 177 return PXENV_EXIT_SUCCESS;
pascal@1001 178 }
pascal@1001 179 +
pascal@1001 180 +/**
pascal@1001 181 + * FILE EXEC
pascal@1001 182 + *
pascal@1001 183 + * @v file_exec Pointer to a struct s_PXENV_FILE_EXEC
pascal@1001 184 + * @v s_PXENV_FILE_EXEC::Command Command to execute
pascal@1001 185 + * @ret #PXENV_EXIT_SUCCESS Command was executed successfully
pascal@1001 186 + * @ret #PXENV_EXIT_FAILURE Command was not executed successfully
pascal@1001 187 + * @ret s_PXENV_FILE_EXEC::Status PXE status code
pascal@1001 188 + *
pascal@1001 189 + */
pascal@1001 190 +PXENV_EXIT_t pxenv_file_exec ( struct s_PXENV_FILE_EXEC *file_exec ) {
pascal@1001 191 + userptr_t command;
pascal@1001 192 + size_t command_len;
pascal@1001 193 + int rc;
pascal@1001 194 +
pascal@1001 195 + DBG ( "PXENV_FILE_EXEC" );
pascal@1001 196 +
pascal@1001 197 + /* Copy name from external program, and exec it */
pascal@1001 198 + command = real_to_user ( file_exec->Command.segment,
pascal@1001 199 + file_exec->Command.offset );
pascal@1001 200 + command_len = strlen_user ( command, 0 );
pascal@1001 201 + {
pascal@1001 202 + char command_string[ command_len + 1 ];
pascal@1001 203 +
pascal@1001 204 + copy_from_user ( command_string, command, 0,
pascal@1001 205 + sizeof ( command_string ) );
pascal@1001 206 + DBG ( " %s", command_string );
pascal@1001 207 +
pascal@1001 208 + if ( ( rc = system ( command_string ) ) != 0 ) {
pascal@1001 209 + file_exec->Status = PXENV_STATUS ( rc );
pascal@1001 210 + return PXENV_EXIT_FAILURE;
pascal@1001 211 + }
pascal@1001 212 + }
pascal@1001 213 +
pascal@1001 214 + file_exec->Status = PXENV_STATUS_SUCCESS;
pascal@1001 215 + return PXENV_EXIT_SUCCESS;
pascal@1001 216 +}
pascal@1001 217 +
pascal@1001 218 +/**
pascal@1001 219 + * FILE API CHECK
pascal@1001 220 + *
pascal@1001 221 + * @v file_exec Pointer to a struct s_PXENV_FILE_API_CHECK
pascal@1001 222 + * @v s_PXENV_FILE_API_CHECK::Magic Inbound magic number (0x91d447b2)
pascal@1001 223 + * @ret #PXENV_EXIT_SUCCESS Command was executed successfully
pascal@1001 224 + * @ret #PXENV_EXIT_FAILURE Command was not executed successfully
pascal@1001 225 + * @ret s_PXENV_FILE_API_CHECK::Status PXE status code
pascal@1001 226 + * @ret s_PXENV_FILE_API_CHECK::Magic Outbound magic number (0xe9c17b20)
pascal@1001 227 + * @ret s_PXENV_FILE_API_CHECK::Provider "gPXE" (0x45585067)
pascal@1001 228 + * @ret s_PXENV_FILE_API_CHECK::APIMask API function bitmask
pascal@1001 229 + * @ret s_PXENV_FILE_API_CHECK::Flags Reserved
pascal@1001 230 + *
pascal@1001 231 + */
pascal@1001 232 +PXENV_EXIT_t pxenv_file_api_check ( struct s_PXENV_FILE_API_CHECK *file_api_check ) {
pascal@1001 233 + DBG ( "PXENV_FILE_API_CHECK" );
pascal@1001 234 +
pascal@1001 235 + if ( file_api_check->Magic != 0x91d447b2 ) {
pascal@1001 236 + file_api_check->Status = PXENV_STATUS_BAD_FUNC;
pascal@1001 237 + return PXENV_EXIT_FAILURE;
pascal@1001 238 + } else if ( file_api_check->Size <
pascal@1001 239 + sizeof(struct s_PXENV_FILE_API_CHECK) ) {
pascal@1001 240 + file_api_check->Status = PXENV_STATUS_OUT_OF_RESOURCES;
pascal@1001 241 + return PXENV_EXIT_FAILURE;
pascal@1001 242 + } else {
pascal@1001 243 + file_api_check->Status = PXENV_STATUS_SUCCESS;
pascal@1001 244 + file_api_check->Size = sizeof(struct s_PXENV_FILE_API_CHECK);
pascal@1001 245 + file_api_check->Magic = 0xe9c17b20;
pascal@1001 246 + file_api_check->Provider = 0x45585067; /* "gPXE" */
pascal@1001 247 + file_api_check->APIMask = 0x0000007f; /* Functions e0-e6 */
pascal@1001 248 + file_api_check->Flags = 0; /* None defined */
pascal@1001 249 + return PXENV_EXIT_SUCCESS;
pascal@1001 250 + }
pascal@1001 251 +}
pascal@1001 252
pascal@955 253 --- gpxe-0.9.3/src/usr/autoboot.c
pascal@955 254 +++ gpxe-0.9.3/src/usr/autoboot.c
pascal@1001 255 @@ -120,6 +120,28 @@
pascal@962 256 return -ENOTSUP;
pascal@962 257 }
pascal@962 258
pascal@1001 259 +static void set_url ( char buf[], const char url[] ) {
pascal@1001 260 + int i, d = 0;
pascal@1001 261 +
pascal@1001 262 + for (i = 0; url[i] >= ' '; i++) {
pascal@1001 263 + if (url[i] == '/') d = i;
pascal@1001 264 + buf[i] = url[i];
pascal@1001 265 + }
pascal@1001 266 + buf[i] = 0;
pascal@1001 267 + if (strstr(buf,"pxelinux")) {
pascal@1001 268 + struct dhcp_option_block *options = list_entry (
pascal@1001 269 + dhcp_option_blocks.next, typeof ( *options ), list );
pascal@1001 270 +
pascal@1001 271 + set_dhcp_option( options, 208, "\xF1\x00\x74\x7E", 4 );
pascal@1001 272 + set_dhcp_option( options, 210, buf, d+1 );
pascal@1001 273 + }
pascal@1001 274 +}
pascal@1001 275 +
pascal@962 276 +struct _forced_url {
pascal@1001 277 + char url[256];
pascal@962 278 +};
pascal@962 279 +struct _forced_url __data16 ( forced_url );
pascal@962 280 +#define forced_url __use_data16 ( forced_url )
pascal@962 281 /**
pascal@962 282 * Boot from a network device
pascal@962 283 *
pascal@1001 284 @@ -148,6 +170,12 @@
pascal@962 285 /* Try to download and boot whatever we are given as a filename */
pascal@962 286 dhcp_snprintf ( buf, sizeof ( buf ),
pascal@955 287 find_global_dhcp_option ( DHCP_BOOTFILE_NAME ) );
pascal@1001 288 +
pascal@1001 289 + if ( forced_url.url[0] != 0 ) {
pascal@1001 290 + /* Try to boot a forced url if we have one */
pascal@1001 291 + set_url ( buf, forced_url.url );
pascal@1001 292 + }
pascal@962 293 + while (1) {
pascal@955 294 if ( buf[0] ) {
pascal@962 295 printf ( "Booting from filename \"%s\"\n", buf );
pascal@962 296 return boot_filename ( buf );
pascal@1001 297 @@ -162,7 +190,8 @@
pascal@962 298 }
pascal@962 299
pascal@955 300 printf ( "No filename or root path specified\n" );
pascal@955 301 - return -ENOENT;
pascal@1001 302 + set_url ( buf, "http://boot.slitaz.org/gpxe" );
pascal@962 303 + }
pascal@955 304 }
pascal@962 305
pascal@962 306 /**