fix cpuid asm instruction call

This patch cfixes some compilation warning and clean the Android.mk a
little bit.

Bug: 16928801

Change-Id: Icc277c0871cce83e183a109cfe24daf6e5ad8fab
Signed-off-by: Jeremy Compostella <[email protected]>
diff --git a/Android.mk b/Android.mk
index e90bb6c..8a70a83 100644
--- a/Android.mk
+++ b/Android.mk
@@ -1,16 +1,18 @@
 LOCAL_PATH := $(call my-dir)
-    
+
 ifeq ($(TARGET_BOARD_PLATFORM),moorefield)
 
-include $(CLEAR_VARS)
-
-# First compile bootstub.bin
-
 CMDLINE_SIZE ?= 0x400
 BOOTSTUB_SIZE ?= 8192
 
-LOCAL_CC := gcc
-LOCAL_SRC_FILES := bootstub.c head.S e820_bios.S sfi.c ssp-uart.c imr_toc.c spi-uart.c
+BOOTSTUB_SRC_FILES := bootstub.c sfi.c ssp-uart.c imr_toc.c spi-uart.c
+BOOTSTUB_SRC_FILES_x86 := head.S e820_bios.S
+
+include $(CLEAR_VARS)
+
+# bootstub.bin
+LOCAL_SRC_FILES := $(BOOTSTUB_SRC_FILES)
+LOCAL_SRC_FILES_x86 := $(BOOTSTUB_SRC_FILES_x86)
 ANDROID_TOOLCHAIN_FLAGS := -m32 -ffreestanding
 LOCAL_CFLAGS := $(ANDROID_TOOLCHAIN_FLAGS) -Wall -O1 -DCMDLINE_SIZE=${CMDLINE_SIZE}
 LOCAL_MODULE := bootstub.bin
@@ -20,15 +22,13 @@
 LOCAL_FORCE_STATIC_EXECUTABLE := true
 
 
-head.o : PRIVATE_CFLAGS := -D__ASSEMBLY__
-
 include $(BUILD_SYSTEM)/binary.mk
 
 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_GLOBAL_CFLAGS := $(LOCAL_CFLAGS)
 $(LOCAL_BUILT_MODULE) : PRIVATE_ELF_FILE := $(intermediates)/$(PRIVATE_MODULE).elf
 $(LOCAL_BUILT_MODULE) : PRIVATE_LINK_SCRIPT := $(LOCAL_PATH)/bootstub.lds
 $(LOCAL_BUILT_MODULE) : BOOTSTUB_OBJS := $(patsubst %.c, %.o , $(LOCAL_SRC_FILES))
-$(LOCAL_BUILT_MODULE) : BOOTSTUB_OBJS := $(patsubst %.S, %.o , $(BOOTSTUB_OBJS))
+$(LOCAL_BUILT_MODULE) : BOOTSTUB_OBJS += $(patsubst %.S, %.o , $(LOCAL_SRC_FILES_x86))
 $(LOCAL_BUILT_MODULE) : BOOTSTUB_OBJS := $(addprefix $(intermediates)/, $(BOOTSTUB_OBJS))
 
 $(LOCAL_BUILT_MODULE): $(all_objects)
@@ -42,7 +42,6 @@
 	$(hide) $(TARGET_OBJCOPY) -O binary -R .note -R .comment -S $(PRIVATE_ELF_FILE) $@
 
 # Then assemble the final bootstub file
-
 bootstub_bin := $(PRODUCT_OUT)/bootstub.bin
 bootstub_full := $(PRODUCT_OUT)/bootstub
 
@@ -60,10 +59,9 @@
 # build specific bootstub for GPT/AOSP image support
 include $(CLEAR_VARS)
 
-# First compile 2ndbootloader.bin
-
-LOCAL_CC := gcc
-LOCAL_SRC_FILES := bootstub.c head.S e820_bios.S sfi.c ssp-uart.c imr_toc.c spi-uart.c
+# 2ndbootloader.bin
+LOCAL_SRC_FILES := $(BOOTSTUB_SRC_FILES)
+LOCAL_SRC_FILES_x86 := $(BOOTSTUB_SRC_FILES_x86)
 ANDROID_TOOLCHAIN_FLAGS := -m32 -ffreestanding
 LOCAL_CFLAGS := $(ANDROID_TOOLCHAIN_FLAGS) -Wall -O1 -DCMDLINE_SIZE=${CMDLINE_SIZE} -DBUILD_RAMDUMP
 LOCAL_MODULE := 2ndbootloader.bin
@@ -72,15 +70,13 @@
 LOCAL_MODULE_CLASS := EXECUTABLES
 LOCAL_FORCE_STATIC_EXECUTABLE := true
 
-head.o : PRIVATE_CFLAGS := -D__ASSEMBLY__
-
 include $(BUILD_SYSTEM)/binary.mk
 
 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_GLOBAL_CFLAGS := $(LOCAL_CFLAGS)
 $(LOCAL_BUILT_MODULE) : PRIVATE_ELF_FILE := $(intermediates)/$(PRIVATE_MODULE).elf
 $(LOCAL_BUILT_MODULE) : PRIVATE_LINK_SCRIPT := $(LOCAL_PATH)/2ndbootloader.lds
 $(LOCAL_BUILT_MODULE) : BOOTSTUB_OBJS := $(patsubst %.c, %.o , $(LOCAL_SRC_FILES))
-$(LOCAL_BUILT_MODULE) : BOOTSTUB_OBJS := $(patsubst %.S, %.o , $(BOOTSTUB_OBJS))
+$(LOCAL_BUILT_MODULE) : BOOTSTUB_OBJS += $(patsubst %.S, %.o , $(LOCAL_SRC_FILES_x86))
 $(LOCAL_BUILT_MODULE) : BOOTSTUB_OBJS := $(addprefix $(intermediates)/, $(BOOTSTUB_OBJS))
 
 $(LOCAL_BUILT_MODULE): $(all_objects)
@@ -93,8 +89,7 @@
 		-o $(PRIVATE_ELF_FILE)
 	$(hide) $(TARGET_OBJCOPY) -O binary -R .note -R .comment -S $(PRIVATE_ELF_FILE) $@
 
-# Then assemble the final bootstub file
-
+# Then assemble the final 2ndbootloader file
 bootstub_aosp_bin := $(PRODUCT_OUT)/2ndbootloader.bin
 bootstub_aosp_full := $(PRODUCT_OUT)/2ndbootloader
 
diff --git a/Makefile b/Makefile
deleted file mode 100644
index 72bb817..0000000
--- a/Makefile
+++ /dev/null
@@ -1,47 +0,0 @@
-OBJ=bootstub.o spi-uart.o head.o sfi.o e820_bios.o ssp-uart.o
-CMDLINE_SIZE ?= 0x400
-CFLAGS=-m32 -ffreestanding -Wall -DCMDLINE_SIZE=${CMDLINE_SIZE}
-CC ?= gcc
-
-all: bootstub
-
-bootstub:bootstub.bin
-	cat bootstub.bin /dev/zero | dd bs=4096 count=1 > $@
-
-bootstub.bin:bootstub.elf
-	objcopy -O binary -R .note -R .comment -S $< $@
-
-bootstub.elf:bootstub.lds $(OBJ)
-	ld -m elf_i386 -T bootstub.lds $(OBJ) -o $@
-
-bootstub.o:bootstub.c bootstub.h
-	${CC} $(CFLAGS) -c bootstub.c
-
-spi-uart.o:spi-uart.c spi-uart.h
-	${CC} $(CFLAGS) -c spi-uart.c
-
-ssp-uart.o:ssp-uart.c ssp-uart.h
-	${CC} $(CFLAGS) -c ssp-uart.c
-
-sfi.o:sfi.c
-	${CC} $(CFLAGS) -c sfi.c
-
-head.o:head.S bootstub.h
-	${CC} $(CFLAGS) -D__ASSEMBLY__ -c head.S
-
-e820_bios.o:e820_bios.S bootstub.h
-	${CC} $(CFLAGS) -D__ASSEMBLY__ -c e820_bios.S
-
-clean:
-	rm -rf *.o *.bin *.elf *.bz2 *.rpm
-	-rm bootstub
-
-source:bootstub.c head.S VERSION
-	git archive --prefix=bootstub-`head -n 1 VERSION | awk '{print $$1}'`/ --format=tar HEAD | bzip2 -c > bootstub-`head -n 1 VERSION | awk '{print $$1}'`.tar.bz2
-
-rpm:source
-	cp bootstub.spec /usr/src/redhat/SPECS/
-	cp *.tar.bz2 /usr/src/redhat/SOURCES/
-	rpmbuild -ba /usr/src/redhat/SPECS/bootstub.spec
-	cp /usr/src/redhat/RPMS/i386/bootstub*.rpm ./
-.PHONY: all clean source rpm
diff --git a/bootstub.c b/bootstub.c
index 74b87f9..c968d04 100644
--- a/bootstub.c
+++ b/bootstub.c
@@ -202,27 +202,15 @@
 	return (((unsigned int)ptr+511)/512)*512;
 }
 
-static int get_32bit_entry(unsigned char *ptr)
+static inline void cpuid(u32 op, u32 regs[4])
 {
-	while (1){
-		if (*(u32 *)ptr == SETUP_SIGNATURE && *(u32 *)(ptr+4) == 0)
-			break;
-		ptr++;
-	}
-	ptr+=4;
-	return (((unsigned int)ptr+511)/512)*512;
-}
-
-static inline void cpuid(u32 op, u32 *eax, u32 *ebx, u32 *ecx, u32 *edx)
-{
-	*eax = op;
-	*ecx = 0;
-	asm volatile("cpuid"
-		: "=a" (*eax),
-		"=b" (*ebx),
-		"=c" (*ecx),
-		"=d" (*edx)
-		: "0" (*eax), "2" (*ecx));
+	__asm__ volatile (
+		"mov %%ebx, %%edi\n"
+		"cpuid\n"
+		"xchg %%edi, %%ebx\n"
+		: "=a"(regs[0]), "=D"(regs[1]), "=c"(regs[2]), "=d"(regs[3])
+		: "a"(op)
+		);
 }
 
 enum cpuid_regs {
@@ -236,7 +224,7 @@
 {
 	u32 regs[4];
 
-	cpuid(1, &regs[CR_EAX], &regs[CR_EBX], &regs[CR_ECX], &regs[CR_EDX]);
+	cpuid(1, regs);
 
 	switch ( regs[CR_EAX] & CPUID_MASK ) {
 
@@ -386,10 +374,10 @@
         }
 
 	mb.cmdline = (u32)strnchr((char *)CMDLINE_OFFSET, '$', CMDLINE_SIZE) + 1;
-	dst = mb.cmdline + strnlen(mb.cmdline, CMDLINE_SIZE) - 1;
+	dst = (char *)mb.cmdline + strnlen((const char *)mb.cmdline, CMDLINE_SIZE) - 1;
 	*dst = ' ';
 	dst++;
-	src = (const char *)CMDLINE_OFFSET;
+	src = (char *)CMDLINE_OFFSET;
 	for (i = 0 ;i < strnlen((const char *)CMDLINE_OFFSET, CMDLINE_SIZE);i++) {
 		if (!strncmp(src, "capfreq=", 8)) {
 			while (*src != ' ' && *src != 0) {