|
|
1.1 root 1: /* $Header: /usr/src/sys/i8086/src/RCS/md1.c,v 1.2 88/08/05 15:34:26 src Exp $ */
2: /* (lgl-
3: * The information contained herein is a trade secret of Mark Williams
4: * Company, and is confidential information. It is provided under a
5: * license agreement, and may be copied or disclosed only under the
6: * terms of that agreement. Any reproduction or disclosure of this
7: * material without the express written authorization of Mark Williams
8: * Company or persuant to the license agreement is unlawful.
9: *
10: * COHERENT Version 2.3.37
11: * Copyright (c) 1982, 1983, 1984.
12: * An unpublished work by Mark Williams Company, Chicago.
13: * All rights reserved.
14: -lgl) */
15: /*
16: * 8086/8088 Coherent.
17: * All machines.
18: * Machine dependent stuff.
19: *
20: * $Log: /usr/src/sys/i8086/src/RCS/md1.c,v $
21: * Revision 1.2 88/08/05 15:34:26 src
22: * mproto(), segload(), and msetsys() functions simplified.
23: *
24: * Revision 1.1 88/03/24 17:39:43 src
25: * Initial revision
26: *
27: * 88/03/10 Allan Cornish /usr/src/sys/coh/proc.c
28: * Numerous temporary fixes due to AMD 286 chip being buggy in protected mode.
29: * These partial fixes will be removed once all CPU's are replaced.
30: *
31: * 88/02/13 Allan Cornish /usr/src/sys/i8086/src/md1.c
32: * segload() now checks for regl[OIP] being system code segment.
33: * iAPX-286 protected mode interrupt gates enable interrupts momentarily.
34: *
35: * 88/01/21 Allan Cornish /usr/src/sys/i8086/src/md1.c
36: * Segments are now de-associated from processes before freeing the segment.
37: *
38: * 87/11/05 Allan Cornish /usr/src/sys/i8086/src/md1.c
39: * New seg struct now used to allow extended addressing.
40: *
41: * 87/09/21 Allan Cornish /usr/src/sys/i8086/src/md1.c
42: * mproto() and setload() modified to support loadable driver processes.
43: */
44: #include <sys/coherent.h>
45: #include <sys/i8086.h>
46: #include <sys/clist.h>
47: #include <errno.h>
48: #include <sys/inode.h>
49: #include <sys/proc.h>
50: #include <sys/seg.h>
51: #include <signal.h>
52: #include <sys/uproc.h>
53:
54: /*
55: * Calculate segmentation for a
56: * new program. If there is a stack segment
57: * present merge it into the data segment and
58: * relocate the argument list.
59: * Make sure that the changes are reflected in the u.u_segl array
60: * which sproto sets up.
61: */
62: mproto()
63: {
64: register PROC *pp;
65: register SEG *dsp;
66: register SEG *ssp;
67: register SEG *csp;
68: fsize_t ds;
69: fsize_t ss;
70: unsigned int so;
71: unsigned int *up;
72: unsigned int v;
73:
74: pp = SELF;
75:
76: dsp = pp->p_segp[SIPDATA];
77:
78: if ( ((pp->p_flags & PFKERN) == 0)
79: && ((ssp=pp->p_segp[SISTACK]) != NULL) ) {
80: ds = dsp->s_size;
81: ss = ssp->s_size;
82: so = ds + ss;
83: if (seggrow(dsp, (fsize_t)so) == 0)
84: return (0);
85: plrcopy( ssp->s_paddr, dsp->s_paddr + ds, ss);
86: pp->p_segp[SISTACK] = NULL;
87: sfree(ssp);
88: u.u_sproto.mp_svb = ds;
89: u.u_sproto.mp_svl = so;
90: if (u.u_argp != NULL) {
91: abase(FP_SEL(dsp->s_faddr));
92: up = u.u_argp += so;
93: --up;
94: while (ageti(--up) != NULL)
95: ;
96: up -= 2+u.u_argc;
97: while ((v=ageti(up)) != NULL)
98: aputi(up++, v+so);
99: while ((v=ageti(++up)) != NULL)
100: aputi(up, v+so);
101: }
102: return (sproto()); /* Recurse to fix u.u_segl */
103: }
104:
105: /*
106: * Shared code, private code, or kernel code [csp == NULL].
107: * NOTE: Combined code/data no longer supported.
108: */
109: if ( (csp = pp->p_segp[SISTEXT]) == NULL )
110: csp = pp->p_segp[SIPTEXT];
111:
112: /*
113: * Special case if no code/data segment specified.
114: */
115: u.u_sproto.mp_cbp = (csp != NULL) ? &FP_SEL(csp->s_faddr) : &scs;
116: u.u_sproto.mp_dbp = (dsp != NULL) ? &FP_SEL(dsp->s_faddr) : &sds;
117: u.u_sproto.mp_csl = (csp != NULL) ? csp->s_size - 1 : 0;
118: u.u_sproto.mp_dsl = (dsp != NULL) ? dsp->s_size - 1 : 0;
119:
120: return (1);
121: }
122:
123: /*
124: * Load up segmentation registers.
125: */
126: segload()
127: {
128: register unsigned *ip;
129: register unsigned s;
130:
131: ucs = *u.u_sproto.mp_cbp;
132: uds = *u.u_sproto.mp_dbp;
133: ucl = u.u_sproto.mp_csl;
134: udl = u.u_sproto.mp_dsl;
135:
136: ip = regl;
137: ip[OCS] = ucs;
138: ip[ODS] = s = uds;
139: ip[OES] = s;
140: ip[OSS] = s;
141: }
142:
143: /*
144: * Set up a new process.
145: */
146: msetusr(ip, sp)
147: vaddr_t sp;
148: vaddr_t ip;
149: {
150: regl[OIP] = ip;
151: regl[OSP] = sp + u.u_sproto.mp_svl;
152: }
153:
154: /*
155: * Set up initial context for a system process.
156: * System processes run at depth 1, just like any
157: * user process. This is necessary to make sure that
158: * the machine state save is correctly handled, just
159: * in case the clock hits a kernel process executing
160: * out of the IBM ROM.
161: */
162: msetsys(mp, fn, us)
163: register MCON *mp;
164: int (*fn)();
165: saddr_t us;
166: {
167: mp->mc_sp = (int)(&u) + UPASIZE - 32;
168: mp->mc_pc = fn;
169: mp->mc_fw = 0;
170: mp->mc_depth = 1;
171: }
172:
173: /*
174: * Set the given address in the user area to the given value if it is
175: * okay to do so.
176: */
177: msetuof(a, v)
178: register int a;
179: {
180: if (a<UPASIZE+OBP*2 || a>UPASIZE+OFW*2)
181: return (0);
182: if (a == UPASIZE+OCS*2)
183: return (0);
184: if (a == UPASIZE+ODS*2)
185: return (0);
186: if (a == UPASIZE+OES*2)
187: return (0);
188: if (a == UPASIZE+OSS*2)
189: return (0);
190: if (a == UPASIZE+OID*2) /* Protect trap id */
191: return (0);
192: if (a == UPASIZE+ORA*2)
193: return (0); /* Protect trap return link */
194: *((int *)((int)&u+a)) = v;
195: return (1);
196: }
197:
198: /*
199: * Cause a signal routine to be executed.
200: */
201: msigint(n, f)
202: {
203: register int *usp;
204:
205: usp = regl[OSP];
206: putuwd(--usp, regl[OFW]);
207: putuwd(--usp, regl[OIP]);
208: putuwd(--usp, n);
209: regl[OFW] &= ~MFTTB;
210: regl[OIP] = f;
211: regl[OSP] = usp;
212: if (n != SIGTRAP)
213: u.u_sfunc[n-1] = SIG_DFL;
214: }
215:
216: /*
217: * Cause the next instruction to single step.
218: */
219: msigsin()
220: {
221: regl[OFW] |= MFTTB;
222: }
223:
224: /*
225: * Fix up context.
226: */
227: mfixcon(pp)
228: PROC *pp;
229: {
230: }
231:
232: /*
233: * Idle kernel process.
234: */
235: idle()
236: {
237: for (;;) {
238: disflag = 1;
239: _idle();
240: }
241: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.