Finished all parts
parent
b0db63c1d4
commit
a114fc9a74
Binary file not shown.
|
@ -158,12 +158,8 @@ public class UserProcess {
|
||||||
*/
|
*/
|
||||||
public int readVirtualMemory(int vaddr, byte[] data, int offset, int length)
|
public int readVirtualMemory(int vaddr, byte[] data, int offset, int length)
|
||||||
{
|
{
|
||||||
//TODO: Boundary checks
|
|
||||||
//Lib.assertTrue(offset >= 0 && length >= 0 && offset+length <= data.length);
|
|
||||||
|
|
||||||
byte[] memory = Machine.processor().getMemory();
|
byte[] memory = Machine.processor().getMemory();
|
||||||
|
|
||||||
// for now, just assume that virtual addresses equal physical addresses
|
|
||||||
int vpn=vaddr/pageSize;
|
int vpn=vaddr/pageSize;
|
||||||
if(vaddr<0||vpn>=numPages)
|
if(vaddr<0||vpn>=numPages)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -176,7 +172,6 @@ public class UserProcess {
|
||||||
if(amount<=0)
|
if(amount<=0)
|
||||||
break;
|
break;
|
||||||
System.arraycopy(memory,pageTable[i].ppn*pageSize+ppn_offs,data,offset,amount);
|
System.arraycopy(memory,pageTable[i].ppn*pageSize+ppn_offs,data,offset,amount);
|
||||||
//System.arraycopy(data,offset,memory,vaddr,amount);
|
|
||||||
offset+=amount;
|
offset+=amount;
|
||||||
vaddr+=amount;
|
vaddr+=amount;
|
||||||
length-=amount;
|
length-=amount;
|
||||||
|
@ -214,16 +209,8 @@ public class UserProcess {
|
||||||
*/
|
*/
|
||||||
public int writeVirtualMemory(int vaddr, byte[] data, int offset, int length)
|
public int writeVirtualMemory(int vaddr, byte[] data, int offset, int length)
|
||||||
{
|
{
|
||||||
//TODO: Boundary checks
|
|
||||||
//Lib.assertTrue(offset >= 0 && length >= 0 && offset+length <= data.length);
|
|
||||||
|
|
||||||
byte[] memory = Machine.processor().getMemory();
|
byte[] memory = Machine.processor().getMemory();
|
||||||
|
|
||||||
// for now, just assume that virtual addresses equal physical addresses
|
|
||||||
/*
|
|
||||||
if (vaddr < 0 || vaddr >= memory.length)
|
|
||||||
return 0;
|
|
||||||
*/
|
|
||||||
int vpn=vaddr/pageSize;
|
int vpn=vaddr/pageSize;
|
||||||
if(vaddr<0||vpn>=numPages)
|
if(vaddr<0||vpn>=numPages)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -463,6 +450,13 @@ public class UserProcess {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private byte[] bytearray_create_safe(int size)
|
||||||
|
{
|
||||||
|
if(size<0||size>numPages*pageSize)
|
||||||
|
return null;
|
||||||
|
return new byte[size];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle a syscall exception. Called by <tt>handleException()</tt>. The
|
* Handle a syscall exception. Called by <tt>handleException()</tt>. The
|
||||||
* <i>syscall</i> argument identifies which syscall the user executed:
|
* <i>syscall</i> argument identifies which syscall the user executed:
|
||||||
|
@ -493,8 +487,6 @@ public class UserProcess {
|
||||||
*/
|
*/
|
||||||
public int handleSyscall(int syscall, int a0, int a1, int a2, int a3)
|
public int handleSyscall(int syscall, int a0, int a1, int a2, int a3)
|
||||||
{
|
{
|
||||||
//TODO: Bullet-proof?
|
|
||||||
//System.out.println("System Call: "+syscall);
|
|
||||||
String fn;
|
String fn;
|
||||||
String[] argz;
|
String[] argz;
|
||||||
byte[] buf;
|
byte[] buf;
|
||||||
|
@ -513,9 +505,11 @@ public class UserProcess {
|
||||||
fn=readVirtualMemoryString(a0,256);
|
fn=readVirtualMemoryString(a0,256);
|
||||||
if(fn!=null&&fn.lastIndexOf('.')!=-1&&fn.substring(fn.lastIndexOf('.')).equals(".coff"))
|
if(fn!=null&&fn.lastIndexOf('.')!=-1&&fn.substring(fn.lastIndexOf('.')).equals(".coff"))
|
||||||
{
|
{
|
||||||
buf=new byte[8*a1];
|
buf=bytearray_create_safe(4*a1);
|
||||||
|
if(buf==null)
|
||||||
|
return -1;
|
||||||
argz=new String[a1];
|
argz=new String[a1];
|
||||||
readVirtualMemory(a2,buf,0,8*a1);
|
readVirtualMemory(a2,buf,0,4*a1);
|
||||||
tmp=0;
|
tmp=0;
|
||||||
for(int i=0;i<4*a1;i++)
|
for(int i=0;i<4*a1;i++)
|
||||||
{
|
{
|
||||||
|
@ -523,6 +517,8 @@ public class UserProcess {
|
||||||
if(i%4==3)
|
if(i%4==3)
|
||||||
{
|
{
|
||||||
argz[i/4]=readVirtualMemoryString(tmp,256);
|
argz[i/4]=readVirtualMemoryString(tmp,256);
|
||||||
|
if(argz[i/4]==null)
|
||||||
|
argz[i/4]=new String();
|
||||||
tmp=0;
|
tmp=0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -537,7 +533,6 @@ public class UserProcess {
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
System.out.println("Bloody hell");
|
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
case syscallJoin:
|
case syscallJoin:
|
||||||
|
@ -550,7 +545,6 @@ public class UserProcess {
|
||||||
tmp=UserKernel.process_fin.get(a0);
|
tmp=UserKernel.process_fin.get(a0);
|
||||||
if(tmp==1)
|
if(tmp==1)
|
||||||
{
|
{
|
||||||
//Already finished
|
|
||||||
val=UserKernel.process_return.get(a0);
|
val=UserKernel.process_return.get(a0);
|
||||||
UserKernel.process_lock.V();
|
UserKernel.process_lock.V();
|
||||||
}
|
}
|
||||||
|
@ -580,11 +574,10 @@ public class UserProcess {
|
||||||
fn=readVirtualMemoryString(a0,256);
|
fn=readVirtualMemoryString(a0,256);
|
||||||
if(fn!=null)
|
if(fn!=null)
|
||||||
{
|
{
|
||||||
//System.out.println("I am going to create a file name "+fn);
|
|
||||||
OpenFile tf=ThreadedKernel.fileSystem.open(fn,true);
|
OpenFile tf=ThreadedKernel.fileSystem.open(fn,true);
|
||||||
if(tf==null)
|
if(tf==null)
|
||||||
return -1;
|
return -1;
|
||||||
for(int i=2;i<16;i++)
|
for(int i=0;i<16;i++)
|
||||||
if(descs[i]==null)
|
if(descs[i]==null)
|
||||||
{
|
{
|
||||||
descs[i]=tf;
|
descs[i]=tf;
|
||||||
|
@ -592,14 +585,12 @@ public class UserProcess {
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
System.out.println("Bloody hell");
|
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
case syscallOpen:
|
case syscallOpen:
|
||||||
fn=readVirtualMemoryString(a0,256);
|
fn=readVirtualMemoryString(a0,256);
|
||||||
if(fn!=null)
|
if(fn!=null)
|
||||||
{
|
{
|
||||||
//System.out.println("I am going to open a file name "+fn);
|
|
||||||
OpenFile tf=ThreadedKernel.fileSystem.open(fn,false);
|
OpenFile tf=ThreadedKernel.fileSystem.open(fn,false);
|
||||||
if(tf==null)
|
if(tf==null)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -611,28 +602,35 @@ public class UserProcess {
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
System.out.println("Bloody hell");
|
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
case syscallRead:
|
case syscallRead:
|
||||||
|
if(a0<0||a0>=16)
|
||||||
|
return -1;
|
||||||
if(descs[a0]==null)
|
if(descs[a0]==null)
|
||||||
return -1;
|
return -1;
|
||||||
buf=new byte[a2];
|
buf=bytearray_create_safe(a2);
|
||||||
|
if(buf==null)
|
||||||
|
return -1;
|
||||||
len=descs[a0].read(buf,0,a2);
|
len=descs[a0].read(buf,0,a2);
|
||||||
if(len<0)
|
if(len<0)
|
||||||
return -1;
|
return -1;
|
||||||
return writeVirtualMemory(a1,buf,0,len);
|
return writeVirtualMemory(a1,buf,0,len);
|
||||||
|
|
||||||
case syscallWrite:
|
case syscallWrite:
|
||||||
|
if(a0<0||a0>=16)
|
||||||
|
return -1;
|
||||||
if(descs[a0]==null)
|
if(descs[a0]==null)
|
||||||
return -1;
|
return -1;
|
||||||
buf=new byte[a2];
|
buf=bytearray_create_safe(a2);
|
||||||
|
if(buf==null)
|
||||||
|
return -1;
|
||||||
len=readVirtualMemory(a1,buf,0,a2);
|
len=readVirtualMemory(a1,buf,0,a2);
|
||||||
//return descs[a0].write(buf,0,len);
|
return descs[a0].write(buf,0,len);
|
||||||
len=descs[a0].write(buf,0,len);
|
|
||||||
return len;
|
|
||||||
|
|
||||||
case syscallClose:
|
case syscallClose:
|
||||||
|
if(a0<0||a0>=16)
|
||||||
|
return -1;
|
||||||
if(descs[a0]!=null)
|
if(descs[a0]!=null)
|
||||||
descs[a0].close();
|
descs[a0].close();
|
||||||
descs[a0]=null;
|
descs[a0]=null;
|
||||||
|
|
Loading…
Reference in New Issue