|
|
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.