Home | History | Annotate | Download | only in core
      1 #define LOAD_DEBUG	0
      2 
      3 static int get_x_header(unsigned char *data, unsigned long now);
      4 static void jump_2ep();
      5 static unsigned char ce_signature[] = {'B', '0', '0', '0', 'F', 'F', '\n',};
      6 static char ** ep;
      7 
      8 #define BOOT_ARG_PTR_LOCATION 0x001FFFFC
      9 
     10 typedef struct _BOOT_ARGS{
     11 	unsigned char ucVideoMode;
     12 	unsigned char ucComPort;
     13 	unsigned char ucBaudDivisor;
     14 	unsigned char ucPCIConfigType;
     15 
     16 	unsigned long dwSig;
     17 	#define BOOTARG_SIG 0x544F4F42
     18 	unsigned long dwLen;
     19 
     20 	unsigned char ucLoaderFlags;
     21 	unsigned char ucEshellFlags;
     22 	unsigned char ucEdbgAdapterType;
     23 	unsigned char ucEdbgIRQ;
     24 
     25 	unsigned long dwEdbgBaseAddr;
     26 	unsigned long dwEdbgDebugZone;
     27 	unsigned long dwDHCPLeaseTime;
     28 	unsigned long dwEdbgFlags;
     29 
     30 	unsigned long dwEBootFlag;
     31 	unsigned long dwEBootAddr;
     32 	unsigned long dwLaunchAddr;
     33 
     34 	unsigned long pvFlatFrameBuffer;
     35 	unsigned short vesaMode;
     36 	unsigned short cxDisplayScreen;
     37 	unsigned short cyDisplayScreen;
     38 	unsigned short cxPhysicalScreen;
     39 	unsigned short cyPhysicalScreen;
     40 	unsigned short cbScanLineLength;
     41 	unsigned short bppScreen;
     42 
     43 	unsigned char RedMaskSize;
     44 	unsigned char REdMaskPosition;
     45 	unsigned char GreenMaskSize;
     46 	unsigned char GreenMaskPosition;
     47 	unsigned char BlueMaskSize;
     48 	unsigned char BlueMaskPosition;
     49 } BOOT_ARGS;
     50 
     51 BOOT_ARGS BootArgs;
     52 
     53 static struct segment_info{
     54 	unsigned long addr;		// Section Address
     55 	unsigned long size;		// Section Size
     56 	unsigned long checksum;		// Section CheckSum
     57 } X;
     58 
     59 #define PSIZE	(1500)			//Max Packet Size
     60 #define DSIZE  (PSIZE+12)
     61 static unsigned long dbuffer_available =0;
     62 static unsigned long not_loadin =0;
     63 static unsigned long d_now =0;
     64 
     65 unsigned long entry;
     66 static unsigned long ce_curaddr;
     67 
     68 
     69 static sector_t ce_loader(unsigned char *data, unsigned int len, int eof);
     70 static os_download_t wince_probe(unsigned char *data, unsigned int len)
     71 {
     72 	if (strncmp(ce_signature, data, sizeof(ce_signature)) != 0) {
     73 		return 0;
     74 	}
     75 	printf("(WINCE)");
     76 	return ce_loader;
     77 }
     78 
     79 static sector_t ce_loader(unsigned char *data, unsigned int len, int eof)
     80 {
     81 	static unsigned char dbuffer[DSIZE];
     82 	int this_write = 0;
     83 	static int firsttime = 1;
     84 
     85 	/*
     86 	 *	new packet in, we have to
     87 	 *	[1] copy data to dbuffer,
     88 	 *
     89 	 *	update...
     90 	 *	[2]  dbuffer_available
     91 	 */
     92 	memcpy( (dbuffer+dbuffer_available), data, len);	//[1]
     93 	dbuffer_available += len;	// [2]
     94 	len = 0;
     95 
     96 	d_now = 0;
     97 
     98 #if 0
     99 	printf("dbuffer_available =%ld \n", dbuffer_available);
    100 #endif
    101 
    102 	if (firsttime)
    103 	{
    104 		d_now = sizeof(ce_signature);
    105 		printf("String Physical Address = %lx \n",
    106 			*(unsigned long *)(dbuffer+d_now));
    107 
    108 		d_now += sizeof(unsigned long);
    109 		printf("Image Size = %ld [%lx]\n",
    110 			*(unsigned long *)(dbuffer+d_now),
    111 			*(unsigned long *)(dbuffer+d_now));
    112 
    113 		d_now += sizeof(unsigned long);
    114 		dbuffer_available -= d_now;
    115 
    116 		d_now = (unsigned long)get_x_header(dbuffer, d_now);
    117 		firsttime = 0;
    118 	}
    119 
    120 	if (not_loadin == 0)
    121 	{
    122 		d_now = get_x_header(dbuffer, d_now);
    123 	}
    124 
    125 	while ( not_loadin > 0 )
    126 	{
    127 		/* dbuffer do not have enough data to loading, copy all */
    128 #if LOAD_DEBUG
    129 		printf("[0] not_loadin = [%ld], dbuffer_available = [%ld] \n",
    130 			not_loadin, dbuffer_available);
    131 		printf("[0] d_now = [%ld] \n", d_now);
    132 #endif
    133 
    134 		if( dbuffer_available <= not_loadin)
    135 		{
    136 			this_write = dbuffer_available ;
    137 			memcpy(phys_to_virt(ce_curaddr), (dbuffer+d_now), this_write );
    138 			ce_curaddr += this_write;
    139 			not_loadin -= this_write;
    140 
    141 			/* reset index and available in the dbuffer */
    142 			dbuffer_available = 0;
    143 			d_now = 0;
    144 #if LOAD_DEBUG
    145 			printf("[1] not_loadin = [%ld], dbuffer_available = [%ld] \n",
    146 				not_loadin, dbuffer_available);
    147 			printf("[1] d_now = [%ld], this_write = [%d] \n",
    148 				d_now, this_write);
    149 #endif
    150 
    151 			// get the next packet...
    152 			return (0);
    153 		}
    154 
    155 		/* dbuffer have more data then loading ... , copy partital.... */
    156 		else
    157 		{
    158 			this_write = not_loadin;
    159 			memcpy(phys_to_virt(ce_curaddr), (dbuffer+d_now), this_write);
    160 			ce_curaddr += this_write;
    161 			not_loadin = 0;
    162 
    163 			/* reset index and available in the dbuffer */
    164 			dbuffer_available -= this_write;
    165 			d_now += this_write;
    166 #if LOAD_DEBUG
    167 			printf("[2] not_loadin = [%ld], dbuffer_available = [%ld] \n",
    168 				not_loadin, dbuffer_available);
    169 			printf("[2] d_now = [%ld], this_write = [%d] \n\n",
    170 				d_now, this_write);
    171 #endif
    172 
    173 			/* dbuffer not empty, proceed processing... */
    174 
    175 			// don't have enough data to get_x_header..
    176 			if ( dbuffer_available < (sizeof(unsigned long) * 3) )
    177 			{
    178 //				printf("we don't have enough data remaining to call get_x. \n");
    179 				memcpy( (dbuffer+0), (dbuffer+d_now), dbuffer_available);
    180 				return (0);
    181 			}
    182 			else
    183 			{
    184 #if LOAD_DEBUG
    185 				printf("with remaining data to call get_x \n");
    186 				printf("dbuffer available = %ld , d_now = %ld\n",
    187 					dbuffer_available, d_now);
    188 #endif
    189 				d_now = get_x_header(dbuffer, d_now);
    190 			}
    191 		}
    192 	}
    193 	return (0);
    194 }
    195 
    196 static int get_x_header(unsigned char *dbuffer, unsigned long now)
    197 {
    198 	X.addr = *(unsigned long *)(dbuffer + now);
    199 	X.size = *(unsigned long *)(dbuffer + now + sizeof(unsigned long));
    200 	X.checksum = *(unsigned long *)(dbuffer + now + sizeof(unsigned long)*2);
    201 
    202 	if (X.addr == 0)
    203 	{
    204 		entry = X.size;
    205 		done(1);
    206 		printf("Entry Point Address = [%lx] \n", entry);
    207 		jump_2ep();
    208 	}
    209 
    210 	if (!prep_segment(X.addr, X.addr + X.size, X.addr + X.size, 0, 0)) {
    211 		longjmp(restart_etherboot, -2);
    212 	}
    213 
    214 	ce_curaddr = X.addr;
    215 	now += sizeof(unsigned long)*3;
    216 
    217 	/* re-calculate dbuffer available... */
    218 	dbuffer_available -= sizeof(unsigned long)*3;
    219 
    220 	/* reset index of this section */
    221 	not_loadin = X.size;
    222 
    223 #if 1
    224 	printf("\n");
    225 	printf("\t Section Address = [%lx] \n", X.addr);
    226 	printf("\t Size = %d [%lx]\n", X.size, X.size);
    227 	printf("\t Checksum = %ld [%lx]\n", X.checksum, X.checksum);
    228 #endif
    229 #if LOAD_DEBUG
    230 	printf("____________________________________________\n");
    231 	printf("\t dbuffer_now = %ld \n", now);
    232 	printf("\t dbuffer available = %ld \n", dbuffer_available);
    233 	printf("\t not_loadin = %ld \n", not_loadin);
    234 #endif
    235 
    236 	return now;
    237 }
    238 
    239 static void jump_2ep()
    240 {
    241 	BootArgs.ucVideoMode = 1;
    242 	BootArgs.ucComPort = 1;
    243 	BootArgs.ucBaudDivisor = 1;
    244 	BootArgs.ucPCIConfigType = 1;	// do not fill with 0
    245 
    246 	BootArgs.dwSig = BOOTARG_SIG;
    247 	BootArgs.dwLen = sizeof(BootArgs);
    248 
    249 	if(BootArgs.ucVideoMode == 0)
    250 	{
    251 		BootArgs.cxDisplayScreen = 640;
    252 		BootArgs.cyDisplayScreen = 480;
    253 		BootArgs.cxPhysicalScreen = 640;
    254 		BootArgs.cyPhysicalScreen = 480;
    255 		BootArgs.bppScreen = 16;
    256 		BootArgs.cbScanLineLength  = 1024;
    257 		BootArgs.pvFlatFrameBuffer = 0x800a0000;	// ollie say 0x98000000
    258 	}
    259 	else if(BootArgs.ucVideoMode != 0xFF)
    260 	{
    261 		BootArgs.cxDisplayScreen = 0;
    262 		BootArgs.cyDisplayScreen = 0;
    263 		BootArgs.cxPhysicalScreen = 0;
    264 		BootArgs.cyPhysicalScreen = 0;
    265 		BootArgs.bppScreen = 0;
    266 		BootArgs.cbScanLineLength  = 0;
    267 		BootArgs.pvFlatFrameBuffer = 0;
    268 	}
    269 
    270 	ep = phys_to_virt(BOOT_ARG_PTR_LOCATION);
    271 	*ep= virt_to_phys(&BootArgs);
    272 	xstart32(entry);
    273 }
    274