/*************************************************************************** * Copyright (c) 2003-2010, Broadcom Corporation * All Rights Reserved * Confidential Property of Broadcom Corporation * * THIS SOFTWARE MAY ONLY BE USED SUBJECT TO AN EXECUTED SOFTWARE LICENSE * AGREEMENT BETWEEN THE USER AND BROADCOM. YOU HAVE NO RIGHT TO USE OR * EXPLOIT THIS MATERIAL EXCEPT SUBJECT TO THE TERMS OF SUCH AN AGREEMENT. * * $brcm_Workfile: $ * $brcm_Revision: $ * $brcm_Date: $ * * Module Description: * * Revision History: * * $brcm_Log: $ * * ***************************************************************************/ #include "fast_heap.h" #include "zlib.h" #define RAM_TEXT_BASE 0x80016000 #define RAM_TEXT_SIZE 0x01000000 extern void clear_all_d_cache(void); extern void invalidate_all_i_cache(void); static int decompress(unsigned char *in_buf, unsigned int in_size, unsigned char * out_buf, unsigned int out_size); static void run_compressed(unsigned char * data, unsigned int len); extern unsigned int comp_size; extern unsigned int _edata; extern unsigned int _end; void bcm_main(void) { unsigned char * compressed_image; unsigned int compressed_size; fast_heap_init((unsigned long)&_end); compressed_size = (unsigned int) &comp_size; compressed_image = (unsigned char *) &_edata; run_compressed(compressed_image, compressed_size); while(1); } void *memset(void *dest,int c,size_t count) { uint8_t *d = dest; for(;count>0;count--) { *d++ = c; } return dest; } typedef void (*entry_t)(void); void run_compressed(unsigned char * data, unsigned int len) { int rc; unsigned char * text; entry_t entry; text = (unsigned char *)RAM_TEXT_BASE; rc = decompress(data, len, text, RAM_TEXT_SIZE); if(rc > 0){ entry = (entry_t) RAM_TEXT_BASE; clear_all_d_cache(); invalidate_all_i_cache(); entry(); } } int decompress(unsigned char *in_buf, unsigned int in_size, unsigned char * out_buf, unsigned int out_size) { z_stream strm; int ret; memset(&strm,0,sizeof(strm)); strm.avail_in = in_size; strm.next_in = in_buf; strm.avail_out = out_size; strm.next_out = out_buf; ret = inflateInit2(&strm, 15+32); if (ret == Z_OK) { ret = inflate(&strm, Z_FINISH); inflateEnd(&strm); if ((ret == Z_STREAM_END) || (ret == Z_OK)) { return strm.total_out; } else if (ret > 0) { return -ret; } } return ret; } /* Please do not remove! */ /* Local Variables: */ /* mode: C */ /* indent-tabs-mode: nil */ /* End: */