2 * This file is part of the bayou project.
4 * Copyright (C) 2008 Advanced Micro Devices, Inc.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
19 static int nop_decompress(void *dst
, void *src
, int len
)
21 memcpy(dst
, src
, len
);
26 extern int ulzma(u8
*, u8
*);
28 static int lzma_decompress(void *dst
, void *src
, int len
)
30 return ulzma((u8
*) src
, (u8
*) dst
);
35 extern int unrv2b(u8
*, u8
*, unsigned long *);
37 static int nrv2b_decompress(void *dst
, void *src
, int len
)
39 unsigned long l
= (u32
) len
;
40 return unrv2b(src
, dst
, &l
);
44 static int zeros_decompress(void *dst
, void *src
, int len
)
50 int self_get_params(u8
*fptr
, u8
**params
)
52 struct self_segment
*seg
= (struct self_segment
*)fptr
;
54 while (seg
->type
!= SELF_TYPE_ENTRY
) {
58 if (seg
->type
== SELF_TYPE_PARAMS
) {
59 *params
= (u8
*) (fptr
+ seg
->offset
);
71 int verify_self(u8
*ptr
)
73 struct self_segment
*seg
= (struct self_segment
*)ptr
;
79 case SELF_TYPE_PARAMS
:
87 int self_load_and_run(struct payload
*p
, int *ret
)
89 struct self_segment
*seg
= (struct self_segment
*)p
->fptr
;
90 int (*dcmp
) (void *, void *, int);
93 switch (p
->stat
.compression
) {
96 dcmp
= lzma_decompress
;
101 dcmp
= nrv2b_decompress
;
105 dcmp
= zeros_decompress
;
108 dcmp
= nop_decompress
;
110 printf("E: Unsupported decompression type\n");
115 u32 laddr
= (u32
) (seg
->load_addr
& 0xFFFFFFFF);
120 dlen
= dcmp((void *)laddr
,
121 (void *)p
->fptr
+ seg
->offset
, seg
->len
);
123 if (dlen
< seg
->mem_len
) {
124 memset((void *)(laddr
+ dlen
), 0,
125 seg
->mem_len
- dlen
);
130 memset((void *)laddr
, 0, seg
->len
);
132 case SELF_TYPE_ENTRY
:
133 *ret
= exec(laddr
, 0, NULL
);