[BACK]Return to hw-bse.c CVS log [TXT][DIR] Up to [Development] / linux-2.6-xfs / arch / arm / boot / compressed

File: [Development] / linux-2.6-xfs / arch / arm / boot / compressed / Attic / hw-bse.c (download)

Revision 1.1, Tue Dec 30 23:58:53 2003 UTC (13 years, 9 months ago) by cattelan
Branch: MAIN

Initial Import 2.6.0

/*
 * 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;
}