summaryrefslogtreecommitdiff
path: root/user/lib/entry.S
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2025-04-08 10:39:48 -0400
committerFreya Murphy <freya@freyacat.org>2025-04-08 10:39:48 -0400
commit8a19547957a86bed3f58c9abc1ac218d04698faf (patch)
treeed7ccc6f3a8902915dfe6c9bf763fc45d752b3c4 /user/lib/entry.S
parentfmt (diff)
downloadcomus-8a19547957a86bed3f58c9abc1ac218d04698faf.tar.gz
comus-8a19547957a86bed3f58c9abc1ac218d04698faf.tar.bz2
comus-8a19547957a86bed3f58c9abc1ac218d04698faf.zip
break apart c libaray
Diffstat (limited to 'user/lib/entry.S')
-rw-r--r--user/lib/entry.S25
1 files changed, 25 insertions, 0 deletions
diff --git a/user/lib/entry.S b/user/lib/entry.S
new file mode 100644
index 0000000..87ad9c7
--- /dev/null
+++ b/user/lib/entry.S
@@ -0,0 +1,25 @@
+//
+// user-level startup routine
+//
+ .text
+ .globl _start
+ .globl main
+ .globl exit
+
+// entry point - this is where the kernel starts us running
+_start:
+ // we immediately call main()
+ call main
+
+ // if we come back from that, it means the user
+ // program didn't call exit(), in which case the
+ // value returned from main() is the exit status
+
+ // push that value onto the stack and call exit()
+ subl $12, %esp
+ pushl %eax
+ call exit
+
+ // if we come back from that, something bad has
+ // happened, so we just lock up
+1: jmp 1b