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
128177int 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