From a0d3cac4e69101669681a4d8af6dc3e8bd2c9a6a Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Sun, 15 Sep 2019 00:01:26 -0700 Subject: 5659 --- html/020syscalls.cc.html | 108 +++++++++++++++++++++++------------------------ 1 file changed, 54 insertions(+), 54 deletions(-) (limited to 'html/020syscalls.cc.html') diff --git a/html/020syscalls.cc.html b/html/020syscalls.cc.html index 70c529af..2feaf750 100644 --- a/html/020syscalls.cc.html +++ b/html/020syscalls.cc.html @@ -59,14 +59,14 @@ if ('onhashchange' in window) { https://github.com/akkartik/mu/blob/master/020syscalls.cc
   1 :(before "End Initialize Op Names")
-  2 put_new(Name, "cd", "software interrupt (int)");
+  2 put_new(Name, "cd", "software interrupt (int)");
   3 
   4 :(before "End Single-Byte Opcodes")
   5 case 0xcd: {  // int imm8 (software interrupt)
   6   trace(Callstack_depth+1, "run") << "syscall" << end();
-  7   uint8_t code = next();
+  7   uint8_t code = next();
   8   if (code != 0x80) {
-  9     raise << "Unimplemented interrupt code " << HEXBYTE << code << '\n' << end();
+  9     raise << "Unimplemented interrupt code " << HEXBYTE << code << '\n' << end();
  10     raise << "  Only `int 80h` supported for now.\n" << end();
  11     break;
  12   }
@@ -76,91 +76,91 @@ if ('onhashchange' in window) {
  16 
  17 :(code)
  18 void process_int80() {
- 19   switch (Reg[EAX].u) {
+ 19   switch (Reg[EAX].u) {
  20   case 1:
- 21     exit(/*exit code*/Reg[EBX].u);
+ 21     exit(/*exit code*/Reg[EBX].u);
  22     break;
  23   case 3:
- 24     trace(Callstack_depth+1, "run") << "read: " << Reg[EBX].u << ' ' << Reg[ECX].u << ' ' << Reg[EDX].u << end();
- 25     Reg[EAX].i = read(/*file descriptor*/Reg[EBX].u, /*memory buffer*/mem_addr_u8(Reg[ECX].u), /*size*/Reg[EDX].u);
- 26     trace(Callstack_depth+1, "run") << "result: " << Reg[EAX].i << end();
- 27     if (Reg[EAX].i == -1) raise << "read: " << strerror(errno) << '\n' << end();
+ 24     trace(Callstack_depth+1, "run") << "read: " << Reg[EBX].u << ' ' << Reg[ECX].u << ' ' << Reg[EDX].u << end();
+ 25     Reg[EAX].i = read(/*file descriptor*/Reg[EBX].u, /*memory buffer*/mem_addr_u8(Reg[ECX].u), /*size*/Reg[EDX].u);
+ 26     trace(Callstack_depth+1, "run") << "result: " << Reg[EAX].i << end();
+ 27     if (Reg[EAX].i == -1) raise << "read: " << strerror(errno) << '\n' << end();
  28     break;
  29   case 4:
- 30     trace(Callstack_depth+1, "run") << "write: " << Reg[EBX].u << ' ' << Reg[ECX].u << ' ' << Reg[EDX].u << end();
- 31     trace(Callstack_depth+1, "run") << Reg[ECX].u << " => " << mem_addr_string(Reg[ECX].u, Reg[EDX].u) << end();
- 32     Reg[EAX].i = write(/*file descriptor*/Reg[EBX].u, /*memory buffer*/mem_addr_u8(Reg[ECX].u), /*size*/Reg[EDX].u);
- 33     trace(Callstack_depth+1, "run") << "result: " << Reg[EAX].i << end();
- 34     if (Reg[EAX].i == -1) raise << "write: " << strerror(errno) << '\n' << end();
+ 30     trace(Callstack_depth+1, "run") << "write: " << Reg[EBX].u << ' ' << Reg[ECX].u << ' ' << Reg[EDX].u << end();
+ 31     trace(Callstack_depth+1, "run") << Reg[ECX].u << " => " << mem_addr_string(Reg[ECX].u, Reg[EDX].u) << end();
+ 32     Reg[EAX].i = write(/*file descriptor*/Reg[EBX].u, /*memory buffer*/mem_addr_u8(Reg[ECX].u), /*size*/Reg[EDX].u);
+ 33     trace(Callstack_depth+1, "run") << "result: " << Reg[EAX].i << end();
+ 34     if (Reg[EAX].i == -1) raise << "write: " << strerror(errno) << '\n' << end();
  35     break;
  36   case 5: {
- 37     check_flags(ECX);
- 38     check_mode(EDX);
- 39     trace(Callstack_depth+1, "run") << "open: " << Reg[EBX].u << ' ' << Reg[ECX].u << end();
- 40     trace(Callstack_depth+1, "run") << Reg[EBX].u << " => " << mem_addr_kernel_string(Reg[EBX].u) << end();
- 41     Reg[EAX].i = open(/*filename*/mem_addr_kernel_string(Reg[EBX].u), /*flags*/Reg[ECX].u, /*mode*/0640);
- 42     trace(Callstack_depth+1, "run") << "result: " << Reg[EAX].i << end();
- 43     if (Reg[EAX].i == -1) raise << "open: " << strerror(errno) << '\n' << end();
+ 37     check_flags(ECX);
+ 38     check_mode(EDX);
+ 39     trace(Callstack_depth+1, "run") << "open: " << Reg[EBX].u << ' ' << Reg[ECX].u << end();
+ 40     trace(Callstack_depth+1, "run") << Reg[EBX].u << " => " << mem_addr_kernel_string(Reg[EBX].u) << end();
+ 41     Reg[EAX].i = open(/*filename*/mem_addr_kernel_string(Reg[EBX].u), /*flags*/Reg[ECX].u, /*mode*/0640);
+ 42     trace(Callstack_depth+1, "run") << "result: " << Reg[EAX].i << end();
+ 43     if (Reg[EAX].i == -1) raise << "open: " << strerror(errno) << '\n' << end();
  44     break;
  45   }
  46   case 6:
- 47     trace(Callstack_depth+1, "run") << "close: " << Reg[EBX].u << end();
- 48     Reg[EAX].i = close(/*file descriptor*/Reg[EBX].u);
- 49     trace(Callstack_depth+1, "run") << "result: " << Reg[EAX].i << end();
- 50     if (Reg[EAX].i == -1) raise << "close: " << strerror(errno) << '\n' << end();
+ 47     trace(Callstack_depth+1, "run") << "close: " << Reg[EBX].u << end();
+ 48     Reg[EAX].i = close(/*file descriptor*/Reg[EBX].u);
+ 49     trace(Callstack_depth+1, "run") << "result: " << Reg[EAX].i << end();
+ 50     if (Reg[EAX].i == -1) raise << "close: " << strerror(errno) << '\n' << end();
  51     break;
  52   case 8:
- 53     check_mode(ECX);
- 54     trace(Callstack_depth+1, "run") << "creat: " << Reg[EBX].u << end();
- 55     trace(Callstack_depth+1, "run") << Reg[EBX].u << " => " << mem_addr_kernel_string(Reg[EBX].u) << end();
- 56     Reg[EAX].i = creat(/*filename*/mem_addr_kernel_string(Reg[EBX].u), /*mode*/0640);
- 57     trace(Callstack_depth+1, "run") << "result: " << Reg[EAX].i << end();
- 58     if (Reg[EAX].i == -1) raise << "creat: " << strerror(errno) << '\n' << end();
+ 53     check_mode(ECX);
+ 54     trace(Callstack_depth+1, "run") << "creat: " << Reg[EBX].u << end();
+ 55     trace(Callstack_depth+1, "run") << Reg[EBX].u << " => " << mem_addr_kernel_string(Reg[EBX].u) << end();
+ 56     Reg[EAX].i = creat(/*filename*/mem_addr_kernel_string(Reg[EBX].u), /*mode*/0640);
+ 57     trace(Callstack_depth+1, "run") << "result: " << Reg[EAX].i << end();
+ 58     if (Reg[EAX].i == -1) raise << "creat: " << strerror(errno) << '\n' << end();
  59     break;
  60   case 10:
- 61     trace(Callstack_depth+1, "run") << "unlink: " << Reg[EBX].u << end();
- 62     trace(Callstack_depth+1, "run") << Reg[EBX].u << " => " << mem_addr_kernel_string(Reg[EBX].u) << end();
- 63     Reg[EAX].i = unlink(/*filename*/mem_addr_kernel_string(Reg[EBX].u));
- 64     trace(Callstack_depth+1, "run") << "result: " << Reg[EAX].i << end();
- 65     if (Reg[EAX].i == -1) raise << "unlink: " << strerror(errno) << '\n' << end();
+ 61     trace(Callstack_depth+1, "run") << "unlink: " << Reg[EBX].u << end();
+ 62     trace(Callstack_depth+1, "run") << Reg[EBX].u << " => " << mem_addr_kernel_string(Reg[EBX].u) << end();
+ 63     Reg[EAX].i = unlink(/*filename*/mem_addr_kernel_string(Reg[EBX].u));
+ 64     trace(Callstack_depth+1, "run") << "result: " << Reg[EAX].i << end();
+ 65     if (Reg[EAX].i == -1) raise << "unlink: " << strerror(errno) << '\n' << end();
  66     break;
  67   case 38:
- 68     trace(Callstack_depth+1, "run") << "rename: " << Reg[EBX].u << " -> " << Reg[ECX].u << end();
- 69     trace(Callstack_depth+1, "run") << Reg[EBX].u << " => " << mem_addr_kernel_string(Reg[EBX].u) << end();
- 70     trace(Callstack_depth+1, "run") << Reg[ECX].u << " => " << mem_addr_kernel_string(Reg[ECX].u) << end();
- 71     Reg[EAX].i = rename(/*old filename*/mem_addr_kernel_string(Reg[EBX].u), /*new filename*/mem_addr_kernel_string(Reg[ECX].u));
- 72     trace(Callstack_depth+1, "run") << "result: " << Reg[EAX].i << end();
- 73     if (Reg[EAX].i == -1) raise << "rename: " << strerror(errno) << '\n' << end();
+ 68     trace(Callstack_depth+1, "run") << "rename: " << Reg[EBX].u << " -> " << Reg[ECX].u << end();
+ 69     trace(Callstack_depth+1, "run") << Reg[EBX].u << " => " << mem_addr_kernel_string(Reg[EBX].u) << end();
+ 70     trace(Callstack_depth+1, "run") << Reg[ECX].u << " => " << mem_addr_kernel_string(Reg[ECX].u) << end();
+ 71     Reg[EAX].i = rename(/*old filename*/mem_addr_kernel_string(Reg[EBX].u), /*new filename*/mem_addr_kernel_string(Reg[ECX].u));
+ 72     trace(Callstack_depth+1, "run") << "result: " << Reg[EAX].i << end();
+ 73     if (Reg[EAX].i == -1) raise << "rename: " << strerror(errno) << '\n' << end();
  74     break;
  75   case 90:  // mmap: allocate memory outside existing segment allocations
  76     trace(Callstack_depth+1, "run") << "mmap: allocate new segment" << end();
  77     // Ignore most arguments for now: address hint, protection flags, sharing flags, fd, offset.
  78     // We only support anonymous maps.
- 79     Reg[EAX].u = new_segment(/*length*/read_mem_u32(Reg[EBX].u+0x4));
- 80     trace(Callstack_depth+1, "run") << "result: " << Reg[EAX].u << end();
+ 79     Reg[EAX].u = new_segment(/*length*/read_mem_u32(Reg[EBX].u+0x4));
+ 80     trace(Callstack_depth+1, "run") << "result: " << Reg[EAX].u << end();
  81     break;
  82   default:
- 83     raise << HEXWORD << EIP << ": unimplemented syscall " << Reg[EAX].u << '\n' << end();
+ 83     raise << HEXWORD << EIP << ": unimplemented syscall " << Reg[EAX].u << '\n' << end();
  84   }
  85 }
  86 
  87 // SubX is oblivious to file permissions, directories, symbolic links, terminals, and much else besides.
  88 // Also ignoring any concurrency considerations for now.
- 89 void check_flags(int reg) {
- 90   uint32_t flags = Reg[reg].u;
+ 89 void check_flags(int reg) {
+ 90   uint32_t flags = Reg[reg].u;
  91   if (flags != ((flags & O_RDONLY) | (flags & O_WRONLY))) {
- 92     cerr << HEXWORD << EIP << ": most POSIX flags to the open() syscall are not supported. Just O_RDONLY and O_WRONLY for now. Zero concurrent access support.\n";
+ 92     cerr << HEXWORD << EIP << ": most POSIX flags to the open() syscall are not supported. Just O_RDONLY and O_WRONLY for now. Zero concurrent access support.\n";
  93     exit(1);
  94   }
  95   if ((flags & O_RDONLY) && (flags & O_WRONLY)) {
- 96     cerr << HEXWORD << EIP << ": can't open a file for both reading and writing at once. See http://man7.org/linux/man-pages/man2/open.2.html.\n";
+ 96     cerr << HEXWORD << EIP << ": can't open a file for both reading and writing at once. See http://man7.org/linux/man-pages/man2/open.2.html.\n";
  97     exit(1);
  98   }
  99 }
 100 
-101 void check_mode(int reg) {
-102   if (Reg[reg].u != 0600) {
-103     cerr << HEXWORD << EIP << ": SubX is oblivious to file permissions; register " << reg << " must be 0.\n";
+101 void check_mode(int reg) {
+102   if (Reg[reg].u != 0600) {
+103     cerr << HEXWORD << EIP << ": SubX is oblivious to file permissions; register " << reg << " must be 0.\n";
 104     exit(1);
 105   }
 106 }
@@ -175,9 +175,9 @@ if ('onhashchange' in window) {
 115   uint32_t result = (Segments_allocated_above - length) & 0xff000000;  // same number of zeroes as SEGMENT_ALIGNMENT
 116   if (result <= START_HEAP) {
 117     raise << "Allocated too many segments; the VM ran out of memory. "
-118           << "Maybe SEGMENT_ALIGNMENT can be smaller?\n" << die();
+118           << "Maybe SEGMENT_ALIGNMENT can be smaller?\n" << die();
 119   }
-120   Mem.push_back(vma(result, result+length));
+120   Mem.push_back(vma(result, result+length));
 121   Segments_allocated_above = result;
 122   return result;
 123 }
-- 
cgit 1.4.1-2-gfad0