]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/5e/5e.c
5e: added FPA support
[plan9front.git] / sys / src / cmd / 5e / 5e.c
1 #include <u.h>
2 #include <libc.h>
3 #include <thread.h>
4 #include "dat.h"
5 #include "fns.h"
6
7 int nflag, pflag, bflag;
8 Ref nproc;
9
10 void
11 dump(void)
12 {
13         int i;
14         
15         for(i = 0; i < 16; i++) {
16                 print("R%2d %.8ux", i, P->R[i]);
17                 if((i % 4) == 3) print("\n");
18                 else print("\t");
19         }
20 }
21
22 static void
23 adjustns(void)
24 {
25         if(bind("/arm/bin", "/bin", MREPL) < 0)
26                 sysfatal("bind: %r");
27         if(bind("/rc/bin", "/bin", MAFTER) < 0)
28                 sysfatal("bind: %r");
29         putenv("cputype", "arm");
30         putenv("objtype", "arm");
31 }
32
33 void
34 cleanup(void)
35 {
36         if(P == nil)
37                 return;
38
39         remproc(P);
40         decref(&nproc);
41         freesegs();
42         fddecref(P->fd);
43         if(P->path != nil && decref(P->path) == 0)
44                 free(P->path);
45         free(P);
46 }
47
48 static void
49 usage(void)
50 {
51         fprint(2, "usage: 5e [-npb] text [...]\n");
52         exits(nil);
53 }
54
55 void
56 suicide(char *fmt, ...)
57 {
58         va_list va;
59         char buf[1024];
60         
61         va_start(va, fmt);
62         vsnprint(buf, sizeof(buf), fmt, va);
63         va_end(va);
64         fprint(2, "%s\n", buf);
65         if(!bflag)
66                 exits(buf);
67         abort();
68 }
69
70 int
71 notehandler(void *, char *note)
72 {
73         if(strncmp(note, "sys:", 4) == 0)
74                 return 0;
75         
76         if(strncmp(note, "emu:", 4) == 0)
77                 exits(note);
78
79         addnote(note);
80         return 1;
81 }
82
83 void
84 main(int argc, char **argv)
85 {
86         ARGBEGIN {
87         case 'n': nflag++; break;
88         case 'p': pflag++; break;
89         case 'b': bflag++; break;
90         default: usage();
91         } ARGEND;
92         if(argc < 1)
93                 usage();
94         if(_nprivates < 1)
95                 sysfatal("we don't have privates");
96         if(rfork(RFREND | RFNAMEG | RFENVG) < 0)
97                 sysfatal("rfork: %r");
98         atexit(cleanup);
99         if(nflag)
100                 adjustns();
101         if(pflag)
102                 initfs("armproc", "/proc");
103         initproc();
104         if(loadtext(argv[0], argc, argv) < 0)
105                 sysfatal("%r");
106         atnotify(notehandler, 1);
107         for(;;) {
108                 if(ultraverbose)
109                         dump();
110                 step();
111                 while((P->notein - P->noteout) % NNOTE) {
112                         donote(P->notes[P->noteout % NNOTE], 0);
113                         ainc(&P->noteout);
114                 }
115         }
116 }