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