mem.c

9000 # 9001 /* 9002 */ 9003 9004 /* 9005 * Memory special file 9006 * minor device 0 is physical memory 9007 * minor device 1 is kernel memory 9008 * minor device 2 is EOF/RATHOLE 9009 */ 9010 9011 #include "../param.h" 9012 #include "../user.h" 9013 #include "../conf.h" 9014 #include "../seg.h" 9015 9016 mmread(dev) 9017 { 9018 register c, bn, on; 9019 int a, d; 9020 9021 if(dev.d_minor == 2) 9022 return; 9023 do { 9024 bn = lshift(u.u_offset, -6); 9025 on = u.u_offset[1] & 077; 9026 a = UISA->r[0]; 9027 d = UISD->r[0]; 9028 spl7(); 9029 UISA->r[0] = bn; 9030 UISD->r[0] = 077406; 9031 if(dev.d_minor == 1) 9032 UISA->r[0] = (ka6-6)->r[(bn>>7)&07] 9033 + (bn & 0177); 9034 c = fuibyte(on); 9035 UISA->r[0] = a; 9036 UISD->r[0] = d; 9037 spl0(); 9038 } while(u.u_error==0 && passc(c)>=0); 9039 } 9040 /* ------------------------ */ 9041 9042 mmwrite(dev) 9043 { 9044 register c, bn, on; 9045 int a, d; 9046 9047 if(dev.d_minor == 2) { 9048 c = u.u_count; 9049 u.u_count = 0; 9050 u.u_base =+ c; 9051 dpadd(u.u_offset, c); 9052 return; 9053 } 9054 for(;;) { 9055 bn = lshift(u.u_offset, -6); 9056 on = u.u_offset[1] & 077; 9057 if ((c=cpass())<0 || u.u_error!=0) 9058 break; 9059 a = UISA->r[0]; 9060 d = UISD->r[0]; 9061 spl7(); 9062 UISA->r[0] = bn; 9063 UISD->r[0] = 077406; 9064 if(dev.d_minor == 1) 9065 UISA->r[0] = (ka6-6)->r[(bn>>7)&07] 9066 + (bn & 0177); 9067 suibyte(on, c); 9068 UISA->r[0] = a; 9069 UISD->r[0] = d; 9070 spl0(); 9071 } 9072 } 9073 /* ------------------------ */ 9074 9075 9076 9077 9078 9079 9080 9081 9082 9083 9084 9085 9086 9087 9088 9089 9090 9091 9092 9093 9094 9095 9096 9097 9098 9099