Fix the bounce_size global so that the bounce buffer works with CBFS.
Make self_boot() static. Signed-off-by: Myles Watson <mylesgw@gmail.com> Acked-by: Ronald G. Minnich <rminnich@gmail.com> git-svn-id: svn://svn.coreboot.org/coreboot/trunk@4663 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
parent
f250f191f8
commit
920279842d
|
@ -68,7 +68,7 @@ int elf_check_arch(Elf_ehdr *ehdr)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void jmp_to_elf_entry(void *entry, unsigned long buffer, unsigned long bounce_size)
|
void jmp_to_elf_entry(void *entry, unsigned long buffer, unsigned long size)
|
||||||
{
|
{
|
||||||
extern unsigned char _ram_seg, _eram_seg;
|
extern unsigned char _ram_seg, _eram_seg;
|
||||||
unsigned long lb_start, lb_size;
|
unsigned long lb_start, lb_size;
|
||||||
|
@ -79,7 +79,7 @@ void jmp_to_elf_entry(void *entry, unsigned long buffer, unsigned long bounce_si
|
||||||
|
|
||||||
lb_start = (unsigned long)&_ram_seg;
|
lb_start = (unsigned long)&_ram_seg;
|
||||||
lb_size = (unsigned long)(&_eram_seg - &_ram_seg);
|
lb_size = (unsigned long)(&_eram_seg - &_ram_seg);
|
||||||
adjust = buffer + bounce_size - lb_start;
|
adjust = buffer + size - lb_start;
|
||||||
|
|
||||||
adjusted_boot_notes = (unsigned long)&elf_boot_notes;
|
adjusted_boot_notes = (unsigned long)&elf_boot_notes;
|
||||||
adjusted_boot_notes += adjust;
|
adjusted_boot_notes += adjust;
|
||||||
|
|
|
@ -71,9 +71,10 @@ struct ip_checksum_vcb {
|
||||||
unsigned short ip_checksum;
|
unsigned short ip_checksum;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int selfboot(struct lb_memory *mem, struct cbfs_payload *payload);
|
||||||
|
|
||||||
void * cbfs_load_payload(struct lb_memory *lb_mem, const char *name)
|
void * cbfs_load_payload(struct lb_memory *lb_mem, const char *name)
|
||||||
{
|
{
|
||||||
int selfboot(struct lb_memory *mem, struct cbfs_payload *payload);
|
|
||||||
struct cbfs_payload *payload;
|
struct cbfs_payload *payload;
|
||||||
|
|
||||||
payload = (struct cbfs_payload *)cbfs_find_file(name, CBFS_TYPE_PAYLOAD);
|
payload = (struct cbfs_payload *)cbfs_find_file(name, CBFS_TYPE_PAYLOAD);
|
||||||
|
@ -110,7 +111,7 @@ void * cbfs_load_payload(struct lb_memory *lb_mem, const char *name)
|
||||||
|
|
||||||
static unsigned long bounce_size, bounce_buffer;
|
static unsigned long bounce_size, bounce_buffer;
|
||||||
|
|
||||||
static void get_bounce_buffer(struct lb_memory *mem, unsigned long bounce_size)
|
static void get_bounce_buffer(struct lb_memory *mem, unsigned long req_size)
|
||||||
{
|
{
|
||||||
unsigned long lb_size;
|
unsigned long lb_size;
|
||||||
unsigned long mem_entries;
|
unsigned long mem_entries;
|
||||||
|
@ -118,7 +119,7 @@ static void get_bounce_buffer(struct lb_memory *mem, unsigned long bounce_size)
|
||||||
int i;
|
int i;
|
||||||
lb_size = (unsigned long)(&_eram_seg - &_ram_seg);
|
lb_size = (unsigned long)(&_eram_seg - &_ram_seg);
|
||||||
/* Double coreboot size so I have somewhere to place a copy to return to */
|
/* Double coreboot size so I have somewhere to place a copy to return to */
|
||||||
lb_size = bounce_size + lb_size;
|
lb_size = req_size + lb_size;
|
||||||
mem_entries = (mem->size - sizeof(*mem))/sizeof(mem->map[0]);
|
mem_entries = (mem->size - sizeof(*mem))/sizeof(mem->map[0]);
|
||||||
buffer = 0;
|
buffer = 0;
|
||||||
for(i = 0; i < mem_entries; i++) {
|
for(i = 0; i < mem_entries; i++) {
|
||||||
|
@ -142,6 +143,7 @@ static void get_bounce_buffer(struct lb_memory *mem, unsigned long bounce_size)
|
||||||
buffer = tbuffer;
|
buffer = tbuffer;
|
||||||
}
|
}
|
||||||
bounce_buffer = buffer;
|
bounce_buffer = buffer;
|
||||||
|
bounce_size = req_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int valid_area(struct lb_memory *mem, unsigned long buffer,
|
static int valid_area(struct lb_memory *mem, unsigned long buffer,
|
||||||
|
@ -424,7 +426,8 @@ static int load_self_segments(
|
||||||
for(ptr = head->next; ptr != head; ptr = ptr->next) {
|
for(ptr = head->next; ptr != head; ptr = ptr->next) {
|
||||||
if (!overlaps_coreboot(ptr)) continue;
|
if (!overlaps_coreboot(ptr)) continue;
|
||||||
unsigned long bounce = ptr->s_dstaddr + ptr->s_memsz - lb_start;
|
unsigned long bounce = ptr->s_dstaddr + ptr->s_memsz - lb_start;
|
||||||
if (bounce > required_bounce_size) required_bounce_size = bounce;
|
if (bounce > required_bounce_size)
|
||||||
|
required_bounce_size = bounce;
|
||||||
}
|
}
|
||||||
get_bounce_buffer(mem, required_bounce_size);
|
get_bounce_buffer(mem, required_bounce_size);
|
||||||
if (!bounce_buffer) {
|
if (!bounce_buffer) {
|
||||||
|
@ -458,14 +461,12 @@ static int load_self_segments(
|
||||||
size_t len;
|
size_t len;
|
||||||
len = ptr->s_filesz;
|
len = ptr->s_filesz;
|
||||||
switch(ptr->compression) {
|
switch(ptr->compression) {
|
||||||
#if CONFIG_COMPRESSED_PAYLOAD_LZMA==1
|
|
||||||
case CBFS_COMPRESS_LZMA: {
|
case CBFS_COMPRESS_LZMA: {
|
||||||
printk_debug("using LZMA\n");
|
printk_debug("using LZMA\n");
|
||||||
unsigned long ulzma(unsigned char *src, unsigned char *dst);
|
unsigned long ulzma(unsigned char *src, unsigned char *dst);
|
||||||
len = ulzma(src, dest);
|
len = ulzma(src, dest);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
#if CONFIG_COMPRESSED_PAYLOAD_NRV2B==1
|
#if CONFIG_COMPRESSED_PAYLOAD_NRV2B==1
|
||||||
case CBFS_COMPRESS_NRV2B: {
|
case CBFS_COMPRESS_NRV2B: {
|
||||||
printk_debug("using NRV2B\n");
|
printk_debug("using NRV2B\n");
|
||||||
|
@ -505,7 +506,7 @@ static int load_self_segments(
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int selfboot(struct lb_memory *mem, struct cbfs_payload *payload)
|
static int selfboot(struct lb_memory *mem, struct cbfs_payload *payload)
|
||||||
{
|
{
|
||||||
u32 entry=0;
|
u32 entry=0;
|
||||||
struct segment head;
|
struct segment head;
|
||||||
|
|
Loading…
Reference in New Issue