Explorar el Código

Combined Linux.Glue modules

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@8184 8c9fc860-2736-0410-a75d-ab315db34111
negelef hace 7 años
padre
commit
1c057da0a1
Se han modificado 3 ficheros con 146 adiciones y 264 borrados
  1. 144 7
      source/Linux.Glue.Mod
  2. 0 255
      source/Linux.I386.Glue.Mod
  3. 2 2
      source/Release.Tool

+ 144 - 7
source/Linux.AMD64.Glue.Mod → source/Linux.Glue.Mod

@@ -28,6 +28,112 @@ VAR
 
 	PROCEDURE {INITIAL, NOPAF} EntryPoint;
 	CODE
+	#IF I386 THEN
+		; ELF header
+		DB 07FH, 'ELF', 1, 1, 1, 0
+		DD 0, 0
+		DW 02, 03
+		DD 01
+		DD entry + base; program entry point
+		DD elfheadersize
+		DD 0
+		DD 0
+		DW elfheadersize
+		DW 20H
+		DW 3 ; #program header table entries
+		DW 0
+		DW 0
+		DW 0
+
+		elfheadersize:
+
+		; program header
+		DD 1
+		DD 0
+		DD base; 
+		DD base; 
+		DD @last - base; segment size (file)
+		DD @last - base; segment size (memory)
+		DD 07
+		DD 1000H; alignment
+		
+		; interpreter header
+		DD 3
+		DD interpretername; interpreter name offset
+		DD interpretername + base; interpreter name 
+		DD interpretername + base; interpreter name
+		DD interpretername_end - interpretername ; interpreter name length
+		DD interpretername_end - interpretername ; interpreter name length
+		DD 4H
+		DD 1H
+
+		; dynamic header
+		DD 02H
+		DD dynamicsection 
+		DD dynamicsection + base
+		DD dynamicsection + base
+		DD dynamicsection_end - dynamicsection ; size of dynamic section
+		DD dynamicsection_end - dynamicsection ; size of dynamic section
+		DD 06H
+		DD 04H
+
+		dynamicsection:
+		DD 05H, base + stringtable
+		DD 06H, symboltablebegin + base
+		DD 07H, dlsymrelocation + base
+		DD 08H, dlsymrelocation_end-dlsymrelocation ; size (relocationtable)
+		DD 09H, 0CH
+		DD 0AH, stringtable_end - stringtable; size (stringtable)
+		DD 0BH, 10H
+		
+		DD 01H, libname - stringtable; position of libname
+		DD 0H, 0H ; sentinel
+		dynamicsection_end:		
+		
+	 	dlsymrelocation:
+		DD @dlsym
+		DB 01H
+		DB 01H, 00H, 00H; index of the symbol
+		DD 0H
+		dlsymrelocation_end:
+
+		stringtable:
+		DB 0H ; sentinel
+
+		libname:
+		DB 'libdl.so.2', 0
+		
+		dlsymname:
+		DB 'dlsym', 0
+		
+		
+		stringtable_end:
+		
+		ALIGN 4
+		symboltablebegin:
+		DD	0;
+		DD	0
+		DD	0
+		DB	0
+		DB	0
+		DW 0
+		
+		; dlsym symbol
+		DD dlsymname - stringtable; position of dlsymname
+		DD	0
+		DD	0
+		DB	12H ; info: global + function
+		DB 0
+		DW	0
+
+		interpretername:
+		DB '/lib/ld-linux.so.2', 0
+		interpretername_end:
+
+		ALIGN 4
+
+		entry:
+	#ELSIF AMD64 THEN
 		; ELF header
 		DB 07FH, 'ELF', 2, 1, 1, 0
 		DD 0, 0
@@ -132,6 +238,9 @@ VAR
 		ALIGN 8
 
 		entry:
+	#ELSE
+		unimplemented
+	#END
 	END EntryPoint;
 
 	(*
@@ -144,12 +253,23 @@ VAR
 
 	PROCEDURE {NOPAF} putc*(file: ADDRESS; c: CHAR);
 	CODE
+	#IF I386 THEN
+		MOV EAX, 4
+		MOV EBX, [ESP + 8]
+		LEA ECX, [ESP + 4]
+		MOV EDX, 1
+		INT 80H
+		RET
+	#ELSIF AMD64 THEN
 		MOV EAX, 1
 		MOV RDI, [RSP + 16]
 		LEA RSI, [RSP + 8]
 		MOV RDX, 1
 		SYSCALL
 		RET
+	#ELSE
+		unimplemented
+	#END
 	END putc;
 
 	PROCEDURE Dlsym*(handle: ADDRESS; CONST name: ARRAY OF CHAR; adr: ADDRESS);
@@ -185,12 +305,26 @@ VAR
 	
 	PROCEDURE {INITIAL,NOPAF} Init0;
 	BEGIN
-		(*initial stack layout:
-			argc at rsp
-			argv at rsp+8
-			0 at rsp+8+argc*8
-			env at rsp+8+argc*8+8      =   (2+argc)<<3 + rsp*)
-		CODE{SYSTEM.AMD64}
+		CODE
+		#IF I386 THEN
+			; argc at esp
+			; argv at esp+4
+			; 0 at esp+4+argc*4
+			; env at esp+4+argc*4+4 = (2+argc)<<2 + esp
+			MOV EAX, [ESP]
+			MOV argc, EAX
+			LEA EAX, [ESP+4]
+			MOV argv, EAX
+			MOV EAX, [ESP]
+			ADD EAX, 2
+			SHL EAX, 2
+			ADD EAX, ESP
+			MOV environ, EAX
+		#ELSIF AMD64 THEN
+			; argc at rsp
+			; argv at rsp+8
+			; 0 at rsp+8+argc*8
+			; env at rsp+8+argc*8+8 = (2+argc)<<3 + rsp
 			MOV RAX, [RSP]
 			MOV argc, RAX
 			LEA RAX, [RSP+8]
@@ -200,6 +334,9 @@ VAR
 			SHL RAX, 3
 			ADD RAX, RSP
 			MOV environ, RAX
+		#ELSE
+			unimplemented
+		#END
 		END;
 		Init;
 	END Init0;
@@ -212,7 +349,7 @@ System.FreeDownTo FoxIntermediateBackend ~
 
 System.DoCommands
 	Compiler.Compile -p=Linux32
-		I386.Builtins.Mod Trace.Mod Linux.I386.Glue.Mod Linux.I386.Unix.Mod Unix.I386.Machine.Mod Heaps.Mod  Modules.Mod 
+		I386.Builtins.Mod Trace.Mod Linux.Glue.Mod Linux.I386.Unix.Mod Unix.I386.Machine.Mod Heaps.Mod  Modules.Mod 
 		Unix.Objects.Mod 
 		Unix.Kernel.Mod KernelLog.Mod Plugins.Mod Streams.Mod 
 		Pipes.Mod Commands.Mod I386.Reals.Mod Reflection.Mod TrapWriters.Mod CRC.Mod SystemVersion.Mod 

+ 0 - 255
source/Linux.I386.Glue.Mod

@@ -1,255 +0,0 @@
-(* Minimal ELF header for self contained linux Oberon programs *)
-(* Copyright (c) Felix Friedrich, ETH Zürich *)
-
-MODULE Glue; 
-
-IMPORT SYSTEM, Trace;
-
-CONST 
-	base* = 08048000H;
-	debug* = {};
-VAR
-	last-: RECORD END; (* empty variable linked to end of kernel *)
-	
-	baseAdr*: ADDRESS;
-	endAdr*: ADDRESS;
-	
-	dlsym-	: PROCEDURE {C} ( handle: ADDRESS; name: ADDRESS): ADDRESS;
-	dlopen-	: PROCEDURE {C} ( pathname: ADDRESS; mode: LONGINT ): ADDRESS;
-	dlclose-	: PROCEDURE {C} ( handle: ADDRESS );
-	exit-		: PROCEDURE {C} (status: LONGINT);
-
-	stackBottom-	: ADDRESS;	(* of main thread *)
-
-
-	argc-: WORD; 
-	argv-: ADDRESS;
-	environ-: ADDRESS;
-
-	PROCEDURE {INITIAL, NOPAF} EntryPoint;
-	CODE
-		; ELF header
-		DB 07FH, 'ELF', 1, 1, 1, 0
-		DD 0, 0
-		DW 02, 03
-		DD 01
-		DD entry + base; program entry point
-		DD elfheadersize
-		DD 0
-		DD 0
-		DW elfheadersize
-		DW 20H
-		DW 3 ; #program header table entries
-		DW 0
-		DW 0
-		DW 0
-
-		elfheadersize:
-
-		; program header
-		DD 1
-		DD 0
-		DD base; 
-		DD base; 
-		DD @last - base; segment size (file)
-		DD @last - base; segment size (memory)
-		DD 07
-		DD 1000H; alignment
-		
-		; interpreter header
-		DD 3
-		DD interpretername; interpreter name offset
-		DD interpretername + base; interpreter name 
-		DD interpretername + base; interpreter name
-		DD interpretername_end - interpretername ; interpreter name length
-		DD interpretername_end - interpretername ; interpreter name length
-		DD 4H
-		DD 1H
-
-		; dynamic header
-		DD 02H
-		DD dynamicsection 
-		DD dynamicsection + base
-		DD dynamicsection + base
-		DD dynamicsection_end - dynamicsection ; size of dynamic section
-		DD dynamicsection_end - dynamicsection ; size of dynamic section
-		DD 06H
-		DD 04H
-
-		dynamicsection:
-		DD 05H, base + stringtable
-		DD 06H, symboltablebegin + base
-		DD 07H, dlsymrelocation + base
-		DD 08H, dlsymrelocation_end-dlsymrelocation ; size (relocationtable)
-		DD 09H, 0CH
-		DD 0AH, stringtable_end - stringtable; size (stringtable)
-		DD 0BH, 10H
-		
-		DD 01H, libname - stringtable; position of libname
-		DD 0H, 0H ; sentinel
-		dynamicsection_end:		
-		
-	 	dlsymrelocation:
-		DD @dlsym
-		DB 01H
-		DB 01H, 00H, 00H; index of the symbol
-		DD 0H
-		dlsymrelocation_end:
-
-		stringtable:
-		DB 0H ; sentinel
-
-		libname:
-		DB 'libdl.so.2', 0
-		
-		dlsymname:
-		DB 'dlsym', 0
-		
-		
-		stringtable_end:
-		
-		ALIGN 4
-		symboltablebegin:
-		DD	0;
-		DD	0
-		DD	0
-		DB	0
-		DB	0
-		DW 0
-		
-		; dlsym symbol
-		DD dlsymname - stringtable; position of dlsymname
-		DD	0
-		DD	0
-		DB	12H ; info: global + function
-		DB 0
-		DW	0
-
-		interpretername:
-		DB '/lib/ld-linux.so.2', 0
-		interpretername_end:
-
-		ALIGN 4
-
-		entry:
-	END EntryPoint;
-
-	(*
-	PROCEDURE {FINAL} ExitPoint;
-	BEGIN
-		Trace.String("exiting"); Trace.Ln;
-		exit(0);
-	END ExitPoint;
-	*)
-
-	PROCEDURE {NOPAF} putc*(file: ADDRESS; c: CHAR);
-	CODE
-		MOV EAX, 4
-		MOV EBX, [ESP + 8]
-		LEA ECX, [ESP + 4]
-		MOV EDX, 1
-		INT 80H
-		RET
-	END putc;
-
-	PROCEDURE Dlsym*(handle: ADDRESS; CONST name: ARRAY OF CHAR; adr: ADDRESS);
-	VAR val: ADDRESS;
-	BEGIN
-		val := dlsym(handle, ADDRESS OF name[0]);
-		SYSTEM.PUT(adr, val);
-	END Dlsym;
-
-	PROCEDURE Char(c: CHAR);
-	BEGIN
-		putc(1, c);
-	END Char;
- 
-	PROCEDURE Init;
-	VAR i: ADDRESS;
-	BEGIN
-		baseAdr := ADDRESS OF EntryPoint;
-		endAdr := ADDRESS OF last;
-		
-		Trace.Init;
-		Trace.Char := Char;
-		
-		stackBottom := ADDRESSOF( i ) + 2*SIZEOF(ADDRESS);
-		ASSERT(dlsym # NIL);
-		Dlsym(0,"dlopen", ADDRESS OF dlopen);
-		ASSERT(dlopen # NIL); 
-		Dlsym( 0, "dlclose", ADDRESS OF dlclose);
-		ASSERT(dlclose # NIL); 
-		Dlsym(0,"exit", ADDRESS OF exit);
-		ASSERT(exit # NIL);
-	END Init;
-	
-	PROCEDURE {INITIAL,NOPAF} Init0;
-	BEGIN
-		(*initial stack layout:
-			argc at esp
-			argv at esp+4
-			0 at esp+4+argc*4
-			env at esp+4+argc*4+4      =   (2+argc)<<2 + esp*)
-		CODE{SYSTEM.i386}
-			MOV EAX, [ESP]
-			MOV argc, EAX
-			LEA EAX, [ESP+4]
-			MOV argv, EAX
-			MOV EAX, [ESP]
-			ADD EAX, 2
-			SHL EAX, 2
-			ADD EAX, ESP
-			MOV environ, EAX
-		END;
-		Init;
-	END Init0;
-
-END Glue.
-
-
-
-System.FreeDownTo FoxIntermediateBackend ~
-
-System.DoCommands
-	Compiler.Compile -p=Linux32
-		I386.Builtins.Mod Trace.Mod Linux.I386.Glue.Mod Linux.I386.Unix.Mod Unix.I386.Machine.Mod Heaps.Mod  Modules.Mod 
-		Unix.Objects.Mod 
-		Unix.Kernel.Mod KernelLog.Mod Plugins.Mod Streams.Mod 
-		Pipes.Mod Commands.Mod I386.Reals.Mod Reflection.Mod TrapWriters.Mod CRC.Mod SystemVersion.Mod 
-		Unix.StdIO.Mod Unix.Traps.Mod Locks.Mod Unix.Clock.Mod Disks.Mod Files.Mod Dates.Mod Strings.Mod 
-		UTF8Strings.Mod FileTrapWriter.Mod Caches.Mod DiskVolumes.Mod OldDiskVolumes.Mod RAMVolumes.Mod 
-		DiskFS.Mod OldDiskFS.Mod OberonFS.Mod FATVolumes.Mod FATFiles.Mod ISO9660Volumes.Mod 
-		ISO9660Files.Mod Unix.UnixFiles.Mod RelativeFileSystem.Mod BitSets.Mod StringPool.Mod DIagnostics.Mod 
-		ObjectFile.Mod GenericLinker.Mod Loader.Mod Unix.BootConsole.Mod 
-	~
-
-	Linker.Link --fileFormat=Raw --fileName=simple_elf --extension=.GofU --displacement=08048000H
-		Builtins Trace Glue Unix Machine Heaps Modules Objects Kernel KernelLog 
-Streams Commands StdIO TrapWriters Traps 
-Files UnixFiles Clock Dates Reals Strings Diagnostics 
-BitSets StringPool ObjectFile GenericLinker Reflection  Loader  
-BootConsole 
- ~
-
-	FSTools.CloseFiles simple_elf ~
-~ 
-
-MODULE Test;
-
-IMPORT StdIO, Commands, Streams, Modules;
-
-PROCEDURE Execute(context: Commands.Context);
-VAR str, msg: ARRAY 256 OF CHAR;  res: WORD;
-BEGIN
-	IF ~context.arg.GetString(str) THEN RETURN END;
-	IF ~context.arg.GetString(str) THEN 
-		context.out.String("no command"); context.out.Ln;
-		RETURN
-	END;
-	Commands.Activate(str, context, {Commands.Wait}, res, msg);
-END Execute;
-
-BEGIN
-	Execute(StdIO.env);
-	Modules.Shutdown(1);
-END Test.

+ 2 - 2
source/Release.Tool

@@ -275,8 +275,8 @@ PACKAGE Kernel ARCHIVE "Kernel.zip" SOURCE "KernelSrc.zip" DESCRIPTION "A2 Kerne
 	ZYNQC { HeapManager.Mod Zynq.Environment.Mod }
 	WIN32C { Windows.Environment.Mod }
 
-	LINUX32 { Linux.I386.Glue.Mod Linux.I386.Unix.Mod }
-	LINUX64 { Linux.AMD64.Glue.Mod Linux.AMD64.Unix.Mod }
+	LINUX32 { Linux.Glue.Mod Linux.I386.Unix.Mod }
+	LINUX64 { Linux.Glue.Mod Linux.AMD64.Unix.Mod }
 	DARWIN32 { Unix.I386.Glue.Mod Darwin.I386.Unix.Mod }
 	DARWIN64 { Unix.AMD64.Glue.Mod Darwin.AMD64.Unix.Mod }
 	SOLARIS32 { Unix.I386.Glue.Mod Solaris.I386.Unix.Mod }