changeset 157:180108494f08 default tip

change build system to use CMake
author Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
date Wed, 09 Nov 2011 11:51:10 -0500
parents 2cf6fb157764
children
files .hgignore CMakeLists.txt Makefile arch/CMakeLists.txt hercules/shell.cnf ipl/CMakeLists.txt ipl/ipl.S ipl/linker-ccws.script ipl/linker.script ipl/loader.c ipl/loader_c.c ipl/setmode.S scripts/gen_ccws.sh scripts/gen_loaderbin.sh src/CMakeLists.txt src/os/CMakeLists.txt src/prog/CMakeLists.txt
diffstat 17 files changed, 542 insertions(+), 571 deletions(-) [+]
line wrap: on
line diff
--- a/.hgignore	Tue Nov 08 09:29:22 2011 -0500
+++ b/.hgignore	Wed Nov 09 11:51:10 2011 -0500
@@ -1,19 +1,19 @@
 \.o$
 \.a$
 \.rto$
+^ipl/ipl_ccws$
 ^ipl/ipl_ccws\.S$
-^shell$
-^hello$
-^ls$
-^echo$
-^rpn$
-^dynamic$
-^testFS$
-^broken$
-^loader\.bin$
+^ipl/loader$
+^ipl/loader\.bin$
 ^cscope\.out$
 \.swp$
 
+CMakeFiles
+CMakeCache.txt
+cmake_install.cmake
+^build$
+Makefile
+
 ^hercules/curDisk\.img$
 
 ^changes
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CMakeLists.txt	Wed Nov 09 11:51:10 2011 -0500
@@ -0,0 +1,26 @@
+cmake_minimum_required(VERSION 2.8)
+include(CMakeForceCompiler)
+
+set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/build)
+
+set(CMAKE_SYSTEM_NAME Linux)
+
+set(CMAKE_OBJCOPY "s390x-linux-objcopy")
+set(CMAKE_LINKER "s390x-linux-ld")
+CMAKE_FORCE_C_COMPILER(s390x-linux-gcc GNU)
+
+set(CMAKE_ASM_COMPILER "s390x-linux-gcc")
+enable_language(ASM)
+
+set(CMAKE_ASM_FLAGS "-g -fno-strict-aliasing -fno-builtin -nostdinc -nostdlib -Wall -m64 -I${PROJECT_SOURCE_DIR}/include/ -O2")
+set(CMAKE_C_FLAGS "${CMAKE_ASM_FLAGS} -include ${PROJECT_SOURCE_DIR}/include/system.h")
+
+add_subdirectory(arch)
+add_subdirectory(src)
+add_subdirectory(ipl)
+
+add_custom_command(
+	OUTPUT ${PROJECT_BINARY_DIR}/hercules/curDisk.img
+	COMMAND ${PROJECT_SOURCE_DIR}/utility/fsGen.py ${EXECUTABLE_OUTPUT_PATH}/* > ${PROJECT_BINARY_DIR}/hercules/curDisk.img
+)
+add_custom_target(fsgen DEPENDS ${PROJECT_BINARY_DIR}/hercules/curDisk.img)
--- a/Makefile	Tue Nov 08 09:29:22 2011 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,129 +0,0 @@
-CROSS_COMPILE=s390x-linux-
-AS=$(CROSS_COMPILE)as
-CC=$(CROSS_COMPILE)gcc
-CXX=$(CROSS_COMPILE)g++
-LD=$(CROSS_COMPILE)ld
-AR=$(CROSS_COMPILE)ar
-OBJCOPY=$(CROSS_COMPILE)objcopy
-
-MAKEFLAGS += -rR --no-print-directory
-CFLAGS=-g -fno-strict-aliasing -fno-builtin -nostdinc -nostdlib -Wall -m64 -I include/ -O2
-CXXFLAGS=$(CFLAGS)
-LDFLAGS=-m elf64_s390
-
-OSBINS=shell
-PROGBINS=hello ls echo dynamic rpn broken
-
-shell_OBJS=src/os/shell.o src/os/std.o src/os/fs.o src/os/string.o \
-					 src/os/stdio.o src/os/scall.o src/os/heap.o src/os/memStack.o \
-					 src/os/except.o src/os/storageKeys.o arch/arch.a
-hello_OBJS=src/prog/hello.o src/prog/std.o src/prog/string.o
-ls_OBJS=src/prog/ls.o
-echo_OBJS=src/prog/echo.o src/prog/std.o src/prog/string.o
-dynamic_OBJS=src/prog/dynamic.o src/prog/std.o src/prog/string.o src/prog/stack.o
-rpn_OBJS=src/prog/rpn.o src/prog/std.o src/prog/string.o src/prog/stack.o src/prog/operations.o src/prog/math.o
-broken_OBJS=src/prog/broken.o arch/arch.a
-
-testFS_OBJS=src/testFS.o src/std.o src/string.o src/os/fs.o arch/arch.a
-
-ARCH_OBJS=arch/io.o arch/cons.o arch/ebcdic.o arch/fba.o arch/ioint.o \
-	  arch/svc.o arch/svcint.o arch/progint.o
-
-.PHONY: all build clean tags
-
-all: $(OSBINS) $(PROGBINS) loader.bin
-	utility/fsGen.py $(PROGBINS) > hercules/curDisk.img
-	@echo "Loader is `stat -c %s loader.bin` bytes"
-
-clean:
-	rm -f $(shell_OBJS)
-	rm -f $(hello_OBJS)
-	rm -f $(ls_OBJS)
-	rm -f $(echo_OBJS)
-	rm -f $(rpn_OBJS)
-	rm -f $(dynamic_OBJS)
-	rm -f $(testFS_OBJS)
-	rm -f $(broken_OBJS)
-	rm -f $(ARCH_OBJS)
-	rm -f $(OSBINS)
-	rm -f $(PROGBINS)
-	rm -f loader.bin ipl/*.o ipl/*.rto ipl/ipl_ccws.S cscope.out
-
-tags:
-	cscope -R -b
-	ctags -R
-
-shell: $(shell_OBJS)
-	$(LD) $(LDFLAGS) -T scripts/linker.script -o $@ $^
-hello: $(hello_OBJS)
-	$(LD) $(LDFLAGS) -T scripts/linkerProg.script -o $@ $^
-ls: $(ls_OBJS)
-	$(LD) $(LDFLAGS) -T scripts/linkerProg.script -o $@ $^
-echo: $(echo_OBJS)
-	$(LD) $(LDFLAGS) -T scripts/linkerProg.script -o $@ $^
-broken: $(broken_OBJS)
-	$(LD) $(LDFLAGS) -T scripts/linkerProg.script -o $@ $^
-dynamic: $(dynamic_OBJS)
-	$(LD) $(LDFLAGS) -T scripts/linkerProg.script -o $@ $^
-rpn: $(rpn_OBJS)
-	$(LD) $(LDFLAGS) -T scripts/linkerProg.script -o $@ $^
-
-testFS: $(testFS_OBJS)
-	$(LD) $(LDFLAGS) -T scripts/linker.script -o $@ $^
-
-arch/arch.a: $(ARCH_OBJS)
-	$(AR) rc $@ $^
-
-%.o: %.S
-	$(CC) $(CFLAGS) -c -o $@ $<
-
-src/prog/%.o: src/prog/%.c
-	$(CC) $(CFLAGS) -include include/system.h -c -o $@ $<
-src/os/%.o: src/os/%.c
-	$(CC) $(CFLAGS) -include include/system.h -c -o $@ $< -DOSLEVEL
-%.o: %.c
-	$(CC) $(CFLAGS) -include include/system.h -c -o $@ $<
-
-
-%.o: %.cpp
-	$(CXX) $(CXXFLAGS) -include include/system.h -c -o $@ $<
-
-#
-# IPL specific bits
-#
-
-.PRECIOUS: ipl/loader.o ipl/loader_c.o ipl/loader_asm.o ipl/setmode.o \
-	ipl/ipl_ccws.o ipl/ipl.o
-
-loader.bin: ipl/ipl.rto ipl/ipl_ccws.rto ipl/setmode.rto ipl/loader.rto
-	cat $^ > $@
-	( len=`stat -c %s "$@"`; dif=`expr $$len % 80`; if [ $$dif -ne 0 ]; then dif=`expr 80 - $$dif`; dd if=/dev/zero bs=1 count=$$dif 2> /dev/null >> "$@"; fi)
-
-ipl/loader_asm.o: ipl/loader_asm.S
-	$(AS) -m64 -o $@ $<
-
-ipl/loader_c.o: ipl/loader.c
-	$(CC) $(CFLAGS) -DBLOCK_SIZE=80 -c -o $@ $<
-
-ipl/ipl_ccws.S: ipl/setmode.rto ipl/loader.rto
-	bash scripts/gen_ccws.sh $@
-
-ipl/loader.rto: ipl/loader.o
-	$(OBJCOPY) -O binary -j .text -j .data -j .rodata $< $@
-
-ipl/loader.o: ipl/loader_c.o ipl/loader_asm.o
-	$(LD) -melf64_s390 -T ipl/linker.script -o $@ $^
-
-ipl/%.rto: ipl/%.o
-	$(OBJCOPY) -O binary -j .text $< $@
-
-ipl/%.o: ipl/%.S
-	$(AS) -m64 -o $@ $<
-
-depend:
-	makedepend -I include src/*.c
-
-# DO NOT DELETE
-
-src/testFS.o: include/std.h include/die.h include/memHead.h include/os/fs.h
-src/testFS.o: include/error.h include/os/fsStructs.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/arch/CMakeLists.txt	Wed Nov 09 11:51:10 2011 -0500
@@ -0,0 +1,2 @@
+add_library(arch io.c cons.c ebcdic.c fba.c ioint.S svc.c svcint.S
+	progint.S)
--- a/hercules/shell.cnf	Tue Nov 08 09:29:22 2011 -0500
+++ b/hercules/shell.cnf	Wed Nov 09 11:51:10 2011 -0500
@@ -15,6 +15,6 @@
 # V     V       V
 #---    ----    --------------------
 0009	3215	
-000C    3505	../loader.bin ../shell ebcdic multifile eof
+000C    3505	../ipl/loader.bin ../build/shell ebcdic multifile eof
 
 0100	9336	curDisk.img
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ipl/CMakeLists.txt	Wed Nov 09 11:51:10 2011 -0500
@@ -0,0 +1,33 @@
+set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/ipl)
+
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Os -DBLOCK_SIZE=80")
+
+add_executable(loader setmode.S loader_c.c loader_asm.S)
+set_target_properties(loader PROPERTIES LINK_FLAGS "-T linker.script")
+add_custom_command(
+	OUTPUT loader.rto
+	COMMAND ${CMAKE_OBJCOPY} -O binary -j .text -j .data -j .rodata loader loader.rto
+	DEPENDS loader
+)
+
+add_custom_command(
+	OUTPUT ipl_ccws.S
+	COMMAND ${PROJECT_SOURCE_DIR}/scripts/gen_ccws.sh ipl_ccws.S ipl.S loader.rto
+	DEPENDS loader.rto
+)
+
+add_executable(ipl_ccws ipl_ccws.S)
+set_target_properties(ipl_ccws PROPERTIES LINK_FLAGS "-T linker-ccws.script")
+add_custom_command(
+	OUTPUT ipl_ccws.rto
+	COMMAND ${CMAKE_OBJCOPY} -O binary -j .text -j .data -j .rodata ipl_ccws ipl_ccws.rto
+	DEPENDS ipl_ccws
+)
+
+add_custom_command(
+	OUTPUT loader.bin
+	COMMAND ${PROJECT_SOURCE_DIR}/scripts/gen_loaderbin.sh
+	DEPENDS ipl_ccws.rto loader.rto
+)
+
+add_custom_target(ldr ALL DEPENDS loader.bin)
--- a/ipl/ipl.S	Tue Nov 08 09:29:22 2011 -0500
+++ b/ipl/ipl.S	Wed Nov 09 11:51:10 2011 -0500
@@ -3,6 +3,11 @@
 # NOTE: zArch IPLs in ESA/390 mode.
 #
 
+.text
+	.align	4
+.globl START
+	.type	START, @function
+START:
 #
 # Bytes 0-7 contain PSW to be loaded after IO operation completes
 #
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ipl/linker-ccws.script	Wed Nov 09 11:51:10 2011 -0500
@@ -0,0 +1,9 @@
+SECTIONS
+{
+  ENTRY(START)
+  . = 0x0;
+  .text : { *(.text) }
+  .data : { *(.data) }
+  .rodata : { *(.rodata) }
+  .bss : { *(.bss) }
+}
--- a/ipl/linker.script	Tue Nov 08 09:29:22 2011 -0500
+++ b/ipl/linker.script	Wed Nov 09 11:51:10 2011 -0500
@@ -1,7 +1,7 @@
 SECTIONS
 {
-  ENTRY(load_system)
-  . = 0x800020;
+  ENTRY(START)
+  . = 0x800000;
   .text : { *(.text) }
   .data : { *(.data) }
   .rodata : { *(.rodata) }
--- a/ipl/loader.c	Tue Nov 08 09:29:22 2011 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,421 +0,0 @@
-#ifndef BLOCK_SIZE
-#error missing BLOCK_SIZE
-#endif
-
-#define TEMP_BASE	((unsigned char*) 0x400000) /* 4MB */
-
-typedef unsigned long u64;
-typedef signed long s64;
-
-typedef unsigned int u32;
-typedef signed int s32;
-
-typedef unsigned short u16;
-typedef signed short s16;
-
-typedef unsigned char u8;
-typedef signed char s8;
-
-#define EI_MAG0		0
-#define EI_MAG1		1
-#define EI_MAG2		2
-#define EI_MAG3		3
-#define EI_CLASS	4
-#define EI_DATA		5
-#define EI_VERSION	6
-#define EI_OSABI	7
-#define EI_ABIVERSION	8
-#define EI_PAD		9
-#define EI_NIDENT	16
-
-#define ELFCLASS32	1
-#define ELFCLASS64	2
-
-#define ELFDATA2LSB	1
-#define ELFDATA2MSB	2
-
-#define EV_CURRENT	1
-
-#define ET_NONE		0
-#define ET_REL		1
-#define ET_EXEC		2
-#define ET_DYN		3
-#define ET_CORE		4
-#define ET_LOOS		0xfe00
-#define ET_HIOS		0xfeff
-#define ET_LOPROC	0xff00
-#define ET_HIPROC	0xffff
-
-#define SHT_NULL	0
-#define SHT_PROGBITS	1
-#define SHT_SYMTAB	2
-#define SHT_STRTAB	3
-#define SHT_RELA	4
-#define SHT_HASH	5
-#define SHT_DYNAMIC	6
-#define SHT_NOTE	7
-#define SHT_NOBITS	8
-#define SHT_REL		9
-#define SHT_SHLIB	10
-#define SHT_DYNSYM	11
-#define SHT_LOOS	0x60000000
-#define SHT_HIOS	0x6fffffff
-#define SHT_LOPROC	0x70000000
-#define SHT_HIPROC	0x7fffffff
-
-typedef u64 Elf64_Addr;
-typedef u64 Elf64_Off;
-typedef u16 Elf64_Half;
-typedef u32 Elf64_Word;
-typedef s32 Elf64_Sword;
-typedef u64 Elf64_Xword;
-typedef s64 Elf64_Sxword;
-
-/*
- * ELF file header
- */
-typedef struct {
-	unsigned char   e_ident[EI_NIDENT];	/* ELF identification */
-	Elf64_Half      e_type;			/* Object file type */
-	Elf64_Half      e_machine;		/* Machine type */
-	Elf64_Word      e_version;		/* Object file version */
-	Elf64_Addr      e_entry;		/* Entry point address */
-	Elf64_Off       e_phoff;		/* Program header offset */
-	Elf64_Off       e_shoff;		/* Section header offset */
-	Elf64_Word      e_flags;		/* Processor-specific flags */
-	Elf64_Half      e_ehsize;		/* ELF header size */
-	Elf64_Half      e_phentsize;		/* Size of program header entry */
-	Elf64_Half      e_phnum;		/* Number of program header entries */
-	Elf64_Half      e_shentsize;		/* Size of section header entries */
-	Elf64_Half      e_shnum;		/* Number of section header entries */
-	Elf64_Half      e_shstrndx;		/* Section name string table index */
-} Elf64_Ehdr;
-
-/*
- * ELF section header
- */
-typedef struct {
-	Elf64_Word	sh_name;		/* Section name */
-	Elf64_Word	sh_type;		/* Section type */
-	Elf64_Xword	sh_flags;		/* Section attributes */
-	Elf64_Addr	sh_addr;		/* Virtual address in memory */
-	Elf64_Off	sh_offset;		/* Offset in file */
-	Elf64_Xword	sh_size;		/* Size of section */
-	Elf64_Word	sh_link;		/* Link to other section */
-	Elf64_Word	sh_info;		/* Misc information */
-	Elf64_Xword	sh_addralign;		/* Address alignment boundary */
-	Elf64_Xword	sh_entsize;		/* Size of entries, if section has table */
-} Elf64_Shdr;
-
-static unsigned char read_ccw[8] __attribute__ ((aligned (8))) = {
-	/*
-	 * CCW2; read the entire system ELF
-	 */
-
-	0x02,
-	/*   bits  value   name                        desc             */
-	/*    0-7      2   Cmd Code                    read, no modifiers*/
-
-	0xff, 0xff, 0xff,
-	/*   bits  value   name                        desc             */
-	/*   8-31   addr   Data Address                dest of the read */
-
-	0x20,
-	/*   bits  value   name                        desc             */
-	/*     32      0   Chain-Data (CD)             don't chain      */
-	/*     33      0   Chain-Command (CC)          don't chain      */
-	/*     34      1   Sup.-Len.-Inditcation (SLI) suppress         */
-	/*     35      0   Skip (SKP)                  issue read       */
-	/*     36      0   Prog.-Contr.-Inter. (PCI)   don't interrupt  */
-	/*     37      0   Indir.-Data-Addr. (IDA)     real addr        */
-	/*     38      0   Suspend (S)                 don't suspend    */
-	/*     39      0   Modified I.D.A. (MIDA)      real addr        */
-
-	0x00,
-	/*   bits  value   name                        desc             */
-	/*  40-47      0   <ignored>                                    */
-
-	0xff, 0xff,
-	/*   bits  value   name                        desc             */
-	/*  48-63    len   number of bytes to read                      */
-};
-
-unsigned char ORB[32] __attribute__ ((aligned (16))) = {
-	/* Word 0 */
-	0x12,0x34,0x56,0x78,
-	/*   bits  value   name                        desc             */
-	/*   0-31  magic   Interrupt Parameter                          */
-
-	/* Word 1 */
-	0x00,
-	/*   bits  value   name                        desc             */
-	/*    0-3      0   Subchannel Key                               */
-	/*      4      0   Suspend Control                              */
-	/*      5      0   Streaming-Mode Control                       */
-	/*      6      0   Modification Control                         */
-	/*      7      0   Synchronization Control                      */
-
-	0x00,
-	/*   bits  value   name                        desc             */
-	/*      8      0   Format Control              format-0 CCWs    */
-	/*      9      0   Prefetch Control                             */
-	/*     10      0   Initial-Status-Interruption Control          */
-	/*     11      0   Address-Limit-Checking Control               */
-	/*     12      0   Suppress-Suspended-Interruption Control      */
-	/*     13      0   <zero>                                       */
-	/*     14      0   Format-2-IDAW Control                        */
-	/*     15      0   2K-IDAW Control                              */
-
-	0xff,
-	/*   bits  value   name                        desc             */
-	/*  16-23   0xff   Logical-Path Mask           All paths        */
-
-	0x00,
-	/*   bits  value   name                        desc             */
-	/*     24      0   Incorrect-Length-Suppression Mode            */
-	/*     25      0   Modified-CCW-Indirect-Data-Addressing Control*/
-	/*  26-30      0   <zero>                                       */
-	/*     31      0   ORB-Extension Control                        */
-
-	/* Word 2 */
-	0xff,0xff,0xff,0xff,
-	/*   bits  value   name                        desc             */
-	/*   0-31   addr   Channel-Program Address                      */
-
-	/* Word 3 */
-	0x00,
-	/*   bits  value   name                        desc             */
-	/*    0-7      0   Channel-Subsystem Priority                   */
-
-	0x00,
-	/*   bits  value   name                        desc             */
-	/*   8-15      0   <zero/reserved>                              */
-
-	0x00,
-	/*   bits  value   name                        desc             */
-	/*  15-23      0   Control-Unit Priority                        */
-
-	0x00,
-	/*   bits  value   name                        desc             */
-	/*  24-31      0   <zero/reserved>                              */
-
-	/* Word 4 */
-	0x00,0x00,0x00,0x00,
-	/*   bits  value   name                        desc             */
-	/*   0-31      0   <zero/reserved>                              */
-
-	/* Word 5 */
-	0x00,0x00,0x00,0x00,
-	/*   bits  value   name                        desc             */
-	/*   0-31      0   <zero/reserved>                              */
-
-	/* Word 6 */
-	0x00,0x00,0x00,0x00,
-	/*   bits  value   name                        desc             */
-	/*   0-31      0   <zero/reserved>                              */
-
-	/* Word 7 */
-	0x00,0x00,0x00,0x00,
-	/*   bits  value   name                        desc             */
-	/*   0-31      0   <zero/reserved>                              */
-};
-
-#define memcpy(d,s,l)	__builtin_memcpy((d), (s), (l))
-#define memset(s,c,n)	__builtin_memset((s),(c),(n))
-
-/*
- * halt the cpu
- *
- * NOTE: we don't care about not clobbering registers as when this
- * code executes, the CPU will be stopped.
- */
-static inline void die()
-{
-	asm volatile(
-		"SR	%r1, %r1	# not used, but should be zero\n"
-		"SR	%r3, %r3 	# CPU Address\n"
-		"SIGP	%r1, %r3, 0x05	# Signal, order 0x05\n"
-	);
-
-	/*
-	 * Just in case SIGP fails
-	 */
-	for(;;);
-}
-
-/*
- * It is easier to write this thing in assembly...
- */
-extern int __do_io();
-extern void PGMHANDLER();
-
-static u64 pgm_new_psw[2] = {
-	0x0000000180000000ULL, (u64) &PGMHANDLER,
-};
-
-static u64 pgm_new_psw_real[2] = {
-	0x0002000180000000ULL, 0xfa11,
-};
-
-/*
- * determine amount of storage
- */
-static u64 sense_memsize()
-{
-	u64 size;
-	int cc;
-
-#define SKIP_SIZE	(1024*1024ULL)
-
-	/* set new PGM psw */
-	memcpy((void*)0x1d0, pgm_new_psw, 16);
-
-	for(size = 0; size < ((u64)~SKIP_SIZE)-1; size += SKIP_SIZE) {
-		asm volatile(
-			"lg	%%r1,%1\n"
-			"tprot	0(%%r1),0\n"
-			"ipm	%0\n"
-			"srl    %0,28\n"
-		: /* output */
-		  "=d" (cc)
-		: /* input */
-		  "m" (size)
-		: /* clobber */
-		  "cc", "r1"
-		);
-
-		/*
-		 * we cheat here a little...if we try to tprot a location
-		 * that isn't part of the configuration, a program exception
-		 * fires off, but our handler sets the CC to 3, and resumes
-		 * execution
-		 */
-		if (cc == 3)
-			break;
-	}
-
-	/* invalidate new PGM psw */
-	memcpy((void*)0x1d0, pgm_new_psw_real, 16);
-
-	return size;
-}
-
-/*
- * read the entire system into into TEMP_BASE
- */
-static inline void readsystem()
-{
-	register unsigned long base;
-
-	/*
-	 * Read in BLOCK_SIZE chunks of system
-	 */
-
-	/* set the CCW address in the ORB */
-	*((u32 *) &ORB[8]) = (u32) (u64) read_ccw;
-
-	read_ccw[6] = ((unsigned char) (BLOCK_SIZE >> 8) & 0xff);
-	read_ccw[7] = ((unsigned char) (BLOCK_SIZE & 0xff));
-
-	base = (unsigned long) TEMP_BASE;
-	for(;; base += BLOCK_SIZE) {
-		read_ccw[1] = ((unsigned char) (base >> 16));
-		read_ccw[2] = ((unsigned char) (base >> 8) & 0xff);
-		read_ccw[3] = ((unsigned char) (base & 0xff));
-		if (__do_io())
-			break;
-	}
-}
-
-static inline void enable_bfp()
-{
-	u64 cr0;
-
-	asm volatile(
-		"stctg	0,0,%0\n"
-		"oi	%1,0x04\n"
-		"lctlg	0,0,%0\n"
-	: /* output */
-	: /* input */
-	  "m" (cr0),
-	  "m" (*(u64*) (((u8*)&cr0) + 5))
-	);
-}
-
-void load_system(void)
-{
-	/*
-	 * These are all stored in registers
-	 */
-	register int i;
-	register Elf64_Ehdr *system_elf;
-	register Elf64_Shdr *section;
-	register void (*start_sym)(u64);
-
-	/*
-	 * Read entire ELF to temporary location
-	 */
-	readsystem();
-
-	system_elf = (Elf64_Ehdr*) TEMP_BASE;
-
-	/*
-	 * Check that this looks like a valid ELF
-	 */
-	if (system_elf->e_ident[0] != '\x7f' ||
-	    system_elf->e_ident[1] != 'E' ||
-	    system_elf->e_ident[2] != 'L' ||
-	    system_elf->e_ident[3] != 'F' ||
-	    system_elf->e_ident[EI_CLASS] != ELFCLASS64 ||
-	    system_elf->e_ident[EI_DATA] != ELFDATA2MSB ||
-	    system_elf->e_ident[EI_VERSION] != EV_CURRENT ||
-	    system_elf->e_type != ET_EXEC ||
-	    system_elf->e_machine != 0x16 || // FIXME: find the name for the #define
-	    system_elf->e_version != EV_CURRENT)
-		die();
-
-	/*
-	 * Iterate through each section, and copy it to the final
-	 * destination as necessary
-	 */
-	for (i=0; i<system_elf->e_shnum; i++) {
-		section = (Elf64_Shdr*) (TEMP_BASE +
-					 system_elf->e_shoff +
-					 system_elf->e_shentsize * i);
-
-		switch (section->sh_type) {
-			case SHT_PROGBITS:
-				if (!section->sh_addr)
-					break;
-
-				/*
-				 * just copy the data from TEMP_BASE to
-				 * where it wants to be
-				 */
-				memcpy((void*) section->sh_addr,
-					TEMP_BASE + section->sh_offset,
-					section->sh_size);
-				break;
-			case SHT_NOBITS:
-				/*
-				 * No action needed as there's no data to
-				 * copy, and we assume that the ELF sections
-				 * don't overlap
-				 */
-				memset((void*) section->sh_addr,
-				       0, section->sh_size);
-				break;
-			default:
-				/* Ignoring */
-				break;
-		}
-	}
-
-	enable_bfp();
-
-	/*
-	 * Now, jump to the system entry point
-	 */
-	start_sym = (void*) system_elf->e_entry;
-	start_sym(sense_memsize());
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ipl/loader_c.c	Wed Nov 09 11:51:10 2011 -0500
@@ -0,0 +1,418 @@
+#ifndef BLOCK_SIZE
+#error missing BLOCK_SIZE
+#endif
+
+#define TEMP_BASE	((unsigned char*) 0x400000) /* 4MB */
+
+typedef unsigned int u32;
+typedef signed int s32;
+
+typedef unsigned short u16;
+typedef signed short s16;
+
+typedef unsigned char u8;
+typedef signed char s8;
+
+#define EI_MAG0		0
+#define EI_MAG1		1
+#define EI_MAG2		2
+#define EI_MAG3		3
+#define EI_CLASS	4
+#define EI_DATA		5
+#define EI_VERSION	6
+#define EI_OSABI	7
+#define EI_ABIVERSION	8
+#define EI_PAD		9
+#define EI_NIDENT	16
+
+#define ELFCLASS32	1
+#define ELFCLASS64	2
+
+#define ELFDATA2LSB	1
+#define ELFDATA2MSB	2
+
+#define EV_CURRENT	1
+
+#define ET_NONE		0
+#define ET_REL		1
+#define ET_EXEC		2
+#define ET_DYN		3
+#define ET_CORE		4
+#define ET_LOOS		0xfe00
+#define ET_HIOS		0xfeff
+#define ET_LOPROC	0xff00
+#define ET_HIPROC	0xffff
+
+#define SHT_NULL	0
+#define SHT_PROGBITS	1
+#define SHT_SYMTAB	2
+#define SHT_STRTAB	3
+#define SHT_RELA	4
+#define SHT_HASH	5
+#define SHT_DYNAMIC	6
+#define SHT_NOTE	7
+#define SHT_NOBITS	8
+#define SHT_REL		9
+#define SHT_SHLIB	10
+#define SHT_DYNSYM	11
+#define SHT_LOOS	0x60000000
+#define SHT_HIOS	0x6fffffff
+#define SHT_LOPROC	0x70000000
+#define SHT_HIPROC	0x7fffffff
+
+typedef u64 Elf64_Addr;
+typedef u64 Elf64_Off;
+typedef u16 Elf64_Half;
+typedef u32 Elf64_Word;
+typedef s32 Elf64_Sword;
+typedef u64 Elf64_Xword;
+typedef s64 Elf64_Sxword;
+
+/*
+ * ELF file header
+ */
+typedef struct {
+	unsigned char   e_ident[EI_NIDENT];	/* ELF identification */
+	Elf64_Half      e_type;			/* Object file type */
+	Elf64_Half      e_machine;		/* Machine type */
+	Elf64_Word      e_version;		/* Object file version */
+	Elf64_Addr      e_entry;		/* Entry point address */
+	Elf64_Off       e_phoff;		/* Program header offset */
+	Elf64_Off       e_shoff;		/* Section header offset */
+	Elf64_Word      e_flags;		/* Processor-specific flags */
+	Elf64_Half      e_ehsize;		/* ELF header size */
+	Elf64_Half      e_phentsize;		/* Size of program header entry */
+	Elf64_Half      e_phnum;		/* Number of program header entries */
+	Elf64_Half      e_shentsize;		/* Size of section header entries */
+	Elf64_Half      e_shnum;		/* Number of section header entries */
+	Elf64_Half      e_shstrndx;		/* Section name string table index */
+} Elf64_Ehdr;
+
+/*
+ * ELF section header
+ */
+typedef struct {
+	Elf64_Word	sh_name;		/* Section name */
+	Elf64_Word	sh_type;		/* Section type */
+	Elf64_Xword	sh_flags;		/* Section attributes */
+	Elf64_Addr	sh_addr;		/* Virtual address in memory */
+	Elf64_Off	sh_offset;		/* Offset in file */
+	Elf64_Xword	sh_size;		/* Size of section */
+	Elf64_Word	sh_link;		/* Link to other section */
+	Elf64_Word	sh_info;		/* Misc information */
+	Elf64_Xword	sh_addralign;		/* Address alignment boundary */
+	Elf64_Xword	sh_entsize;		/* Size of entries, if section has table */
+} Elf64_Shdr;
+
+static unsigned char read_ccw[8] __attribute__ ((aligned (8))) = {
+	/*
+	 * CCW2; read the entire system ELF
+	 */
+
+	0x02,
+	/*   bits  value   name                        desc             */
+	/*    0-7      2   Cmd Code                    read, no modifiers*/
+
+	0xff, 0xff, 0xff,
+	/*   bits  value   name                        desc             */
+	/*   8-31   addr   Data Address                dest of the read */
+
+	0x20,
+	/*   bits  value   name                        desc             */
+	/*     32      0   Chain-Data (CD)             don't chain      */
+	/*     33      0   Chain-Command (CC)          don't chain      */
+	/*     34      1   Sup.-Len.-Inditcation (SLI) suppress         */
+	/*     35      0   Skip (SKP)                  issue read       */
+	/*     36      0   Prog.-Contr.-Inter. (PCI)   don't interrupt  */
+	/*     37      0   Indir.-Data-Addr. (IDA)     real addr        */
+	/*     38      0   Suspend (S)                 don't suspend    */
+	/*     39      0   Modified I.D.A. (MIDA)      real addr        */
+
+	0x00,
+	/*   bits  value   name                        desc             */
+	/*  40-47      0   <ignored>                                    */
+
+	0xff, 0xff,
+	/*   bits  value   name                        desc             */
+	/*  48-63    len   number of bytes to read                      */
+};
+
+unsigned char ORB[32] __attribute__ ((aligned (16))) = {
+	/* Word 0 */
+	0x12,0x34,0x56,0x78,
+	/*   bits  value   name                        desc             */
+	/*   0-31  magic   Interrupt Parameter                          */
+
+	/* Word 1 */
+	0x00,
+	/*   bits  value   name                        desc             */
+	/*    0-3      0   Subchannel Key                               */
+	/*      4      0   Suspend Control                              */
+	/*      5      0   Streaming-Mode Control                       */
+	/*      6      0   Modification Control                         */
+	/*      7      0   Synchronization Control                      */
+
+	0x00,
+	/*   bits  value   name                        desc             */
+	/*      8      0   Format Control              format-0 CCWs    */
+	/*      9      0   Prefetch Control                             */
+	/*     10      0   Initial-Status-Interruption Control          */
+	/*     11      0   Address-Limit-Checking Control               */
+	/*     12      0   Suppress-Suspended-Interruption Control      */
+	/*     13      0   <zero>                                       */
+	/*     14      0   Format-2-IDAW Control                        */
+	/*     15      0   2K-IDAW Control                              */
+
+	0xff,
+	/*   bits  value   name                        desc             */
+	/*  16-23   0xff   Logical-Path Mask           All paths        */
+
+	0x00,
+	/*   bits  value   name                        desc             */
+	/*     24      0   Incorrect-Length-Suppression Mode            */
+	/*     25      0   Modified-CCW-Indirect-Data-Addressing Control*/
+	/*  26-30      0   <zero>                                       */
+	/*     31      0   ORB-Extension Control                        */
+
+	/* Word 2 */
+	0xff,0xff,0xff,0xff,
+	/*   bits  value   name                        desc             */
+	/*   0-31   addr   Channel-Program Address                      */
+
+	/* Word 3 */
+	0x00,
+	/*   bits  value   name                        desc             */
+	/*    0-7      0   Channel-Subsystem Priority                   */
+
+	0x00,
+	/*   bits  value   name                        desc             */
+	/*   8-15      0   <zero/reserved>                              */
+
+	0x00,
+	/*   bits  value   name                        desc             */
+	/*  15-23      0   Control-Unit Priority                        */
+
+	0x00,
+	/*   bits  value   name                        desc             */
+	/*  24-31      0   <zero/reserved>                              */
+
+	/* Word 4 */
+	0x00,0x00,0x00,0x00,
+	/*   bits  value   name                        desc             */
+	/*   0-31      0   <zero/reserved>                              */
+
+	/* Word 5 */
+	0x00,0x00,0x00,0x00,
+	/*   bits  value   name                        desc             */
+	/*   0-31      0   <zero/reserved>                              */
+
+	/* Word 6 */
+	0x00,0x00,0x00,0x00,
+	/*   bits  value   name                        desc             */
+	/*   0-31      0   <zero/reserved>                              */
+
+	/* Word 7 */
+	0x00,0x00,0x00,0x00,
+	/*   bits  value   name                        desc             */
+	/*   0-31      0   <zero/reserved>                              */
+};
+
+#define memcpy(d,s,l)	__builtin_memcpy((d), (s), (l))
+#define memset(s,c,n)	__builtin_memset((s),(c),(n))
+
+/*
+ * halt the cpu
+ *
+ * NOTE: we don't care about not clobbering registers as when this
+ * code executes, the CPU will be stopped.
+ */
+static inline void die()
+{
+	asm volatile(
+		"SR	%r1, %r1	# not used, but should be zero\n"
+		"SR	%r3, %r3 	# CPU Address\n"
+		"SIGP	%r1, %r3, 0x05	# Signal, order 0x05\n"
+	);
+
+	/*
+	 * Just in case SIGP fails
+	 */
+	for(;;);
+}
+
+/*
+ * It is easier to write this thing in assembly...
+ */
+extern int __do_io();
+extern void PGMHANDLER();
+
+static u64 pgm_new_psw[2] = {
+	0x0000000180000000ULL, (u64) &PGMHANDLER,
+};
+
+static u64 pgm_new_psw_real[2] = {
+	0x0002000180000000ULL, 0xfa11,
+};
+
+/*
+ * determine amount of storage
+ */
+static u64 sense_memsize()
+{
+	u64 size;
+	int cc;
+
+#define SKIP_SIZE	(1024*1024ULL)
+
+	/* set new PGM psw */
+	memcpy((void*)0x1d0, pgm_new_psw, 16);
+
+	for(size = 0; size < ((u64)~SKIP_SIZE)-1; size += SKIP_SIZE) {
+		asm volatile(
+			"lg	%%r1,%1\n"
+			"tprot	0(%%r1),0\n"
+			"ipm	%0\n"
+			"srl    %0,28\n"
+		: /* output */
+		  "=d" (cc)
+		: /* input */
+		  "m" (size)
+		: /* clobber */
+		  "cc", "r1"
+		);
+
+		/*
+		 * we cheat here a little...if we try to tprot a location
+		 * that isn't part of the configuration, a program exception
+		 * fires off, but our handler sets the CC to 3, and resumes
+		 * execution
+		 */
+		if (cc == 3)
+			break;
+	}
+
+	/* invalidate new PGM psw */
+	memcpy((void*)0x1d0, pgm_new_psw_real, 16);
+
+	return size;
+}
+
+/*
+ * read the entire system into into TEMP_BASE
+ */
+static inline void readsystem()
+{
+	register unsigned long base;
+
+	/*
+	 * Read in BLOCK_SIZE chunks of system
+	 */
+
+	/* set the CCW address in the ORB */
+	*((u32 *) &ORB[8]) = (u32) (u64) read_ccw;
+
+	read_ccw[6] = ((unsigned char) (BLOCK_SIZE >> 8) & 0xff);
+	read_ccw[7] = ((unsigned char) (BLOCK_SIZE & 0xff));
+
+	base = (unsigned long) TEMP_BASE;
+	for(;; base += BLOCK_SIZE) {
+		read_ccw[1] = ((unsigned char) (base >> 16));
+		read_ccw[2] = ((unsigned char) (base >> 8) & 0xff);
+		read_ccw[3] = ((unsigned char) (base & 0xff));
+		if (__do_io())
+			break;
+	}
+}
+
+static inline void enable_bfp()
+{
+	u64 cr0;
+
+	asm volatile(
+		"stctg	0,0,%0\n"
+		"oi	%1,0x04\n"
+		"lctlg	0,0,%0\n"
+	: /* output */
+	: /* input */
+	  "m" (cr0),
+	  "m" (*(u64*) (((u8*)&cr0) + 5))
+	);
+}
+
+void load_system(void)
+{
+	/*
+	 * These are all stored in registers
+	 */
+	register int i;
+	register Elf64_Ehdr *system_elf;
+	register Elf64_Shdr *section;
+	register void (*start_sym)(u64);
+
+	/*
+	 * Read entire ELF to temporary location
+	 */
+	readsystem();
+
+	system_elf = (Elf64_Ehdr*) TEMP_BASE;
+
+	/*
+	 * Check that this looks like a valid ELF
+	 */
+	if (system_elf->e_ident[0] != '\x7f' ||
+	    system_elf->e_ident[1] != 'E' ||
+	    system_elf->e_ident[2] != 'L' ||
+	    system_elf->e_ident[3] != 'F' ||
+	    system_elf->e_ident[EI_CLASS] != ELFCLASS64 ||
+	    system_elf->e_ident[EI_DATA] != ELFDATA2MSB ||
+	    system_elf->e_ident[EI_VERSION] != EV_CURRENT ||
+	    system_elf->e_type != ET_EXEC ||
+	    system_elf->e_machine != 0x16 || // FIXME: find the name for the #define
+	    system_elf->e_version != EV_CURRENT)
+		die();
+
+	/*
+	 * Iterate through each section, and copy it to the final
+	 * destination as necessary
+	 */
+	for (i=0; i<system_elf->e_shnum; i++) {
+		section = (Elf64_Shdr*) (TEMP_BASE +
+					 system_elf->e_shoff +
+					 system_elf->e_shentsize * i);
+
+		switch (section->sh_type) {
+			case SHT_PROGBITS:
+				if (!section->sh_addr)
+					break;
+
+				/*
+				 * just copy the data from TEMP_BASE to
+				 * where it wants to be
+				 */
+				memcpy((void*) section->sh_addr,
+					TEMP_BASE + section->sh_offset,
+					section->sh_size);
+				break;
+			case SHT_NOBITS:
+				/*
+				 * No action needed as there's no data to
+				 * copy, and we assume that the ELF sections
+				 * don't overlap
+				 */
+				memset((void*) section->sh_addr,
+				       0, section->sh_size);
+				break;
+			default:
+				/* Ignoring */
+				break;
+		}
+	}
+
+	enable_bfp();
+
+	/*
+	 * Now, jump to the system entry point
+	 */
+	start_sym = (void*) system_elf->e_entry;
+	start_sym(sense_memsize());
+}
--- a/ipl/setmode.S	Tue Nov 08 09:29:22 2011 -0500
+++ b/ipl/setmode.S	Wed Nov 09 11:51:10 2011 -0500
@@ -2,7 +2,11 @@
 # At this point, the machine is running in ESA390 mode. Let's load a new
 # PSW, making it switch to 64-bit mode
 #
-
+.text
+	.align	4
+.globl START
+	.type	START, @function
+START:
 	# switch to 64-bit mode
 	#
 	# Signal Processor
@@ -39,8 +43,4 @@
 	SLL	%r15, 20
 	AHI	%r15, -160
 
-#
-# Padding to make the entire file 0x20 bytes
-#
-	BCR	0, %r7
-	BCR	0, %r7
+	BRASL	%r14,load_system
--- a/scripts/gen_ccws.sh	Tue Nov 08 09:29:22 2011 -0500
+++ b/scripts/gen_ccws.sh	Wed Nov 09 11:51:10 2011 -0500
@@ -1,7 +1,6 @@
 #!/bin/bash
 
-len=`stat -c %s ipl/setmode.rto`
-len=`expr $len + $(stat -c %s ipl/loader.rto)`
+len=`stat -c %s $3`
 dif=`expr $len % 80`
 
 if [ $dif -ne 0 ]; then
@@ -17,7 +16,7 @@
 	exit 1
 fi
 
-echo -n "" > "$1"
+cat "$2" > "$1"
 
 addr=8388608 # == 0x800000
 flags="0x60"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/gen_loaderbin.sh	Wed Nov 09 11:51:10 2011 -0500
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+cat ipl_ccws.rto loader.rto > loader.bin
+
+len=`stat -c %s "loader.bin"`
+dif=`expr $len % 80`
+if [ $dif -ne 0 ]; then
+	dif=`expr 80 - $dif`
+	dd if=/dev/zero bs=1 count=$dif 2> /dev/null >> "loader.bin"
+fi
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/CMakeLists.txt	Wed Nov 09 11:51:10 2011 -0500
@@ -0,0 +1,2 @@
+add_subdirectory(os)
+add_subdirectory(prog)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/os/CMakeLists.txt	Wed Nov 09 11:51:10 2011 -0500
@@ -0,0 +1,7 @@
+set(CMAKE_EXE_LINKER_FLAGS "-T ${PROJECT_SOURCE_DIR}/scripts/linker.script")
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DOSLEVEL")
+
+add_executable(shell shell.c std.c fs.c string.c stdio.c scall.c heap.c
+	memStack.c except.c storageKeys.c)
+
+target_link_libraries(shell arch)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/prog/CMakeLists.txt	Wed Nov 09 11:51:10 2011 -0500
@@ -0,0 +1,10 @@
+set(CMAKE_EXE_LINKER_FLAGS "-T ${PROJECT_SOURCE_DIR}/scripts/linkerProg.script")
+
+add_executable(hello hello.c std.c string.c)
+add_executable(ls ls.c)
+add_executable(echo echo.c std.c string.c)
+add_executable(dynamic dynamic.c std.c string.c stack.c)
+add_executable(rpn rpn.c std.c string.c stack.c operations.c math.c)
+add_executable(broken broken.c)
+
+target_link_libraries(broken arch)