summaryrefslogtreecommitdiffstats
path: root/src/arch/e1/core/start.S
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/e1/core/start.S')
-rw-r--r--src/arch/e1/core/start.S111
1 files changed, 111 insertions, 0 deletions
diff --git a/src/arch/e1/core/start.S b/src/arch/e1/core/start.S
new file mode 100644
index 000000000..691f39bdb
--- /dev/null
+++ b/src/arch/e1/core/start.S
@@ -0,0 +1,111 @@
+/*
+ * Derived from the Hyperstone's library source code.
+ * Copyright (C) 2002-2003 GDT, Yannis Mitsos <gmitsos@telecom.ntua.gr>
+ * George Thanos <gthanos@telecom.ntua.gr>
+ */
+ .global Priority ; Task-Priority
+ .global _Stack1Size ; Size of hardware stack
+ .global _Stack2Size ; Size of aggregate stack
+ .global _Stack1Base ; Base of hardware stack
+ .global _Stack2Base ; Base of aggregate stack
+ .global _Mem0HeapBase ; Base of Heap in Mem0
+ .global _Mem1HeapBase ; Base of Heap in Mem1
+
+ .global _init_peripherals
+ .global _main
+ .global Main
+
+ .global __exit
+ .global __fmode
+ .global __MaxArgCount
+
+ .text
+BasePtrs:
+ .weak G6Base,G7Base,G8Base,G9Base,G10Base,G11Base,G12Base,G13Base
+ .long G6Base,G7Base,G8Base,G9Base,G10Base,G11Base,G12Base,G13Base
+BasePtrsEnd:
+HeapPtrs:
+ .long _Mem0HeapBase
+ .long _Mem1HeapBase
+HeapPtrsEnd:
+
+__MaxArgCount:
+ .long 32
+__StandAloneMode:
+ .long 0 ; 0 indicate stand alone mode
+
+;============================================================================;
+; Startup-Code ;
+;============================================================================;
+ .data
+
+; do not change the order of: __argc,..
+__argc:
+ .long 0
+__argv:
+ .long 0
+__IsShell:
+ .long 1
+ErrorLevel:
+ .long 0
+__lab:
+ .long 0
+__fmode:
+ .long 0x4000 ; O_TEXT attribute
+
+_isa_drivers:
+ .long 0
+
+_isa_drivers_end:
+ .long 0
+
+
+ .text
+Main:
+StartUp:
+ FRAME L5, L0
+ MOVI L2, __bss_start__ ; clear the .bss segment
+0: CMPI L2, __bss_end__
+ BHE 0f
+ DBR 0b
+ STW.P L2, 0
+0: SUM L2, PC, BasePtrs-$ ; Load BasePtrs G6-G13
+ LDD.P L2, G6
+ LDD.P L2, G8
+; LDD.P L2, G10
+ LDD.P L2, G12
+ MOVI L2, 1
+ SUM L3, PC, __StandAloneMode-$
+ STW.R L3, L2
+
+ ;----------------------------------------------------------------;
+ ; Call main C function ;
+ ;----------------------------------------------------------------;
+2: LDW.D PC, L2, __argc - $ ; pass count of arguments to main
+ LDW.D PC, L3, __argv - $ ; pass pointer array to main
+ CALL L4, PC, _init_peripherals - $
+ CALL L4, PC, _main - $ ; --> Call Main-Program
+ CHK PC, PC ; trap if execution arrives here
+
+__exit:
+ FRAME L5, L1
+ STW.D PC, L0, ErrorLevel - $ ; Store ERRORLEVEL
+
+ CHK PC, PC
+ RET PC, L1
+
+ .global ___main
+___main:
+ FRAME L4, L1
+ MOVI L3, 2
+ STW.D PC, L3, __StandAloneMode-$
+ RET PC, L1 ; does not return
+
+ .section _GOT_
+ .long Main+4 ; OnCreate
+ .long Main+8 ; OnError
+ .long BasePtrs ; G6
+ .long BasePtrs+4 ; G7
+ .long BasePtrs+8 ; G8
+
+ .END