implemented SIGSEGV

This commit is contained in:
minjaesong
2021-04-23 15:19:20 +09:00
parent 04cafea3c5
commit 48fd10aeed
4 changed files with 29 additions and 8 deletions

1
assets/disk0/segfault.js Normal file
View File

@@ -0,0 +1 @@
sys.poke(66666,66);

View File

@@ -6,6 +6,13 @@ function InterruptedException(m) {
InterruptedException.prototype = Object.create(Error.prototype); InterruptedException.prototype = Object.create(Error.prototype);
InterruptedException.prototype.name = 'InterruptedException'; InterruptedException.prototype.name = 'InterruptedException';
InterruptedException.prototype.constructor = InterruptedException; InterruptedException.prototype.constructor = InterruptedException;
function IllegalAccessException(m) {
this.message = m;
this.stack = (new Error()).stack;
};
IllegalAccessException.prototype = Object.create(Error.prototype);
IllegalAccessException.prototype.name = 'IllegalAccessException';
IllegalAccessException.prototype.constructor = IllegalAccessException;
class SIG { class SIG {
constructor(name, number) { constructor(name, number) {
this.name = "SIG" + name; this.name = "SIG" + name;
@@ -155,9 +162,12 @@ var execApp = (cmdsrc, args) => {
return status; return status;
} }
catch (e) { catch (e) {
serial.printerr(`app execution interrupted -- ${e}\n${e.stack}`); serial.printerr(`app execution interrupted -- ${e}\n${e.stack || "(stack trace unavailable)"}`);
//serial.printerr(Object.entries(e));
if (e instanceof InterruptedException) if (e instanceof InterruptedException)
return SIGTERM; return SIGTERM;
else if (e instanceof IllegalAccessException || `${e}`.startsWith("net.torvald.tsvm.ErrorIllegalAccess"))
return SIGSEGV;
else else
return (undefined == status) ? 0 : status; return (undefined == status) ? 0 : status;
} }

View File

@@ -300,7 +300,7 @@ shell.coreutils = {
} }
}, },
dir: function(args) { dir: function(args) {
var pathstr = (args[1] !== undefined) ? args[1] : "\\"+shell_pwd.join("\\"); var pathstr = (args[1] !== undefined) ? args[1] : shell.getPwdString();
// check if path is valid // check if path is valid
var pathOpened = filesystem.open(CURRENT_DRIVE, pathstr, 'R'); var pathOpened = filesystem.open(CURRENT_DRIVE, pathstr, 'R');
@@ -309,6 +309,15 @@ shell.coreutils = {
var port = filesystem._toPorts(CURRENT_DRIVE)[0] var port = filesystem._toPorts(CURRENT_DRIVE)[0]
com.sendMessage(port, "LIST"); com.sendMessage(port, "LIST");
println(com.pullMessage(port)); println(com.pullMessage(port));
},
cat: function(args) {
var pathstr = (args[1] !== undefined) ? args[1] : shell.getPwdString();
var pathOpened = filesystem.open(CURRENT_DRIVE, pathstr, 'R');
if (!pathOpened) { printerrln("File not found"); return; }
let contents = filesystem.readAll(CURRENT_DRIVE);
// TODO just print out what's there
print(contents);
} }
}; };
shell.coreutils.chdir = shell.coreutils.cd; shell.coreutils.chdir = shell.coreutils.cd;

View File

@@ -10,6 +10,10 @@ import java.io.OutputStream
import java.util.* import java.util.*
import kotlin.math.ceil import kotlin.math.ceil
class ErrorIllegalAccess(vm: VM, addr: Long) : RuntimeException("Segmentation fault at 0x${addr.toString(16).padStart(8, '0')} on VM id ${vm.id}")
/** /**
* A class representing an instance of a Virtual Machine * A class representing an instance of a Virtual Machine
*/ */
@@ -20,9 +24,6 @@ class VM(
val roms: Array<VMProgramRom?> // first ROM must contain the BIOS val roms: Array<VMProgramRom?> // first ROM must contain the BIOS
) { ) {
class ErrorIllegalAccess(val addr: Long) : RuntimeException("Segmentation fault at 0x${addr.toString(16).padStart(8, '0')}")
val id = java.util.Random().nextInt() val id = java.util.Random().nextInt()
val memsize = minOf(USER_SPACE_SIZE, _memsize.toLong()) val memsize = minOf(USER_SPACE_SIZE, _memsize.toLong())
@@ -117,10 +118,10 @@ class VM(
internal fun poke(addr: Long, value: Byte) { internal fun poke(addr: Long, value: Byte) {
val (memspace, offset) = translateAddr(addr) val (memspace, offset) = translateAddr(addr)
if (memspace == null) if (memspace == null)
throw ErrorIllegalAccess(addr) throw ErrorIllegalAccess(this, addr)
else if (memspace is UnsafePtr) { else if (memspace is UnsafePtr) {
if (addr >= memspace.size) if (addr >= memspace.size)
throw ErrorIllegalAccess(addr) throw ErrorIllegalAccess(this, addr)
else else
memspace.set(offset, value) memspace.set(offset, value)
} }
@@ -134,7 +135,7 @@ class VM(
null null
else if (memspace is UnsafePtr) { else if (memspace is UnsafePtr) {
if (addr >= memspace.size) if (addr >= memspace.size)
throw ErrorIllegalAccess(addr) throw ErrorIllegalAccess(this, addr)
else else
memspace.get(offset) memspace.get(offset)
} }