Try image as ELF file first. (Don't yet actually try to execute it).
[people/xl0/gpxe.git] / src / tests / tftptest.c
1 #include <stdint.h>
2 #include <string.h>
3 #include <console.h>
4 #include <gpxe/udp.h>
5 #include <gpxe/tftp.h>
6 #include <gpxe/async.h>
7 #include <gpxe/uaccess.h>
8 #include <gpxe/buffer.h>
9 #include <gpxe/elf.h>
10 #include <bios.h>
11 #include "pxe.h"
12
13 int test_tftp ( struct net_device *netdev, struct sockaddr_tcpip *target,
14                 const char *filename ) {
15         struct tftp_session tftp;
16         struct buffer buffer;
17         struct elf elf;
18         uint16_t fbms;
19         int rc;
20
21         memset ( &buffer, 0, sizeof ( buffer ) );
22         buffer.addr = real_to_user ( 0, 0x7c00 );
23         get_real ( fbms, BDA_SEG, BDA_FBMS );
24         buffer.len = ( fbms * 1024 - 0x7c00 );
25
26         memset ( &tftp, 0, sizeof ( tftp ) );
27         udp_connect ( &tftp.udp, target );
28         tftp.filename = filename;
29         tftp.buffer = &buffer;
30
31         printf ( "Fetching \"%s\" via TFTP\n", filename );
32         if ( ( rc = async_wait ( tftp_get ( &tftp ) ) ) != 0 )
33                 return rc;
34
35         elf.image = buffer.addr;
36         elf.len = buffer.len;
37         if ( ( rc = elf_load ( &elf ) ) == 0 ) {
38                 printf ( "Got valid ELF image: execaddr at %lx\n",
39                          elf.entry );
40                 return 0;
41         }
42
43         printf ( "Attempting PXE boot\n" );
44         pxe_netdev = netdev;
45         rc = pxe_boot();
46         printf ( "PXE NBP returned with status %04x\n", rc );
47         return 0;
48 }