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