From 53d6f4cbc3e44afdea5c7205d810deed14f136cf Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Sat, 23 Apr 2011 03:11:00 +0000 Subject: [PATCH] Re-introducing support for the amd64 architecture --- Makefile | 3 ++ src/arch/Makefile | 17 +++++++-- src/arch/amd64.c | 84 +++++++++++++++++++++++++++++++++++++++++++ src/arch/amd64.reg | 16 +++++++++ src/arch/project.conf | 12 +++++-- test/Makefile | 10 ++++-- test/amd64.S | 3 ++ test/project.conf | 10 +++++- 8 files changed, 148 insertions(+), 7 deletions(-) create mode 100644 src/arch/amd64.c create mode 100644 src/arch/amd64.reg create mode 100644 test/amd64.S diff --git a/Makefile b/Makefile index 5028483..edfddc1 100644 --- a/Makefile +++ b/Makefile @@ -49,6 +49,7 @@ dist: $(PACKAGE)-$(VERSION)/src/parser.h \ $(PACKAGE)-$(VERSION)/src/token.h \ $(PACKAGE)-$(VERSION)/src/project.conf \ + $(PACKAGE)-$(VERSION)/src/arch/amd64.c \ $(PACKAGE)-$(VERSION)/src/arch/dalvik.c \ $(PACKAGE)-$(VERSION)/src/arch/i386.c \ $(PACKAGE)-$(VERSION)/src/arch/i386_real.c \ @@ -59,6 +60,7 @@ dist: $(PACKAGE)-$(VERSION)/src/arch/sparc.c \ $(PACKAGE)-$(VERSION)/src/arch/sparc64.c \ $(PACKAGE)-$(VERSION)/src/arch/Makefile \ + $(PACKAGE)-$(VERSION)/src/arch/amd64.reg \ $(PACKAGE)-$(VERSION)/src/arch/common.ins \ $(PACKAGE)-$(VERSION)/src/arch/dalvik.ins \ $(PACKAGE)-$(VERSION)/src/arch/dalvik.reg \ @@ -81,6 +83,7 @@ dist: $(PACKAGE)-$(VERSION)/src/format/pe.c \ $(PACKAGE)-$(VERSION)/src/format/Makefile \ $(PACKAGE)-$(VERSION)/src/format/project.conf \ + $(PACKAGE)-$(VERSION)/test/amd64.S \ $(PACKAGE)-$(VERSION)/test/dalvik.S \ $(PACKAGE)-$(VERSION)/test/i386.S \ $(PACKAGE)-$(VERSION)/test/i386_real.S \ diff --git a/src/arch/Makefile b/src/arch/Makefile index 86fdb7d..758458b 100644 --- a/src/arch/Makefile +++ b/src/arch/Makefile @@ -1,4 +1,4 @@ -TARGETS = dalvik.so i386.so i386_real.so i486.so i586.so i686.so java.so sparc.so sparc64.so +TARGETS = amd64.so dalvik.so i386.so i386_real.so i486.so i586.so i686.so java.so sparc.so sparc64.so PREFIX = /usr/local DESTDIR = LIBDIR = $(PREFIX)/lib @@ -18,6 +18,13 @@ INSTALL = install all: $(TARGETS) +amd64_OBJS = amd64.o +amd64_CFLAGS = $(CPPFLAGSF) $(CPPFLAGS) $(CFLAGSF) $(CFLAGS) +amd64_LDFLAGS = $(LDFLAGSF) $(LDFLAGS) + +amd64.so: $(amd64_OBJS) + $(LD) -o amd64.so $(amd64_OBJS) $(amd64_LDFLAGS) + dalvik_OBJS = dalvik.o dalvik_CFLAGS = $(CPPFLAGSF) $(CPPFLAGS) $(CFLAGSF) $(CFLAGS) dalvik_LDFLAGS = $(LDFLAGSF) $(LDFLAGS) @@ -81,6 +88,9 @@ sparc64_LDFLAGS = $(LDFLAGSF) $(LDFLAGS) sparc64.so: $(sparc64_OBJS) $(LD) -o sparc64.so $(sparc64_OBJS) $(sparc64_LDFLAGS) +amd64.o: amd64.c amd64.reg common.ins null.ins i386.h i386.ins i386.reg i486.ins i686.ins i686.reg + $(CC) $(amd64_CFLAGS) -c amd64.c + dalvik.o: dalvik.c common.ins null.ins dalvik.ins dalvik.reg $(CC) $(dalvik_CFLAGS) -c dalvik.c @@ -109,12 +119,14 @@ sparc64.o: sparc64.c common.ins null.ins sparc.h sparc.ins sparc.reg $(CC) $(sparc64_CFLAGS) -c sparc64.c clean: - $(RM) -- $(dalvik_OBJS) $(i386_OBJS) $(i386_real_OBJS) $(i486_OBJS) $(i586_OBJS) $(i686_OBJS) $(java_OBJS) $(sparc_OBJS) $(sparc64_OBJS) + $(RM) -- $(amd64_OBJS) $(dalvik_OBJS) $(i386_OBJS) $(i386_real_OBJS) $(i486_OBJS) $(i586_OBJS) $(i686_OBJS) $(java_OBJS) $(sparc_OBJS) $(sparc64_OBJS) distclean: clean $(RM) -- $(TARGETS) install: $(TARGETS) + $(MKDIR) $(DESTDIR)$(LIBDIR)/asm/arch + $(INSTALL) -m 0644 -- amd64.so $(DESTDIR)$(LIBDIR)/asm/arch/amd64.so $(MKDIR) $(DESTDIR)$(LIBDIR)/asm/arch $(INSTALL) -m 0644 -- dalvik.so $(DESTDIR)$(LIBDIR)/asm/arch/dalvik.so $(MKDIR) $(DESTDIR)$(LIBDIR)/asm/arch @@ -135,6 +147,7 @@ install: $(TARGETS) $(INSTALL) -m 0644 -- sparc64.so $(DESTDIR)$(LIBDIR)/asm/arch/sparc64.so uninstall: + $(RM) -- $(DESTDIR)$(LIBDIR)/asm/arch/amd64.so $(RM) -- $(DESTDIR)$(LIBDIR)/asm/arch/dalvik.so $(RM) -- $(DESTDIR)$(LIBDIR)/asm/arch/i386.so $(RM) -- $(DESTDIR)$(LIBDIR)/asm/arch/i386_real.so diff --git a/src/arch/amd64.c b/src/arch/amd64.c new file mode 100644 index 0000000..5381525 --- /dev/null +++ b/src/arch/amd64.c @@ -0,0 +1,84 @@ +/* $Id$ */ +/* Copyright (c) 2011 Pierre Pronchery */ +/* This file is part of DeforaOS Devel asm */ +/* This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ + + + +#include +#include +#include "Asm.h" + + +/* amd64 */ +/* private */ +/* types */ +/* register sizes */ +#define REG(name, size, id) REG_ ## name ## _size = size, +enum +{ +#include "i386.reg" + REG_size_count +}; +#undef REG + +/* register ids */ +#define REG(name, size, id) REG_ ## name ## _id = id, +enum +{ +#include "i386.reg" +#include "i686.reg" +#include "amd64.reg" + REG_id_count +}; +#undef REG + + +/* variables */ +#define REG(name, size, id) { "" # name, size, id }, +static ArchRegister _amd64_registers[] = +{ +#include "i386.reg" +#include "i686.reg" +#include "amd64.reg" + { NULL, 0, 0 } +}; +#undef REG + +static ArchInstruction _amd64_instructions[] = +{ +#include "i386.ins" +#include "i486.ins" +#include "i686.ins" +#include "common.ins" +#include "null.ins" +}; + + +/* functions */ +#include "i386.h" + + +/* public */ +/* variables */ +/* plug-in */ +ArchPlugin arch_plugin = +{ + NULL, + "amd64", + NULL, + _amd64_registers, + _amd64_instructions, + _i386_write, + NULL +}; diff --git a/src/arch/amd64.reg b/src/arch/amd64.reg new file mode 100644 index 0000000..6b24493 --- /dev/null +++ b/src/arch/amd64.reg @@ -0,0 +1,16 @@ +REG(rax,64, 0x00) +REG(rcx,64, 0x01) +REG(rdx,64, 0x02) +REG(rbx,64, 0x03) +REG(rsp,64, 0x04) +REG(rbp,64, 0x05) +REG(rsi,64, 0x06) +REG(rdi,64, 0x07) +REG(r8, 64, 0x08) +REG(r9, 64, 0x09) +REG(r10, 64, 0x0a) +REG(r11, 64, 0x0b) +REG(r12, 64, 0x0c) +REG(r13, 64, 0x0d) +REG(r14, 64, 0x0e) +REG(r15, 64, 0x0f) diff --git a/src/arch/project.conf b/src/arch/project.conf index 8e05d70..3b02362 100644 --- a/src/arch/project.conf +++ b/src/arch/project.conf @@ -1,8 +1,16 @@ -targets=dalvik,i386,i386_real,i486,i586,i686,java,sparc,sparc64 +targets=amd64,dalvik,i386,i386_real,i486,i586,i686,java,sparc,sparc64 cppflags_force=-I ../../include cflags_force=-W `pkg-config --cflags libSystem` cflags=-Wall -fPIC -pedantic -dist=Makefile,common.ins,dalvik.ins,dalvik.reg,i386.h,i386.ins,i386.reg,i486.ins,i586.ins,i686.ins,i686.reg,null.ins,sparc.h,sparc.ins,sparc.reg +dist=Makefile,amd64.reg,common.ins,dalvik.ins,dalvik.reg,i386.h,i386.ins,i386.reg,i486.ins,i586.ins,i686.ins,i686.reg,null.ins,sparc.h,sparc.ins,sparc.reg + +[amd64] +type=plugin +sources=amd64.c +install=$(LIBDIR)/asm/arch + +[amd64.c] +depends=amd64.reg,common.ins,null.ins,i386.h,i386.ins,i386.reg,i486.ins,i686.ins,i686.reg [dalvik] type=plugin diff --git a/test/Makefile b/test/Makefile index 9fa0447..5d9d4db 100644 --- a/test/Makefile +++ b/test/Makefile @@ -1,4 +1,4 @@ -TARGETS = dalvik.o i386.o i386_real.o i486.o i586.o i686.o java.o sparc.o sparc64.o +TARGETS = amd64.o dalvik.o i386.o i386_real.o i486.o i586.o i686.o java.o sparc.o sparc64.o PREFIX = /usr/local DESTDIR = BINDIR = $(PREFIX)/bin @@ -12,6 +12,9 @@ INSTALL = install all: $(TARGETS) +amd64.o_OBJS = amd64.o +amd64.o_ASFLAGS = $(CPPFLAGSF) $(CPPFLAGS) $(ASFLAGS) -a amd64 + dalvik.o_OBJS = dalvik.o dalvik.o_ASFLAGS = $(CPPFLAGSF) $(CPPFLAGS) $(ASFLAGS) -a dalvik -f flat @@ -39,6 +42,9 @@ sparc.o_ASFLAGS = $(CPPFLAGSF) $(CPPFLAGS) $(ASFLAGS) -a sparc sparc64.o_OBJS = sparc64.o sparc64.o_ASFLAGS = $(CPPFLAGSF) $(CPPFLAGS) $(ASFLAGS) -a sparc64 +amd64.o: amd64.S ../src/asm + $(AS) $(amd64.o_ASFLAGS) -o amd64.o amd64.S + dalvik.o: dalvik.S ../src/asm $(AS) $(dalvik.o_ASFLAGS) -o dalvik.o dalvik.S @@ -67,7 +73,7 @@ sparc64.o: sparc64.S ../src/asm $(AS) $(sparc64.o_ASFLAGS) -o sparc64.o sparc64.S clean: - $(RM) -- $(dalvik.o_OBJS) $(i386.o_OBJS) $(i386_real.o_OBJS) $(i486.o_OBJS) $(i586.o_OBJS) $(i686.o_OBJS) $(java.o_OBJS) $(sparc.o_OBJS) $(sparc64.o_OBJS) + $(RM) -- $(amd64.o_OBJS) $(dalvik.o_OBJS) $(i386.o_OBJS) $(i386_real.o_OBJS) $(i486.o_OBJS) $(i586.o_OBJS) $(i686.o_OBJS) $(java.o_OBJS) $(sparc.o_OBJS) $(sparc64.o_OBJS) distclean: clean $(RM) -- $(TARGETS) diff --git a/test/amd64.S b/test/amd64.S new file mode 100644 index 0000000..7b2a825 --- /dev/null +++ b/test/amd64.S @@ -0,0 +1,3 @@ +/* $Id$ */ +.text + nop diff --git a/test/project.conf b/test/project.conf index 8cac540..0f6525e 100644 --- a/test/project.conf +++ b/test/project.conf @@ -1,7 +1,15 @@ -targets=dalvik.o,i386.o,i386_real.o,i486.o,i586.o,i686.o,java.o,sparc.o,sparc64.o +targets=amd64.o,dalvik.o,i386.o,i386_real.o,i486.o,i586.o,i686.o,java.o,sparc.o,sparc64.o as=../src/asm dist=Makefile +[amd64.o] +type=object +sources=amd64.S + +[amd64.S] +asflags=-a amd64 +depends=../src/asm + [dalvik.o] type=object sources=dalvik.S