1*e6dcbf51SDavid du Colombier #include <u.h>
2*e6dcbf51SDavid du Colombier #include <libc.h>
3*e6dcbf51SDavid du Colombier #include <ip.h>
4*e6dcbf51SDavid du Colombier #include "dat.h"
5*e6dcbf51SDavid du Colombier #include "protos.h"
6*e6dcbf51SDavid du Colombier
7*e6dcbf51SDavid du Colombier typedef struct{
8*e6dcbf51SDavid du Colombier uchar aflag;
9*e6dcbf51SDavid du Colombier uchar feat;
10*e6dcbf51SDavid du Colombier uchar sectors;
11*e6dcbf51SDavid du Colombier uchar cmd;
12*e6dcbf51SDavid du Colombier uchar lba[6];
13*e6dcbf51SDavid du Colombier }Hdr;
14*e6dcbf51SDavid du Colombier
15*e6dcbf51SDavid du Colombier enum{
16*e6dcbf51SDavid du Colombier Hsize = 10,
17*e6dcbf51SDavid du Colombier };
18*e6dcbf51SDavid du Colombier
19*e6dcbf51SDavid du Colombier enum{
20*e6dcbf51SDavid du Colombier Oaflag,
21*e6dcbf51SDavid du Colombier Ocmd,
22*e6dcbf51SDavid du Colombier Ofeat,
23*e6dcbf51SDavid du Colombier Osectors,
24*e6dcbf51SDavid du Colombier Olba,
25*e6dcbf51SDavid du Colombier
26*e6dcbf51SDavid du Colombier Ostat,
27*e6dcbf51SDavid du Colombier Oerr,
28*e6dcbf51SDavid du Colombier };
29*e6dcbf51SDavid du Colombier
30*e6dcbf51SDavid du Colombier static Field p_fields[] =
31*e6dcbf51SDavid du Colombier {
32*e6dcbf51SDavid du Colombier {"aflag", Fnum, Oaflag, "aflag", },
33*e6dcbf51SDavid du Colombier {"cmd", Fnum, Ocmd, "command register", },
34*e6dcbf51SDavid du Colombier {"feat", Fnum, Ofeat, "features", },
35*e6dcbf51SDavid du Colombier {"sectors", Fnum, Osectors, "number of sectors", },
36*e6dcbf51SDavid du Colombier {"lba", Fnum, Olba, "lba", },
37*e6dcbf51SDavid du Colombier {"stat", Fnum, Ostat, "status", },
38*e6dcbf51SDavid du Colombier {"err", Fnum, Oerr, "error", },
39*e6dcbf51SDavid du Colombier {0}
40*e6dcbf51SDavid du Colombier };
41*e6dcbf51SDavid du Colombier
42*e6dcbf51SDavid du Colombier static void
p_compile(Filter * f)43*e6dcbf51SDavid du Colombier p_compile(Filter *f)
44*e6dcbf51SDavid du Colombier {
45*e6dcbf51SDavid du Colombier if(f->op == '='){
46*e6dcbf51SDavid du Colombier compile_cmp(aoeata.name, f, p_fields);
47*e6dcbf51SDavid du Colombier return;
48*e6dcbf51SDavid du Colombier }
49*e6dcbf51SDavid du Colombier sysfatal("unknown aoeata field: %s", f->s);
50*e6dcbf51SDavid du Colombier }
51*e6dcbf51SDavid du Colombier
52*e6dcbf51SDavid du Colombier uvlong
llba(uchar * c)53*e6dcbf51SDavid du Colombier llba(uchar *c)
54*e6dcbf51SDavid du Colombier {
55*e6dcbf51SDavid du Colombier uvlong l;
56*e6dcbf51SDavid du Colombier
57*e6dcbf51SDavid du Colombier l = c[0];
58*e6dcbf51SDavid du Colombier l |= c[1]<<8;
59*e6dcbf51SDavid du Colombier l |= c[2]<<16;
60*e6dcbf51SDavid du Colombier l |= c[3]<<24;
61*e6dcbf51SDavid du Colombier l |= (uvlong)c[4]<<32;
62*e6dcbf51SDavid du Colombier l |= (uvlong)c[5]<<40;
63*e6dcbf51SDavid du Colombier return l;
64*e6dcbf51SDavid du Colombier }
65*e6dcbf51SDavid du Colombier
66*e6dcbf51SDavid du Colombier static int
p_filter(Filter * f,Msg * m)67*e6dcbf51SDavid du Colombier p_filter(Filter *f, Msg *m)
68*e6dcbf51SDavid du Colombier {
69*e6dcbf51SDavid du Colombier Hdr *h;
70*e6dcbf51SDavid du Colombier
71*e6dcbf51SDavid du Colombier if(m->pe - m->ps < Hsize)
72*e6dcbf51SDavid du Colombier return 0;
73*e6dcbf51SDavid du Colombier
74*e6dcbf51SDavid du Colombier h = (Hdr*)m->ps;
75*e6dcbf51SDavid du Colombier m->ps += Hsize;
76*e6dcbf51SDavid du Colombier
77*e6dcbf51SDavid du Colombier switch(f->subop){
78*e6dcbf51SDavid du Colombier case Oaflag:
79*e6dcbf51SDavid du Colombier return h->aflag == f->ulv;
80*e6dcbf51SDavid du Colombier case Ocmd:
81*e6dcbf51SDavid du Colombier return h->cmd == f->ulv;
82*e6dcbf51SDavid du Colombier case Ofeat:
83*e6dcbf51SDavid du Colombier return h->feat == f->ulv;
84*e6dcbf51SDavid du Colombier case Osectors:
85*e6dcbf51SDavid du Colombier return h->sectors == f->ulv;
86*e6dcbf51SDavid du Colombier case Olba:
87*e6dcbf51SDavid du Colombier return llba(h->lba) == f->vlv;
88*e6dcbf51SDavid du Colombier
89*e6dcbf51SDavid du Colombier /* this is wrong, but we don't have access to the direction here */
90*e6dcbf51SDavid du Colombier case Ostat:
91*e6dcbf51SDavid du Colombier return h->cmd == f->ulv;
92*e6dcbf51SDavid du Colombier case Oerr:
93*e6dcbf51SDavid du Colombier return h->feat == f->ulv;
94*e6dcbf51SDavid du Colombier }
95*e6dcbf51SDavid du Colombier return 0;
96*e6dcbf51SDavid du Colombier }
97*e6dcbf51SDavid du Colombier
98*e6dcbf51SDavid du Colombier static int
p_seprint(Msg * m)99*e6dcbf51SDavid du Colombier p_seprint(Msg *m)
100*e6dcbf51SDavid du Colombier {
101*e6dcbf51SDavid du Colombier Hdr *h;
102*e6dcbf51SDavid du Colombier
103*e6dcbf51SDavid du Colombier if(m->pe - m->ps < Hsize)
104*e6dcbf51SDavid du Colombier return 0;
105*e6dcbf51SDavid du Colombier
106*e6dcbf51SDavid du Colombier h = (Hdr*)m->ps;
107*e6dcbf51SDavid du Colombier m->ps += Hsize;
108*e6dcbf51SDavid du Colombier
109*e6dcbf51SDavid du Colombier /* no next protocol */
110*e6dcbf51SDavid du Colombier m->pr = nil;
111*e6dcbf51SDavid du Colombier
112*e6dcbf51SDavid du Colombier m->p = seprint(m->p, m->e, "aflag=%ux errfeat=%ux sectors=%ux cmdstat=%ux lba=%lld",
113*e6dcbf51SDavid du Colombier h->aflag, h->feat, h->sectors, h->cmd, llba(h->lba));
114*e6dcbf51SDavid du Colombier return 0;
115*e6dcbf51SDavid du Colombier }
116*e6dcbf51SDavid du Colombier
117*e6dcbf51SDavid du Colombier Proto aoeata =
118*e6dcbf51SDavid du Colombier {
119*e6dcbf51SDavid du Colombier "aoeata",
120*e6dcbf51SDavid du Colombier p_compile,
121*e6dcbf51SDavid du Colombier p_filter,
122*e6dcbf51SDavid du Colombier p_seprint,
123*e6dcbf51SDavid du Colombier nil,
124*e6dcbf51SDavid du Colombier nil,
125*e6dcbf51SDavid du Colombier p_fields,
126*e6dcbf51SDavid du Colombier defaultframer,
127*e6dcbf51SDavid du Colombier };
128