1*9a747e4fSDavid du Colombier #include <u.h> 2*9a747e4fSDavid du Colombier #include <libc.h> 3*9a747e4fSDavid du Colombier #include "flashfs.h" 4*9a747e4fSDavid du Colombier 5*9a747e4fSDavid du Colombier char* prog; 6*9a747e4fSDavid du Colombier ulong sectsize; 7*9a747e4fSDavid du Colombier ulong nsects; 8*9a747e4fSDavid du Colombier uchar* sectbuff; 9*9a747e4fSDavid du Colombier int readonly; 10*9a747e4fSDavid du Colombier ulong delta; 11*9a747e4fSDavid du Colombier int eparity; 12*9a747e4fSDavid du Colombier 13*9a747e4fSDavid du Colombier uchar magic[] = { MAGIC0, MAGIC1, MAGIC2, FFSVERS }; 14*9a747e4fSDavid du Colombier 15*9a747e4fSDavid du Colombier int 16*9a747e4fSDavid du Colombier putc3(uchar *buff, ulong v) 17*9a747e4fSDavid du Colombier { 18*9a747e4fSDavid du Colombier if(v < (1 << 7)) { 19*9a747e4fSDavid du Colombier buff[0] = v; 20*9a747e4fSDavid du Colombier return 1; 21*9a747e4fSDavid du Colombier } 22*9a747e4fSDavid du Colombier 23*9a747e4fSDavid du Colombier if(v < (1 << 13)) { 24*9a747e4fSDavid du Colombier buff[0] = 0x80 | (v >> 7); 25*9a747e4fSDavid du Colombier buff[1] = v & ((1 << 7) - 1); 26*9a747e4fSDavid du Colombier return 2; 27*9a747e4fSDavid du Colombier } 28*9a747e4fSDavid du Colombier 29*9a747e4fSDavid du Colombier if(v < (1 << 21)) { 30*9a747e4fSDavid du Colombier buff[0] = 0x80 | (v >> 15); 31*9a747e4fSDavid du Colombier buff[1] = 0x80 | ((v >> 8) & ((1 << 7) - 1)); 32*9a747e4fSDavid du Colombier buff[2] = v; 33*9a747e4fSDavid du Colombier return 3; 34*9a747e4fSDavid du Colombier } 35*9a747e4fSDavid du Colombier 36*9a747e4fSDavid du Colombier fprint(2, "%s: putc3 fail 0x%lux, called from 0x%lux\n", prog, v, getcallerpc(&buff)); 37*9a747e4fSDavid du Colombier abort(); 38*9a747e4fSDavid du Colombier return -1; 39*9a747e4fSDavid du Colombier } 40*9a747e4fSDavid du Colombier 41*9a747e4fSDavid du Colombier int 42*9a747e4fSDavid du Colombier getc3(uchar *buff, ulong *p) 43*9a747e4fSDavid du Colombier { 44*9a747e4fSDavid du Colombier int c, d; 45*9a747e4fSDavid du Colombier 46*9a747e4fSDavid du Colombier c = buff[0]; 47*9a747e4fSDavid du Colombier if((c & 0x80) == 0) { 48*9a747e4fSDavid du Colombier *p = c; 49*9a747e4fSDavid du Colombier return 1; 50*9a747e4fSDavid du Colombier } 51*9a747e4fSDavid du Colombier 52*9a747e4fSDavid du Colombier c &= ~0x80; 53*9a747e4fSDavid du Colombier d = buff[1]; 54*9a747e4fSDavid du Colombier if((d & 0x80) == 0) { 55*9a747e4fSDavid du Colombier *p = (c << 7) | d; 56*9a747e4fSDavid du Colombier return 2; 57*9a747e4fSDavid du Colombier } 58*9a747e4fSDavid du Colombier 59*9a747e4fSDavid du Colombier d &= ~0x80; 60*9a747e4fSDavid du Colombier *p = (c << 15) | (d << 8) | buff[2]; 61*9a747e4fSDavid du Colombier return 3; 62*9a747e4fSDavid du Colombier } 63*9a747e4fSDavid du Colombier 64*9a747e4fSDavid du Colombier ulong 65*9a747e4fSDavid du Colombier get4(uchar *b) 66*9a747e4fSDavid du Colombier { 67*9a747e4fSDavid du Colombier return (b[0] << 0) | 68*9a747e4fSDavid du Colombier (b[1] << 8) | 69*9a747e4fSDavid du Colombier (b[2] << 16) | 70*9a747e4fSDavid du Colombier (b[3] << 24); 71*9a747e4fSDavid du Colombier } 72*9a747e4fSDavid du Colombier 73*9a747e4fSDavid du Colombier void 74*9a747e4fSDavid du Colombier put4(uchar *b, ulong v) 75*9a747e4fSDavid du Colombier { 76*9a747e4fSDavid du Colombier b[0] = v >> 0; 77*9a747e4fSDavid du Colombier b[1] = v >> 8; 78*9a747e4fSDavid du Colombier b[2] = v >> 16; 79*9a747e4fSDavid du Colombier b[3] = v >> 24; 80*9a747e4fSDavid du Colombier } 81