Skip to content

Commit d938537

Browse files
payloads/bareflank: load and start next payload
Signed-off-by: Krystian Hebel <[email protected]>
1 parent b0164e6 commit d938537

File tree

1 file changed

+54
-1
lines changed

1 file changed

+54
-1
lines changed

payloads/bareflank/entry.c

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@
2525
#include <bfconstants.h>
2626
#include <bfdriverinterface.h>
2727

28+
#include <libpayload.h>
29+
#include <cbfs.h>
30+
#include <lzma.h>
31+
32+
extern void i386_do_exec(void* addr, int argc, char **argv, int *ret);
33+
2834
/* -------------------------------------------------------------------------- */
2935
/* Global */
3036
/* -------------------------------------------------------------------------- */
@@ -121,12 +127,57 @@ ioctl_start_vmm(void)
121127
return BF_IOCTL_FAILURE;
122128
}
123129

130+
static void cbfs_run_payload(struct cbfs_payload *pay)
131+
{
132+
struct cbfs_payload_segment *seg = &pay->segments;
133+
for (;;) {
134+
void *src = (void*)pay + ntohl(seg->offset);
135+
void *dest = (void*)ntohll(seg->load_addr);
136+
u32 src_len = ntohl(seg->len);
137+
u32 dest_len = ntohl(seg->mem_len);
138+
switch (seg->type) {
139+
case PAYLOAD_SEGMENT_BSS:
140+
printf("BSS segment %d@%p\n", dest_len, dest);
141+
memset(dest, 0, dest_len);
142+
break;
143+
case PAYLOAD_SEGMENT_ENTRY: {
144+
printf("Calling addr %p\n", dest);
145+
i386_do_exec(dest, 0, NULL, NULL);
146+
return;
147+
}
148+
default:
149+
printf("Segment %x %d@%p -> %d@%p\n", seg->type, src_len, src,
150+
dest_len, dest);
151+
if (seg->compression == ntohl(CBFS_COMPRESS_NONE)) {
152+
if (src_len > dest_len)
153+
src_len = dest_len;
154+
memcpy(dest, src, src_len);
155+
} else if (CONFIG_LP_LZMA
156+
&& seg->compression == ntohl(CBFS_COMPRESS_LZMA)) {
157+
int ret = ulzman(src, src_len, dest, dest_len);
158+
if (ret < 0)
159+
return;
160+
src_len = ret;
161+
} else {
162+
printf("No support for compression type %x\n", seg->compression);
163+
return;
164+
}
165+
if (dest_len > src_len)
166+
memset(dest + src_len, 0, dest_len - src_len);
167+
break;
168+
}
169+
seg++;
170+
}
171+
}
172+
124173
/* -------------------------------------------------------------------------- */
125174
/* Entry / Exit */
126175
/* -------------------------------------------------------------------------- */
127176

128177
int main(void)
129178
{
179+
void *payload = NULL;
180+
130181
printf("\n");
131182
printf(" ___ __ _ _ \n");
132183
printf(" | _ ) __ _ _ _ ___ / _| |__ _ _ _ | |__\n");
@@ -144,6 +195,8 @@ int main(void)
144195
ioctl_load_vmm();
145196
ioctl_start_vmm();
146197

147-
// TODO: do not return, start next stage instead
198+
payload = cbfs_load_payload(CBFS_DEFAULT_MEDIA, "img/seabios");
199+
200+
cbfs_run_payload(payload);
148201
return 0;
149202
}

0 commit comments

Comments
 (0)