about summary refs log tree commit diff stats
path: root/subx/020syscalls.cc
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2018-08-13 20:44:28 -0700
committerKartik Agaram <vc@akkartik.com>2018-08-13 21:01:04 -0700
commit5cec03b41425940ff5fa73c10ea8fb402a3b5ffa (patch)
treed4459386da0712f7b5a8f1ad930bd2feb3c0042f /subx/020syscalls.cc
parentfd7198b290e9d8c619a2e69a9bb0404855d1dc13 (diff)
downloadmu-5cec03b41425940ff5fa73c10ea8fb402a3b5ffa.tar.gz
4520 - several syscalls for files
Diffstat (limited to 'subx/020syscalls.cc')
-rw-r--r--subx/020syscalls.cc78
1 files changed, 78 insertions, 0 deletions
diff --git a/subx/020syscalls.cc b/subx/020syscalls.cc
index 177ba6f1..2f6ca994 100644
--- a/subx/020syscalls.cc
+++ b/subx/020syscalls.cc
@@ -21,12 +21,90 @@ void process_int80() {
     exit(/*exit code*/Reg[EBX].u);
     break;
   case 3:
+    trace(91, "run") << "read: " << Reg[EBX].u << ' ' << Reg[ECX].u << '/' << mem_addr_string(Reg[ECX].u) << ' ' << Reg[EDX].u << end();
     Reg[EAX].i = read(/*file descriptor*/Reg[EBX].u, /*memory buffer*/mem_addr_u8(Reg[ECX].u), /*size*/Reg[EDX].u);
+    trace(91, "run") << "result: " << Reg[EAX].i << end();
+    if (Reg[EAX].i == -1) raise << strerror(errno) << '\n' << end();
     break;
   case 4:
+    trace(91, "run") << "write: " << Reg[EBX].u << ' ' << Reg[ECX].u << '/' << mem_addr_string(Reg[ECX].u) << ' ' << Reg[EDX].u << end();
     Reg[EAX].i = write(/*file descriptor*/Reg[EBX].u, /*memory buffer*/mem_addr_u8(Reg[ECX].u), /*size*/Reg[EDX].u);
+    trace(91, "run") << "result: " << Reg[EAX].i << end();
+    if (Reg[EAX].i == -1) raise << strerror(errno) << '\n' << end();
+    break;
+  case 5: {
+    check_flags(ECX);
+    check_mode(EDX);
+    trace(91, "run") << "open: " << Reg[EBX].u << '/' << mem_addr_string(Reg[EBX].u) << ' ' << Reg[ECX].u << end();
+    Reg[EAX].i = open(/*filename*/mem_addr_string(Reg[EBX].u), /*flags*/Reg[ECX].u, /*mode*/0640);
+    trace(91, "run") << "result: " << Reg[EAX].i << end();
+    if (Reg[EAX].i == -1) raise << strerror(errno) << '\n' << end();
+    break;
+  }
+  case 6:
+    trace(91, "run") << "close: " << Reg[EBX].u << end();
+    Reg[EAX].i = close(/*file descriptor*/Reg[EBX].u);
+    trace(91, "run") << "result: " << Reg[EAX].i << end();
+    if (Reg[EAX].i == -1) raise << strerror(errno) << '\n' << end();
+    break;
+  case 8:
+    check_mode(ECX);
+    trace(91, "run") << "creat: " << Reg[EBX].u << '/' << mem_addr_string(Reg[EBX].u) << end();
+    Reg[EAX].i = creat(/*filename*/mem_addr_string(Reg[EBX].u), /*mode*/0640);
+    trace(91, "run") << "result: " << Reg[EAX].i << end();
+    if (Reg[EAX].i == -1) raise << strerror(errno) << '\n' << end();
+    break;
+  case 10:
+    trace(91, "run") << "unlink: " << Reg[EBX].u << '/' << mem_addr_string(Reg[EBX].u) << end();
+    Reg[EAX].i = unlink(/*filename*/mem_addr_string(Reg[EBX].u));
+    trace(91, "run") << "result: " << Reg[EAX].i << end();
+    if (Reg[EAX].i == -1) raise << strerror(errno) << '\n' << end();
+    break;
+  case 38:
+    trace(91, "run") << "rename: " << Reg[EBX].u << '/' << mem_addr_string(Reg[EBX].u) << " -> " << Reg[ECX].u << '/' << mem_addr_string(Reg[ECX].u) << end();
+    Reg[EAX].i = rename(/*old filename*/mem_addr_string(Reg[EBX].u), /*new filename*/mem_addr_string(Reg[ECX].u));
+    trace(91, "run") << "result: " << Reg[EAX].i << end();
+    if (Reg[EAX].i == -1) raise << strerror(errno) << '\n' << end();
+    break;
+  case 45:  // brk: modify size of data segment
+    trace(91, "run") << "grow data segment to " << Reg[EBX].u << end();
+    resize_mem(/*new end address*/Reg[EBX].u);
     break;
   default:
     raise << HEXWORD << EIP << ": unimplemented syscall " << Reg[EAX].u << '\n' << end();
   }
 }
+
+// SubX is oblivious to file permissions, directories, symbolic links, terminals, and much else besides.
+// Also ignoring any concurrency considerations for now.
+void check_flags(int reg) {
+  uint32_t flags = Reg[reg].u;
+  if (flags != ((flags & O_RDONLY) | (flags & O_WRONLY))) {
+    raise << 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" << end();
+    exit(1);
+  }
+  if ((flags & O_RDONLY) && (flags & O_WRONLY)) {
+    raise << 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" << end();
+    exit(1);
+  }
+}
+
+void check_mode(int reg) {
+  if (Reg[reg].u != 0600) {
+    raise << HEXWORD << EIP << ": SubX is oblivious to file permissions; register " << reg << " must be 0.\n" << end();
+    exit(1);
+  }
+}
+
+void resize_mem(uint32_t new_end_address) {
+  if (new_end_address < Mem_offset) {
+    raise << HEXWORD << EIP << ": can't shrink data segment to before code segment\n";
+    return;
+  }
+  int32_t new_size = new_end_address - Mem_offset;
+  if (new_size < SIZE(Mem)) {
+    raise << HEXWORD << EIP << ": shrinking data segment is not supported.\n" << end();
+    return;
+  }
+  Mem.resize(new_size);  // will throw exception on failure
+}
<vc@akkartik.com> 2022-07-11 23:03:27 -0700 committer Kartik K. Agaram <vc@akkartik.com> 2022-07-11 23:18:26 -0700 make colors easier to edit' href='/akkartik/text.love/commit/select.lua?id=3850fbac35bb5679ed58753491db4a4cd2267a73'>3850fba ^
876d629 ^
3850fba ^
e2696fc ^
1bdb931 ^


0d52962 ^
2ae9cac ^
0d52962 ^
188bbc7 ^

0d52962 ^
188bbc7 ^
2ae9cac ^
0d52962 ^
188bbc7 ^

0d52962 ^
188bbc7 ^
0d52962 ^

2ae9cac ^
188bbc7 ^
0d52962 ^
48b7de4 ^
2859063 ^
0d52962 ^




2ae9cac ^
188bbc7 ^

2ae9cac ^
4ad51d6 ^


2ae9cac ^
188bbc7 ^

5b91af1 ^
2ae9cac ^
5b91af1 ^
0d52962 ^

2ae9cac ^
188bbc7 ^



0d52962 ^







188bbc7 ^




1d3c9f4 ^
44fb3ec ^
188bbc7 ^
0d52962 ^
b95206f ^
188bbc7 ^

0d52962 ^

188bbc7 ^
0d52962 ^


188bbc7 ^
0d52962 ^
188bbc7 ^
d61b5df ^
0d52962 ^
188bbc7 ^
0d52962 ^

188bbc7 ^




0d52962 ^







188bbc7 ^

0d52962 ^
188bbc7 ^
0d52962 ^

188bbc7 ^
0d52962 ^
188bbc7 ^

0d52962 ^

188bbc7 ^
e77157d ^
0d52962 ^
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178