17 /* environment variable indices for getenv */
18 /* auto_action might be 1; it looks that way. */
19 Promenv_booted_dev = 4,
20 Promenv_booted_file = 6,
21 Promenv_booted_osflags = 8,
22 Promenv_tty_dev = 0xf,
27 static uvlong dispatchf;
38 hwrpb = (Hwrpb*)0x10000000;
40 crb = (Hwcrb*)((ulong)hwrpb + hwrpb->crboff);
41 p = (Procdesc*)(crb->dispatchva);
43 clk2ms = hwrpb->cfreq/1000;
45 print("\nAlpha Plan 9 secondary boot\n");
46 if (hwrpb->rev >= 6) {
47 dsr = (Hwdsr*)((ulong)hwrpb + hwrpb->dsroff);
48 s = (char*)dsr + dsr->sysnameoff + 8;
54 dispatch(uvlong r16, uvlong r17, uvlong r18, uvlong r19, uvlong r20)
56 return gendispatch(dispatchf, r16, r17, r18, r19, r20);
66 ret = dispatch(0x10, (uvlong)s, n, 0, 0);
77 ret = dispatch(0x11, fd, 0, 0, 0);
84 devread(int fd, uchar *buf, int len, int blkno)
88 ret = dispatch(0x13, fd, len, (uvlong)buf, blkno);
95 devwrite(int fd, uchar *buf, int len, int blkno)
99 ret = dispatch(0x14, fd, len, (uvlong)buf, blkno);
109 static char buf[256];
111 /* old upper bound was 0x100, which blows up on my 164LX. 50 works. */
112 for (id = 1; id < 50; id++) {
113 n = dispatch(Promop_getenv, id, (uvlong)buf, sizeof(buf)-1, 0);
117 print("dispatch failed at id %d\n", id);
121 print("env[0x%x]: %s\n", id, buf);
129 static char buf[256];
131 if (strcmp(name, "booted_dev") == 0)
132 id = Promenv_booted_dev;
135 n = dispatch(Promop_getenv, id, (uvlong)buf, sizeof(buf), 0);
143 putstrn0(char *s, int n)
149 ret = dispatch(2, 0, (uvlong)s, n, 0);
159 putstrn(char *s, int n)
166 p = memchr(s, '\n', n);
179 snprint(char *s, int n, char *fmt, ...)
184 n = doprint(s, s+n, fmt, arg) - s;
190 sprint(char *s, char *fmt, ...)
196 n = doprint(s, s+PRINTSIZE, fmt, arg) - s;
202 print(char *fmt, ...)
209 n = doprint(buf, buf+sizeof(buf), fmt, arg) - buf;
217 panic(char *fmt, ...)
223 strcpy(buf, "panic: ");
225 n = doprint(buf+strlen(buf), buf+sizeof(buf), fmt, arg) - buf;
235 static ulong last, wrap;
242 return (((uvlong)wrap << 32) + cnt)/clk2ms;