Mercurial > sarpn
annotate arch/io.c @ 12:40af39d064fa
Refactor the arch code
Note: the code, as it is now, does not run even though it compiles
author | Josef 'Jeff' Sipek <jeffpc@josefsipek.net> |
---|---|
date | Thu, 07 Apr 2011 22:07:20 -0400 |
parents | 0451ffa1c3a0 |
children | c75be274ce23 |
rev | line source |
---|---|
12
40af39d064fa
Refactor the arch code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
9
diff
changeset
|
1 #include "channel.h" |
40af39d064fa
Refactor the arch code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
9
diff
changeset
|
2 #include <die.h> |
0 | 3 |
4 /* console I/O functions */ | |
5 | |
6 static struct irb irb; | |
7 static struct orb orb; | |
8 static struct ccw ccw; | |
9 | |
9
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
10 u32 find_dev(int devnum) |
0 | 11 { |
12 struct schib schib; | |
13 u32 sch; | |
14 | |
15 for(sch=0x10000; sch<=0x1ffff; sch++) { | |
16 if (store_sch(sch, &schib)) | |
17 continue; | |
18 | |
19 if (!schib.pmcw.v) | |
20 continue; | |
21 | |
22 if (schib.pmcw.dev_num != devnum) | |
23 continue; | |
24 | |
25 schib.pmcw.e = 1; | |
26 | |
27 if (modify_sch(sch, &schib)) | |
28 continue; | |
29 | |
9
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
30 return sch; |
0 | 31 } |
32 | |
9
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
33 return 0; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
34 } |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
35 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
36 static void enable_cons(int devnum) |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
37 { |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
38 struct psw psw; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
39 u32 sch; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
40 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
41 sch = find_dev(devnum); |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
42 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
43 if (!sch) |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
44 die(); |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
45 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
46 // found it |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
47 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
48 // set up the IO interrupt handler |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
49 psw.ea = 1; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
50 psw.ba = 1; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
51 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
52 asm volatile( |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
53 " larl %%r1,0f\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
54 " stg %%r1,%0\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
55 " brc 15,1f\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
56 /* IO handler code begins */ |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
57 "0:\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
58 " l %%r1,0xb8\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
59 " larl %%r2,irb\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
60 " tsch 0(%%r2)\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
61 " l %%r1,5(%%r2)\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
62 " nill %%r1,0x04\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
63 " brc 8,2f\n" // done? |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
64 " lg %%r1,0x178\n" // yes. |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
65 " bcr 15,%%r1\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
66 "2:\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
67 " l %%r1,5(%%r2)\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
68 " nill %%r1,0x80\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
69 " brc 8,3f\n" // attention? |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
70 " lg %%r1,0x178\n" // yes. |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
71 " bcr 15,%%r1\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
72 "3:\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
73 " lpswe 0x170\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
74 /* IO handler code ends */ |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
75 "1:\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
76 : /* output */ |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
77 "=m" (psw.ptr), |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
78 "=m" (irb) |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
79 : /* input */ |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
80 "a" (&irb) |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
81 : /* clobbered */ |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
82 "r1", "r2" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
83 ); |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
84 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
85 __builtin_memcpy(((void*) 0x1f0), &psw, sizeof(struct psw)); |
0 | 86 } |