Patches b03c1b through 3f00b5
[barrelfish] / tools / weever / builder / build_weever.c
1 /**
2  * \file
3  * \brief Builder for the Xeon Phi Bootloader
4  */
5
6 /*
7  * Copyright (c) 2014, ETH Zurich.
8  * All rights reserved.
9  *
10  * This file is distributed under the terms in the attached LICENSE file.
11  * If you do not find this file, copies can be found by writing to:
12  * ETH Zurich D-INFK, Universitaetsstrasse 6, CH-8092 Zurich. Attn: Systems Group.
13  */
14
15 /*
16  * Description
17  *
18  * This program prepends a >1024 byte header to the Xeon Phi bootloader. The
19  * header contains the necessary fields with the information filled in used by
20  * the Xeon Phi bootstrap. The header contains the Linux bootinfo struct.
21  */
22
23
24 #include <stdio.h>
25 #include <string.h>
26 #include <unistd.h>
27 #include <fcntl.h>
28 #include <sys/stat.h>
29 #include <sys/mman.h>
30
31 /*
32  * Size information for the header. The size of the header has to be at
33  * least 1024 bytes!
34  */
35 #define SETUP_SECTORS 2
36 #define SECTOR_SIZE 512
37 #define HEADER_SIZE (SETUP_SECTORS*SECTOR_SIZE)
38
39 unsigned char buf[HEADER_SIZE+1];
40
41 int main(int argc, char ** argv)
42 {
43     if (argc != 2) {
44         printf("Usage: build setup system > image");
45         return -2;
46     }
47
48     struct stat sb;
49     int fd = open(argv[1], O_RDONLY);
50
51     if (fd < 0 || fstat(fd, &sb)) {
52         printf("Error while opening file\n");
53         return -1;
54     }
55
56     unsigned int sys_size = (sb.st_size + 15) / 16;
57
58     void *kernel = mmap(NULL, sb.st_size, PROT_READ, MAP_SHARED, fd, 0);
59     if (kernel == MAP_FAILED){
60         printf("Error while mapping system\n");
61         return -1;
62     }
63
64     // clear the buffer
65     memset(buf, 0, SETUP_SECTORS * SECTOR_SIZE);
66
67     /*
68      * the following assignments set special values in the bootinfo structure
69      * of the header. The Xeon Phi bootloader reads this value to determine
70      * the size and location of the executable.
71      */
72
73     /*
74      * This is the signature. Without this the kernel does not boot.
75      * Signature is reads "HdrS"
76      */
77     buf[514] = 0x48;
78     buf[515] = 0x64;
79     buf[516] = 0x72;
80     buf[517] = 0x53;
81
82     /*
83      * set the number of setup sectors in addition to the boot sector.
84      * this is SETUP_SECTORS - 1
85      *
86      * Note: Setup must be at least 1024 bytes long to have enough space
87      *       for the boot info struct
88      */
89     buf[0x1f1] = SETUP_SECTORS-1;
90
91     /*
92      * set the size of the bootloader
93      */
94     buf[0x1f4] = sys_size;
95     buf[0x1f5] = sys_size >> 8;
96     buf[0x1f6] = sys_size >> 16;
97     buf[0x1f7] = sys_size >> 24;
98
99     /*
100      * write the filled in header to the file
101      */
102     if (fwrite(buf, 1, HEADER_SIZE, stdout) != HEADER_SIZE) {
103         printf("Writing setup failed");
104         return -1;
105     }
106
107     /*
108      * write the bootloader
109      */
110     if (fwrite(kernel, 1, sb.st_size, stdout) != sb.st_size) {
111         printf("Writing setup failed");
112         return -1;
113     }
114
115     close(fd);
116
117     return 0;
118 }