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
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
|
build/user/initcode.out: file format elf64-littleriscv
Disassembly of section .text:
0000000000000000 <_Z6strlenPKc>:
#include "user/user.h"
int strlen(const char *s)
{
int n = 0;
while (s[n])
0: 00054783 lbu a5,0(a0)
4: cf81 beqz a5,1c <_Z6strlenPKc+0x1c>
6: 0505 addi a0,a0,1
8: 87aa mv a5,a0
a: 0007c703 lbu a4,0(a5)
e: 86be mv a3,a5
10: 0785 addi a5,a5,1
12: ff65 bnez a4,a <_Z6strlenPKc+0xa>
n++;
14: 40a6853b subw a0,a3,a0
18: 2505 addiw a0,a0,1
1a: 8082 ret
int n = 0;
1c: 4501 li a0,0
return n;
}
1e: 8082 ret
0000000000000020 <_Z5printPKc>:
while (s[n])
20: 00054783 lbu a5,0(a0)
void print(const char *s)
{
24: 85aa mv a1,a0
while (s[n])
26: cf89 beqz a5,40 <_Z5printPKc+0x20>
28: 00150693 addi a3,a0,1
2c: 87b6 mv a5,a3
2e: 0007c703 lbu a4,0(a5)
32: 863e mv a2,a5
34: 0785 addi a5,a5,1
36: ff65 bnez a4,2e <_Z5printPKc+0xe>
n++;
38: 9e15 subw a2,a2,a3
3a: 2605 addiw a2,a2,1
write(1, s, strlen(s));
3c: 4505 li a0,1
3e: a491 j 282 <write>
int n = 0;
40: 4601 li a2,0
write(1, s, strlen(s));
42: 4505 li a0,1
44: ac3d j 282 <write>
0000000000000046 <_Z9print_inti>:
void print_int(int val)
{
char buf[16];
int i = 0;
if (val == 0)
46: c159 beqz a0,cc <_Z9print_inti+0x86>
{
48: 7139 addi sp,sp,-64
4a: f822 sd s0,48(sp)
4c: fc06 sd ra,56(sp)
4e: f426 sd s1,40(sp)
50: f04a sd s2,32(sp)
52: 842a mv s0,a0
{
print("0");
return;
}
if (val < 0)
54: 06054163 bltz a0,b6 <_Z9print_inti+0x70>
58: 081c addi a5,sp,16
{
5a: 873e mv a4,a5
print("-");
val = -val;
}
while (val > 0)
{
buf[i++] = (val % 10) + '0';
5c: 4629 li a2,10
5e: 02c466bb remw a3,s0,a2
62: 85ba mv a1,a4
while (val > 0)
64: 0705 addi a4,a4,1
val /= 10;
66: 02c4443b divw s0,s0,a2
buf[i++] = (val % 10) + '0';
6a: 0306869b addiw a3,a3,48
6e: fed70fa3 sb a3,-1(a4)
while (val > 0)
72: f475 bnez s0,5e <_Z9print_inti+0x18>
74: 9d9d subw a1,a1,a5
76: 0015871b addiw a4,a1,1
7a: fff7059b addiw a1,a4,-1
7e: fff78493 addi s1,a5,-1
82: 1582 slli a1,a1,0x20
84: 94ba add s1,s1,a4
86: 9181 srli a1,a1,0x20
88: 00e78433 add s0,a5,a4
8c: 8c8d sub s1,s1,a1
8e: 00f10913 addi s2,sp,15
}
while (i > 0)
{
char c = buf[--i];
92: fff44783 lbu a5,-1(s0)
write(1, &c, 1);
96: 4605 li a2,1
98: 85ca mv a1,s2
9a: 4505 li a0,1
while (i > 0)
9c: 147d addi s0,s0,-1
char c = buf[--i];
9e: 00f107a3 sb a5,15(sp)
write(1, &c, 1);
a2: 1e0000ef jal 282 <write>
while (i > 0)
a6: fe9416e3 bne s0,s1,92 <_Z9print_inti+0x4c>
}
}
aa: 70e2 ld ra,56(sp)
ac: 7442 ld s0,48(sp)
ae: 74a2 ld s1,40(sp)
b0: 7902 ld s2,32(sp)
b2: 6121 addi sp,sp,64
b4: 8082 ret
write(1, s, strlen(s));
b6: 4605 li a2,1
b8: 00000597 auipc a1,0x0
bc: 26058593 addi a1,a1,608 # 318 <putc+0x16>
c0: 4505 li a0,1
c2: 1c0000ef jal 282 <write>
val = -val;
c6: 4080043b negw s0,s0
while (val > 0)
ca: b779 j 58 <_Z9print_inti+0x12>
write(1, s, strlen(s));
cc: 4605 li a2,1
ce: 00000597 auipc a1,0x0
d2: 24258593 addi a1,a1,578 # 310 <putc+0xe>
d6: 4505 li a0,1
d8: a26d j 282 <write>
00000000000000da <_Z4passv>:
while (s[n])
da: 00000697 auipc a3,0x0
de: 24668693 addi a3,a3,582 # 320 <putc+0x1e>
void pass() { print(" -> [PASS]\n"); }
e2: 87b6 mv a5,a3
while (s[n])
e4: 0017c703 lbu a4,1(a5)
e8: 863e mv a2,a5
ea: 0785 addi a5,a5,1
ec: ff65 bnez a4,e4 <_Z4passv+0xa>
n++;
ee: 9e15 subw a2,a2,a3
write(1, s, strlen(s));
f0: 2605 addiw a2,a2,1
f2: 00000597 auipc a1,0x0
f6: 22e58593 addi a1,a1,558 # 320 <putc+0x1e>
fa: 4505 li a0,1
fc: a259 j 282 <write>
00000000000000fe <_Z4failv>:
void fail()
{
fe: 1141 addi sp,sp,-16
100: 00000697 auipc a3,0x0
104: 23068693 addi a3,a3,560 # 330 <putc+0x2e>
108: e406 sd ra,8(sp)
10a: 87b6 mv a5,a3
while (s[n])
10c: 0017c703 lbu a4,1(a5)
110: 863e mv a2,a5
112: 0785 addi a5,a5,1
114: ff65 bnez a4,10c <_Z4failv+0xe>
n++;
116: 9e15 subw a2,a2,a3
write(1, s, strlen(s));
118: 2605 addiw a2,a2,1
11a: 00000597 auipc a1,0x0
11e: 21658593 addi a1,a1,534 # 330 <putc+0x2e>
122: 4505 li a0,1
124: 15e000ef jal 282 <write>
print(" -> [FAIL]\n");
exit(1);
}
128: 60a2 ld ra,8(sp)
exit(1);
12a: 4505 li a0,1
}
12c: 0141 addi sp,sp,16
exit(1);
12e: aa15 j 262 <exit>
0000000000000130 <main>:
int main()
{
130: 1141 addi sp,sp,-16
print("\n=== Lume OS Full Validation ===\n");
132: 00000517 auipc a0,0x0
136: 20e50513 addi a0,a0,526 # 340 <putc+0x3e>
{
13a: e406 sd ra,8(sp)
13c: e022 sd s0,0(sp)
print("\n=== Lume OS Full Validation ===\n");
13e: ee3ff0ef jal 20 <_Z5printPKc>
print("[TEST 1] Write\n");
142: 00000517 auipc a0,0x0
146: 22650513 addi a0,a0,550 # 368 <putc+0x66>
14a: ed7ff0ef jal 20 <_Z5printPKc>
print(" System call write is working.");
14e: 00000517 auipc a0,0x0
152: 22a50513 addi a0,a0,554 # 378 <putc+0x76>
156: ecbff0ef jal 20 <_Z5printPKc>
void pass() { print(" -> [PASS]\n"); }
15a: 00000517 auipc a0,0x0
15e: 1c650513 addi a0,a0,454 # 320 <putc+0x1e>
162: ebfff0ef jal 20 <_Z5printPKc>
pass();
print("[TEST 2] GetPID\n");
166: 00000517 auipc a0,0x0
16a: 23250513 addi a0,a0,562 # 398 <putc+0x96>
16e: eb3ff0ef jal 20 <_Z5printPKc>
int parent_pid = getpid();
172: 170000ef jal 2e2 <getpid>
176: 842a mv s0,a0
print(" Parent PID: ");
178: 00000517 auipc a0,0x0
17c: 23850513 addi a0,a0,568 # 3b0 <putc+0xae>
180: ea1ff0ef jal 20 <_Z5printPKc>
print_int(parent_pid);
184: 8522 mv a0,s0
186: ec1ff0ef jal 46 <_Z9print_inti>
if (parent_pid > 0)
18a: 0c805563 blez s0,254 <main+0x124>
void pass() { print(" -> [PASS]\n"); }
18e: 00000517 auipc a0,0x0
192: 19250513 addi a0,a0,402 # 320 <putc+0x1e>
196: e8bff0ef jal 20 <_Z5printPKc>
pass();
else
fail();
print("[TEST 3] Fork, Wait & COW\n");
19a: 00000517 auipc a0,0x0
19e: 22650513 addi a0,a0,550 # 3c0 <putc+0xbe>
1a2: e7fff0ef jal 20 <_Z5printPKc>
int val = 100;
int pid = fork();
1a6: 0b4000ef jal 25a <fork>
if (pid < 0)
1aa: 04054363 bltz a0,1f0 <main+0xc0>
{
print(" Fork Failed\n");
fail();
}
if (pid == 0)
1ae: e929 bnez a0,200 <main+0xd0>
{
print(" [Child] PID: ");
1b0: 00000517 auipc a0,0x0
1b4: 24050513 addi a0,a0,576 # 3f0 <putc+0xee>
1b8: e69ff0ef jal 20 <_Z5printPKc>
print_int(getpid());
1bc: 126000ef jal 2e2 <getpid>
1c0: e87ff0ef jal 46 <_Z9print_inti>
print("\n");
1c4: 00000517 auipc a0,0x0
1c8: 23c50513 addi a0,a0,572 # 400 <putc+0xfe>
1cc: e55ff0ef jal 20 <_Z5printPKc>
print(" [Child] Data corruption!\n");
exit(1);
}
val = 200;
print(" [Child] Modified val to 200. Exiting.\n");
1d0: 00000517 auipc a0,0x0
1d4: 23850513 addi a0,a0,568 # 408 <putc+0x106>
1d8: e49ff0ef jal 20 <_Z5printPKc>
exit(0);
1dc: 4501 li a0,0
1de: 084000ef jal 262 <exit>
print_int(val);
fail();
}
}
print("\n=== All Tests Passed ===\n");
1e2: 00000517 auipc a0,0x0
1e6: 2ce50513 addi a0,a0,718 # 4b0 <putc+0x1ae>
1ea: e37ff0ef jal 20 <_Z5printPKc>
while (1)
1ee: a001 j 1ee <main+0xbe>
print(" Fork Failed\n");
1f0: 00000517 auipc a0,0x0
1f4: 1f050513 addi a0,a0,496 # 3e0 <putc+0xde>
1f8: e29ff0ef jal 20 <_Z5printPKc>
fail();
1fc: f03ff0ef jal fe <_Z4failv>
print(" [Parent] Waiting for child...\n");
200: 00000517 auipc a0,0x0
204: 23850513 addi a0,a0,568 # 438 <putc+0x136>
208: e19ff0ef jal 20 <_Z5printPKc>
int child_pid = wait(0);
20c: 4501 li a0,0
20e: 05c000ef jal 26a <wait>
212: 842a mv s0,a0
print(" [Parent] Child ");
214: 00000517 auipc a0,0x0
218: 24c50513 addi a0,a0,588 # 460 <putc+0x15e>
21c: e05ff0ef jal 20 <_Z5printPKc>
print_int(child_pid);
220: 8522 mv a0,s0
222: e25ff0ef jal 46 <_Z9print_inti>
print(" exited.\n");
226: 00000517 auipc a0,0x0
22a: 25250513 addi a0,a0,594 # 478 <putc+0x176>
22e: df3ff0ef jal 20 <_Z5printPKc>
print(" [Parent] Check val (Expect 100): ");
232: 00000517 auipc a0,0x0
236: 25650513 addi a0,a0,598 # 488 <putc+0x186>
23a: de7ff0ef jal 20 <_Z5printPKc>
print_int(val);
23e: 06400513 li a0,100
242: e05ff0ef jal 46 <_Z9print_inti>
void pass() { print(" -> [PASS]\n"); }
246: 00000517 auipc a0,0x0
24a: 0da50513 addi a0,a0,218 # 320 <putc+0x1e>
24e: dd3ff0ef jal 20 <_Z5printPKc>
252: bf41 j 1e2 <main+0xb2>
fail();
254: eabff0ef jal fe <_Z4failv>
258: b789 j 19a <main+0x6a>
000000000000025a <fork>:
name: \
li a7, SYS_ ## name; \
ecall; \
ret
SYSCALL(fork)
25a: 4889 li a7,2
25c: 00000073 ecall
260: 8082 ret
0000000000000262 <exit>:
SYSCALL(exit)
262: 488d li a7,3
264: 00000073 ecall
268: 8082 ret
000000000000026a <wait>:
SYSCALL(wait)
26a: 4891 li a7,4
26c: 00000073 ecall
270: 8082 ret
0000000000000272 <pipe>:
SYSCALL(pipe)
272: 4895 li a7,5
274: 00000073 ecall
278: 8082 ret
000000000000027a <read>:
SYSCALL(read)
27a: 4899 li a7,6
27c: 00000073 ecall
280: 8082 ret
0000000000000282 <write>:
SYSCALL(write)
282: 48c5 li a7,17
284: 00000073 ecall
288: 8082 ret
000000000000028a <close>:
SYSCALL(close)
28a: 48d9 li a7,22
28c: 00000073 ecall
290: 8082 ret
0000000000000292 <kill>:
SYSCALL(kill)
292: 489d li a7,7
294: 00000073 ecall
298: 8082 ret
000000000000029a <exec>:
SYSCALL(exec)
29a: 48a1 li a7,8
29c: 00000073 ecall
2a0: 8082 ret
00000000000002a2 <open>:
SYSCALL(open)
2a2: 48c1 li a7,16
2a4: 00000073 ecall
2a8: 8082 ret
00000000000002aa <mknod>:
SYSCALL(mknod)
2aa: 48c9 li a7,18
2ac: 00000073 ecall
2b0: 8082 ret
00000000000002b2 <unlink>:
SYSCALL(unlink)
2b2: 48cd li a7,19
2b4: 00000073 ecall
2b8: 8082 ret
00000000000002ba <fstat>:
SYSCALL(fstat)
2ba: 48a5 li a7,9
2bc: 00000073 ecall
2c0: 8082 ret
00000000000002c2 <link>:
SYSCALL(link)
2c2: 48d1 li a7,20
2c4: 00000073 ecall
2c8: 8082 ret
00000000000002ca <mkdir>:
SYSCALL(mkdir)
2ca: 48d5 li a7,21
2cc: 00000073 ecall
2d0: 8082 ret
00000000000002d2 <chdir>:
SYSCALL(chdir)
2d2: 48a9 li a7,10
2d4: 00000073 ecall
2d8: 8082 ret
00000000000002da <dup>:
SYSCALL(dup)
2da: 48ad li a7,11
2dc: 00000073 ecall
2e0: 8082 ret
00000000000002e2 <getpid>:
SYSCALL(getpid)
2e2: 48b1 li a7,12
2e4: 00000073 ecall
2e8: 8082 ret
00000000000002ea <sbrk>:
SYSCALL(sbrk)
2ea: 48b5 li a7,13
2ec: 00000073 ecall
2f0: 8082 ret
00000000000002f2 <sleep>:
SYSCALL(sleep)
2f2: 48b9 li a7,14
2f4: 00000073 ecall
2f8: 8082 ret
00000000000002fa <uptime>:
SYSCALL(uptime)
2fa: 48bd li a7,15
2fc: 00000073 ecall
300: 8082 ret
0000000000000302 <putc>:
302: 4885 li a7,1
304: 00000073 ecall
308: 8082 ret
|