/* * Bright Star Engineering Inc. * * code for readng parameters from the * parameter blocks of the boot block * flash memory * */ static int strcmp(const char *s1, const char *s2) { while (*s1 != '\0' && *s1 == *s2) { s1++; s2++; } return (*(unsigned char *) s1) - (*(unsigned char *) s2); } struct pblk_t { char type; unsigned short size; }; static char *bse_getflashparam(char *name) { unsigned int esize; char *q,*r; unsigned char *p,*e; struct pblk_t *thepb = (struct pblk_t *) 0x00004000; struct pblk_t *altpb = (struct pblk_t *) 0x00006000; if (thepb->type&1) { if (altpb->type&1) { /* no valid param block */ return (char*)0; } else { /* altpb is valid */ struct pblk_t *tmp; tmp = thepb; thepb = altpb; altpb = tmp; } } p = (char*)thepb + sizeof(struct pblk_t); e = p + thepb->size; while (p < e) { q = p; esize = *p; if (esize == 0xFF) break; if (esize == 0) break; if (esize > 127) { esize = (esize&0x7F)<<8 | p[1]; q++; } q++; r=q; if (*r && ((name == 0) || (!strcmp(name,r)))) { while (*q++) ; return q; } p+=esize; } return (char*)0; } void bse_setup(void) { /* extract the linux cmdline from flash */ char *name=bse_getflashparam("linuxboot"); char *x = (char *)0xc0000100; if (name) { while (*name) *x++=*name++; } *x=0; }