[msm8655]: Add feature flag to build Trustzone with LK

Add ENABLE_TRUSTZONE compile time flag to allow Trustzone
initializations with LK. The linker scripts move LK up in
memory, making room for TZ sysini to be placed at reset
vector and take control of Scorpion from power up itself.

This is a partial solution to enable TZ as part of LK.The
TZ/code/image itself is currently not part of LK tree and
is managed separately.As a result, this feature will be
turned off by default.

Change-Id: I1b4e4b380c415428fe22f34563a97440082befee
diff --git a/arch/arm/compile.mk b/arch/arm/compile.mk
index b509e16..e1f503e 100644
--- a/arch/arm/compile.mk
+++ b/arch/arm/compile.mk
@@ -26,8 +26,14 @@
 	@echo compiling $<
 	$(NOECHO)$(CC) $(CFLAGS) $(ASMFLAGS) $(INCLUDES) -c $< -MD -MT $@ -MF $(@:%o=%d) -o $@
 
+ifeq ($(ENABLE_TRUSTZONE), 1)
+$(BUILDDIR)/%.o: %.S $(SRCDEPS)
+	@$(MKDIR)
+	@echo compiling $<
+	$(NOECHO)$(CC) -DENABLE_TRUSTZONE $(CFLAGS) $(ASMFLAGS) $(INCLUDES) -c $< -MD -MT $@ -MF $(@:%o=%d) -o $@
+else
 $(BUILDDIR)/%.o: %.S $(SRCDEPS)
 	@$(MKDIR)
 	@echo compiling $<
 	$(NOECHO)$(CC) $(CFLAGS) $(ASMFLAGS) $(INCLUDES) -c $< -MD -MT $@ -MF $(@:%o=%d) -o $@
-
+endif
diff --git a/arch/arm/crt0.S b/arch/arm/crt0.S
index a1777f0..cb6e552 100644
--- a/arch/arm/crt0.S
+++ b/arch/arm/crt0.S
@@ -37,6 +37,11 @@
 	b	arm_fiq
 
 reset:
+
+#ifdef ENABLE_TRUSTZONE
+	/*Add reference to TZ symbol so linker includes it in final image */
+	ldr r7, =_binary_tzbsp_tzbsp_bin_start
+#endif
 	/* do some cpu setup */
 #if ARM_WITH_CP15
 	mrc		p15, 0, r0, c1, c0, 0
@@ -47,12 +52,19 @@
 		/* enable alignment faults */
 	orr		r0, r0, #(1<<1)
 	mcr		p15, 0, r0, c1, c0, 0
+#ifdef ENABLE_TRUSTZONE
+  /*nkazi: not needed ? Setting VBAR to location of new vector table : 0x80000      */
+ ldr             r0, =0x00080000
+ mcr             p15, 0, r0, c12, c0, 0
+#endif
 #endif
 
 #if WITH_CPU_EARLY_INIT
 	/* call platform/arch/etc specific init code */
+#ifndef ENABLE_TRUSTZONE
+	/* Not needed when TrustZone is the first bootloader that runs.*/
 	bl __cpu_early_init
-
+#endif
 	/* declare return address as global to avoid using stack */
 .globl _cpu_early_init_complete
 	_cpu_early_init_complete:
diff --git a/arch/arm/rules.mk b/arch/arm/rules.mk
index 6f56edd..d822430 100644
--- a/arch/arm/rules.mk
+++ b/arch/arm/rules.mk
@@ -130,6 +130,18 @@
 
 # rules for generating the linker scripts
 
+
+
+$(BUILDDIR)/trustzone-test-system-onesegment.ld: $(LOCAL_DIR)/trustzone-test-system-onesegment.ld
+	@echo generating $@
+	@$(MKDIR)
+	$(NOECHO)sed "s/%MEMBASE%/$(MEMBASE)/;s/%MEMSIZE%/$(MEMSIZE)/;s/%ROMLITE_PREFLASHED_DATA%/$(ROMLITE_PREFLASHED_DATA)/" < $< > $@
+
+$(BUILDDIR)/trustzone-system-onesegment.ld: $(LOCAL_DIR)/trustzone-system-onesegment.ld
+	@echo generating $@
+	@$(MKDIR)
+	$(NOECHO)sed "s/%MEMBASE%/$(MEMBASE)/;s/%MEMSIZE%/$(MEMSIZE)/" < $< > $@
+
 $(BUILDDIR)/system-onesegment.ld: $(LOCAL_DIR)/system-onesegment.ld
 	@echo generating $@
 	@$(MKDIR)
diff --git a/arch/arm/trustzone-system-onesegment.ld b/arch/arm/trustzone-system-onesegment.ld
new file mode 100644
index 0000000..1a234b6
--- /dev/null
+++ b/arch/arm/trustzone-system-onesegment.ld
@@ -0,0 +1,92 @@
+OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")

+OUTPUT_ARCH(arm)

+

+ENTRY(_start)

+SECTIONS

+{

+/*Added TRUSTZONE at 0x0. Moving rest of APPSBL to %MEMBASE% */

+	. = 0x0;

+	.tzbsp 0x0 : {*tzbsp_bin.o(.data)}

+	. = %MEMBASE%;

+	.interp : { *(.interp) }

+	.hash : { *(.hash) }

+	.dynsym : { *(.dynsym) }

+	.dynstr : { *(.dynstr) }

+	.rel.text : { *(.rel.text) *(.rel.gnu.linkonce.t*) }

+	.rela.text : { *(.rela.text) *(.rela.gnu.linkonce.t*) }

+	.rel.data : { *(.rel.data) *(.rel.gnu.linkonce.d*) }

+	.rela.data : { *(.rela.data) *(.rela.gnu.linkonce.d*) }

+	.rel.rodata : { *(.rel.rodata) *(.rel.gnu.linkonce.r*) }

+	.rela.rodata : { *(.rela.rodata) *(.rela.gnu.linkonce.r*) }

+	.rel.got : { *(.rel.got) }

+	.rela.got : { *(.rela.got) }

+	.rel.ctors : { *(.rel.ctors) }

+	.rela.ctors : { *(.rela.ctors) }

+	.rel.dtors : { *(.rel.dtors) }

+	.rela.dtors : { *(.rela.dtors) }

+	.rel.init : { *(.rel.init) }

+	.rela.init : { *(.rela.init) }

+	.rel.fini : { *(.rel.fini) }

+	.rela.fini : { *(.rela.fini) }

+	.rel.bss : { *(.rel.bss) }

+	.rela.bss : { *(.rela.bss) }

+	.rel.plt : { *(.rel.plt) }

+	.rela.plt : { *(.rela.plt) }

+/*Moving harcoded addresses by a displacement of %MEMBASE%  */

+	.init : { *(.init) } = %MEMBASE% + 0x9090

+	.plt : { *(.plt) }

+

+	/* text/read-only data */

+

+/*Moving harcoded addresses by a displacement of %MEMBASE%  */

+	 .text : { *(.text .text.* .glue_7* .gnu.linkonce.t.*) } = %MEMBASE% + 0x9090

+

+	.rodata : {

+		*(.rodata .rodata.* .gnu.linkonce.r.*)

+		. = ALIGN(4);

+		__commands_start = .;

+		KEEP (*(.commands))

+		__commands_end = .;

+		. = ALIGN(4);

+		__apps_start = .;

+		KEEP (*(.apps))

+		__apps_end = .;

+		. = ALIGN(4);

+		__rodata_end = . ;

+	}

+

+	/* writable data  */

+	__data_start_rom = .;	/* in one segment binaries, the rom data address is on top of the ram data address */

+	__data_start = .;

+	.data : SUBALIGN(4) { *(.data .data.* .gnu.linkonce.d.*) }

+

+	__ctor_list = .;

+	.ctors : { *(.ctors) }

+	__ctor_end = .;

+	__dtor_list = .;

+	.dtors : { *(.dtors) }

+	__dtor_end = .;

+	.got : { *(.got.plt) *(.got) }

+	.dynamic : { *(.dynamic) }

+

+	__data_end = .;

+

+	/* unintialized data (in same segment as writable data) */

+	. = ALIGN(4);

+	__bss_start = .;

+	.bss : { *(.bss .bss.*) }

+

+

+

+

+	. = ALIGN(4);

+	_end = .;

+

+

+

+	. = %MEMBASE% + %MEMSIZE%;

+	_end_of_ram = .;

+

+	/* Strip unnecessary stuff */

+	/DISCARD/ : { *(.comment .note .eh_frame) }

+}

diff --git a/arch/arm/trustzone-test-system-onesegment.ld b/arch/arm/trustzone-test-system-onesegment.ld
new file mode 100644
index 0000000..381833f
--- /dev/null
+++ b/arch/arm/trustzone-test-system-onesegment.ld
@@ -0,0 +1,93 @@
+OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")

+OUTPUT_ARCH(arm)

+

+ENTRY(_start)

+SECTIONS

+{

+/*Added TRUSTZONE at 0x0. Moving rest of APPSBL to %MEMBASE% */

+	. = 0x0;

+	.tzbsp 0x0 : {*tzbsp_bin.o(.data)}

+	.romlite 0xBF000 : {*romlite_toc_and_data.o(.data.rom_lite_preflashed_data)}

+	. = %MEMBASE%;

+	.interp : { *(.interp) }

+	.hash : { *(.hash) }

+	.dynsym : { *(.dynsym) }

+	.dynstr : { *(.dynstr) }

+	.rel.text : { *(.rel.text) *(.rel.gnu.linkonce.t*) }

+	.rela.text : { *(.rela.text) *(.rela.gnu.linkonce.t*) }

+	.rel.data : { *(.rel.data) *(.rel.gnu.linkonce.d*) }

+	.rela.data : { *(.rela.data) *(.rela.gnu.linkonce.d*) }

+	.rel.rodata : { *(.rel.rodata) *(.rel.gnu.linkonce.r*) }

+	.rela.rodata : { *(.rela.rodata) *(.rela.gnu.linkonce.r*) }

+	.rel.got : { *(.rel.got) }

+	.rela.got : { *(.rela.got) }

+	.rel.ctors : { *(.rel.ctors) }

+	.rela.ctors : { *(.rela.ctors) }

+	.rel.dtors : { *(.rel.dtors) }

+	.rela.dtors : { *(.rela.dtors) }

+	.rel.init : { *(.rel.init) }

+	.rela.init : { *(.rela.init) }

+	.rel.fini : { *(.rel.fini) }

+	.rela.fini : { *(.rela.fini) }

+	.rel.bss : { *(.rel.bss) }

+	.rela.bss : { *(.rela.bss) }

+	.rel.plt : { *(.rel.plt) }

+	.rela.plt : { *(.rela.plt) }

+/*Moving harcoded addresses by a displacement of %MEMBASE%  */

+	.init : { *(.init) } = %MEMBASE% + 0x9090

+	.plt : { *(.plt) }

+

+	/* text/read-only data */

+

+/*Moving harcoded addresses by a displacement of %MEMBASE%  */

+	 .text : { *(.text .text.* .glue_7* .gnu.linkonce.t.*) } = %MEMBASE% + 0x9090

+

+	.rodata : {

+		*(.rodata .rodata.* .gnu.linkonce.r.*)

+		. = ALIGN(4);

+		__commands_start = .;

+		KEEP (*(.commands))

+		__commands_end = .;

+		. = ALIGN(4);

+		__apps_start = .;

+		KEEP (*(.apps))

+		__apps_end = .;

+		. = ALIGN(4);

+		__rodata_end = . ;

+	}

+

+	/* writable data  */

+	__data_start_rom = .;	/* in one segment binaries, the rom data address is on top of the ram data address */

+	__data_start = .;

+	.data : SUBALIGN(4) { *(.data .data.* .gnu.linkonce.d.*) }

+

+	__ctor_list = .;

+	.ctors : { *(.ctors) }

+	__ctor_end = .;

+	__dtor_list = .;

+	.dtors : { *(.dtors) }

+	__dtor_end = .;

+	.got : { *(.got.plt) *(.got) }

+	.dynamic : { *(.dynamic) }

+

+	__data_end = .;

+

+	/* unintialized data (in same segment as writable data) */

+	. = ALIGN(4);

+	__bss_start = .;

+	.bss : { *(.bss .bss.*) }

+

+

+

+

+	. = ALIGN(4);

+	_end = .;

+

+

+

+	. = %MEMBASE% + %MEMSIZE%;

+	_end_of_ram = .;

+

+	/* Strip unnecessary stuff */

+	/DISCARD/ : { *(.comment .note .eh_frame) }

+}

diff --git a/make/build.mk b/make/build.mk
index 028dc2c..ffbcdc4 100644
--- a/make/build.mk
+++ b/make/build.mk
@@ -6,9 +6,16 @@
 	$(NOECHO)$(SIZE) $<
 	$(NOCOPY)$(OBJCOPY) -O binary $< $@
 
+ifeq ($(ENABLE_TRUSTZONE), 1)
+$(OUTELF): $(ALLOBJS) $(LINKER_SCRIPT) $(OUTPUT_TZ_BIN)
+	@echo linking $@
+	$(NOECHO)$(LD) $(LDFLAGS) -T $(LINKER_SCRIPT) $(OUTPUT_TZ_BIN) $(ALLOBJS) $(LIBGCC) -o $@
+else
 $(OUTELF): $(ALLOBJS) $(LINKER_SCRIPT)
 	@echo linking $@
 	$(NOECHO)$(LD) $(LDFLAGS) -T $(LINKER_SCRIPT) $(ALLOBJS) $(LIBGCC) -o $@
+endif
+
 
 $(OUTELF).sym: $(OUTELF)
 	@echo generating symbols: $@
@@ -26,5 +33,11 @@
 	@echo generating size map: $@
 	$(NOECHO)$(NM) -S --size-sort $< > $@
 
+ifeq ($(ENABLE_TRUSTZONE), 1)
+$(OUTPUT_TZ_BIN): $(INPUT_TZ_BIN)
+	@echo generating TZ output from TZ input
+	$(NOECHO)$(OBJCOPY) -I binary -B arm -O elf32-littlearm $(INPUT_TZ_BIN) $(OUTPUT_TZ_BIN)
+endif
+
 include arch/$(ARCH)/compile.mk
 
diff --git a/makefile b/makefile
index d6687da..f93bfd9 100644
--- a/makefile
+++ b/makefile
@@ -34,6 +34,14 @@
 OUTELF := $(BUILDDIR)/lk
 CONFIGHEADER := $(BUILDDIR)/config.h
 
+#Initialize the command-line flag ENABLE_TRUSTZONE. Value for flag passed in at command-line will take precedence
+ENABLE_TRUSTZONE := 0
+
+ifeq ($(ENABLE_TRUSTZONE),1)
+	INPUT_TZ_BIN := tzbsp/tzbsp.bin
+	OUTPUT_TZ_BIN := $(BUILDDIR)/tzbsp_bin.o
+endif
+
 INCLUDES := -I$(BUILDDIR) -Iinclude
 CFLAGS := -O2 -g -fno-builtin -finline -W -Wall -Wno-multichar -Wno-unused-parameter -Wno-unused-function -include $(CONFIGHEADER)
 #CFLAGS += -Werror
diff --git a/platform/msm7x30/rules.mk b/platform/msm7x30/rules.mk
index 8bb591a..d3fcc77 100644
--- a/platform/msm7x30/rules.mk
+++ b/platform/msm7x30/rules.mk
@@ -23,7 +23,15 @@
 	$(LOCAL_DIR)/panel.o \
 	$(LOCAL_DIR)/acpuclock.o
 
-LINKER_SCRIPT += $(BUILDDIR)/system-onesegment.ld
+ifeq ($(ENABLE_TRUSTZONE),1)
+	ifeq ($(ENABLE_ROMLITE_LOCAL_TEST), 1)
+		LINKER_SCRIPT += $(BUILDDIR)/trustzone-test-system-onesegment.ld
+	else
+		LINKER_SCRIPT += $(BUILDDIR)/trustzone-system-onesegment.ld
+	endif
+else
+	LINKER_SCRIPT += $(BUILDDIR)/system-onesegment.ld
+endif
 
 include platform/msm_shared/rules.mk
 
diff --git a/target/msm8655_surf/rules.mk b/target/msm8655_surf/rules.mk
index e318b14..d24b4e0 100644
--- a/target/msm8655_surf/rules.mk
+++ b/target/msm8655_surf/rules.mk
@@ -4,8 +4,15 @@
 
 PLATFORM := msm7x30
 
-MEMBASE := 0x00000000 # EBI
-MEMSIZE := 0x00100000 # 1MB
+ifeq ($(ENABLE_TRUSTZONE),1)
+	LK_START := 0x0   #Start of LK image
+	MEMBASE := 0x00080000 # EBI  Lies at 512K, after TrustZone
+	MEMSIZE := 0x00080000 # 512K  Size reduced to 512K from 1MB
+	ROMLITE_PREFLASHED_DATA := 0xBF000 # Only used for local testing. Romlite binary will be flashed to this location
+else
+	MEMBASE := 0x00000000 # EBI
+	MEMSIZE := 0x00100000 # 1MB
+endif
 
 BASE_ADDR            := 0x00200000
 
diff --git a/target/msm8655_surf/tools/makefile b/target/msm8655_surf/tools/makefile
index 94f47ca..5cb1229 100644
--- a/target/msm8655_surf/tools/makefile
+++ b/target/msm8655_surf/tools/makefile
@@ -39,7 +39,12 @@
 emmc_appsboothd.mbn: mkheader $(OUTBIN)
 	$(SRC_DIR)/mkheader $(OUTBIN) $(APPSBOOTHEADER_DIR)/emmc_appsboothd.mbn
 
+ifeq ($(ENABLE_TRUSTZONE), 1)
+mkheader: $(SRC_DIR)/mkheader.c
+	${COMPILER} -DMEMBASE=$(LK_START) $(SRC_DIR)/mkheader.c -o $(SRC_DIR)/mkheader
+	cp $(SRC_DIR)/mkheader $(APPSBOOTHEADER_DIR)/mkheader
+else
 mkheader: $(SRC_DIR)/mkheader.c
 	${COMPILER} -DMEMBASE=$(MEMBASE) $(SRC_DIR)/mkheader.c -o $(SRC_DIR)/mkheader
 	cp $(SRC_DIR)/mkheader $(APPSBOOTHEADER_DIR)/mkheader
-
+endif