diff mbox series

[V8,2/4] tests/migration: Support cross compilation in generating boot header file

Message ID 1535778675-32170-3-git-send-email-wei@redhat.com (mailing list archive)
State New, archived
Headers show
Series tests: Add migration test for aarch64 | expand

Commit Message

Wei Huang Sept. 1, 2018, 5:11 a.m. UTC
Recently a new configure option, CROSS_CC_GUEST, was added to
$(TARGET)-softmmu/config-target.mak to support TCG-related tests. This
patch tries to leverage this option to support cross compilation when the
migration boot block file is being re-generated:

 * The x86_64 related files are moved to a new sub-dir (named ./x86_64).
 * A new top-layer Makefile is created in tests/migration/ directory.
   This Makefile searches and parses CROSS_CC_GUEST to generate CROSS_PREFIX.
   The CROSS_PREFIX, if available, is then passed to migration/$ARCH/Makefile.

Signed-off-by: Wei Huang <wei@redhat.com>
---
 tests/migration-test.c                           |  2 +-
 tests/migration/Makefile                         | 43 +++++++++++++-----------
 tests/migration/x86_64/Makefile                  | 22 ++++++++++++
 tests/migration/{ => x86_64}/x86-a-b-bootblock.S |  0
 tests/migration/{ => x86_64}/x86-a-b-bootblock.h |  8 ++---
 5 files changed, 50 insertions(+), 25 deletions(-)
 create mode 100644 tests/migration/x86_64/Makefile
 rename tests/migration/{ => x86_64}/x86-a-b-bootblock.S (100%)
 rename tests/migration/{ => x86_64}/x86-a-b-bootblock.h (93%)

Comments

Juan Quintela Sept. 3, 2018, 9:43 a.m. UTC | #1
Wei Huang <wei@redhat.com> wrote:
> Recently a new configure option, CROSS_CC_GUEST, was added to
> $(TARGET)-softmmu/config-target.mak to support TCG-related tests. This
> patch tries to leverage this option to support cross compilation when the
> migration boot block file is being re-generated:
>
>  * The x86_64 related files are moved to a new sub-dir (named ./x86_64).
>  * A new top-layer Makefile is created in tests/migration/ directory.
>    This Makefile searches and parses CROSS_CC_GUEST to generate CROSS_PREFIX.
>    The CROSS_PREFIX, if available, is then passed to migration/$ARCH/Makefile.
>
> Signed-off-by: Wei Huang <wei@redhat.com>

Reviewed-by: Juan Quintela <quintela@redhat.com>
Andrew Jones Sept. 3, 2018, 11:26 a.m. UTC | #2
On Sat, Sep 01, 2018 at 01:11:13AM -0400, Wei Huang wrote:
> Recently a new configure option, CROSS_CC_GUEST, was added to
> $(TARGET)-softmmu/config-target.mak to support TCG-related tests. This
> patch tries to leverage this option to support cross compilation when the
> migration boot block file is being re-generated:
> 
>  * The x86_64 related files are moved to a new sub-dir (named ./x86_64).
>  * A new top-layer Makefile is created in tests/migration/ directory.
>    This Makefile searches and parses CROSS_CC_GUEST to generate CROSS_PREFIX.
>    The CROSS_PREFIX, if available, is then passed to migration/$ARCH/Makefile.
> 
> Signed-off-by: Wei Huang <wei@redhat.com>
> ---
>  tests/migration-test.c                           |  2 +-
>  tests/migration/Makefile                         | 43 +++++++++++++-----------
>  tests/migration/x86_64/Makefile                  | 22 ++++++++++++
>  tests/migration/{ => x86_64}/x86-a-b-bootblock.S |  0
>  tests/migration/{ => x86_64}/x86-a-b-bootblock.h |  8 ++---
>  5 files changed, 50 insertions(+), 25 deletions(-)
>  create mode 100644 tests/migration/x86_64/Makefile
>  rename tests/migration/{ => x86_64}/x86-a-b-bootblock.S (100%)
>  rename tests/migration/{ => x86_64}/x86-a-b-bootblock.h (93%)
> 
> diff --git a/tests/migration-test.c b/tests/migration-test.c
> index 0e687b7..c4d79e9 100644
> --- a/tests/migration-test.c
> +++ b/tests/migration-test.c
> @@ -83,7 +83,7 @@ static const char *tmpfs;
>  /* A simple PC boot sector that modifies memory (1-100MB) quickly
>   * outputting a 'B' every so often if it's still running.
>   */
> -#include "tests/migration/x86-a-b-bootblock.h"
> +#include "tests/migration/x86_64/x86-a-b-bootblock.h"

Is x86-a-b-bootblock.h specific to x86_64, or both i386 and x86_64?
I think we want the dir name to be i386 if it's the later. Also,
we could drop the 'x86-' prefix from the filename, now that the
directory identifies the arch.

>  
>  static void init_bootfile_x86(const char *bootpath)
>  {
> diff --git a/tests/migration/Makefile b/tests/migration/Makefile
> index 5d5fa07..1de480e 100644
> --- a/tests/migration/Makefile
> +++ b/tests/migration/Makefile
> @@ -1,31 +1,34 @@
> -# To specify cross compiler prefix, use CROSS_PREFIX=
> -#   > make CROSS_PREFIX=x86_64-linux-gnu-
> +#
> +# Copyright (c) 2018 Red Hat, Inc. and/or its affiliates
> +#
> +# This work is licensed under the terms of the GNU GPL, version 2 or later.
> +# See the COPYING file in the top-level directory.
> +#
> +
> +TARGET_LIST = x86_64
> +
> +SRC_PATH = ../..
>  
>  override define __note
> -/* This file is automatically generated from
> - * tests/migration/x86-a-b-bootblock.s, edit that and then run
> - * tests/migration/rebuild-x86-bootblock.sh to update,
> - * and then remember to send both in your patch submission.
> +/* This file is automatically generated from the assembly file in
> + * tests/migration/$@, edit that and then run "make all"

nit: /, edit that/. Edit that file/

> + * inside tests/migration to update, and then remember to send both
> + * in your patch submission.
nit: ^ the header and the assembler differences

>   */
>  endef
>  export __note
>  
> -.PHONY: all clean
> -all: x86-a-b-bootblock.h
> -
> -x86-a-b-bootblock.h: x86.bootsect
> -	echo "$$__note" > header.tmp
> -	xxd -i $< | sed -e 's/.*int.*//' >> header.tmp
> -	mv header.tmp $@
> +parse-cross-prefix = $(subst gcc,,$(patsubst cc,gcc,$(patsubst CROSS_CC_GUEST="%",%,$(shell grep "CROSS_CC_GUEST=" $(SRC_PATH)/$(1)-softmmu/config-target.mak))))
> +gen-cross-prefix = $(patsubst %-,CROSS_PREFIX=%-,$(call parse-cross-prefix,$(1)))
>  
> -x86.bootsect: x86.boot
> -	dd if=$< of=$@ bs=256 count=2 skip=124
> +.PHONY: all $(TARGET_LIST)
>  
> -x86.boot: x86.o
> -	$(CROSS_PREFIX)objcopy -O binary $< $@
> +all: $(TARGET_LIST)
>  
> -x86.o: x86-a-b-bootblock.S
> -	$(CROSS_PREFIX)gcc -m32 -march=i486 -c $< -o $@
> +$(TARGET_LIST):
> +	$(MAKE) -C $@ $(call gen-cross-prefix,$@)
>  
>  clean:
> -	@rm -rf *.boot *.o *.bootsect
> +	for target in $(TARGET_LIST); do \
> +		$(MAKE) -C $$target clean; \
> +	done

The above seems overly complicated. Does the following work?

$(TARGET_LIST): CROSS_PREFIX=$(CROSS_CC_GUEST)
$(TARGET_LIST):
	$(MAKE) -C $@


> diff --git a/tests/migration/x86_64/Makefile b/tests/migration/x86_64/Makefile
> new file mode 100644
> index 0000000..6dc849f
> --- /dev/null
> +++ b/tests/migration/x86_64/Makefile
> @@ -0,0 +1,22 @@
> +# To specify cross compiler prefix, use CROSS_PREFIX=
> +#   > make CROSS_PREFIX=x86_64-linux-gnu-
> +
> +.PHONY: all clean
> +all: x86-a-b-bootblock.h
> +
> +x86-a-b-bootblock.h: x86.bootsect
> +	echo "$$__note" > header.tmp
> +	xxd -i $< | sed -e 's/.*int.*//' >> header.tmp
> +	mv header.tmp $@
> +
> +x86.bootsect: x86.boot
> +	dd if=$< of=$@ bs=256 count=2 skip=124
> +
> +x86.boot: x86.o
> +	$(CROSS_PREFIX)objcopy -O binary $< $@
> +
> +x86.o: x86-a-b-bootblock.S
> +	$(CROSS_PREFIX)gcc -m32 -march=i486 -c $< -o $@
> +
> +clean:
> +	@rm -rf *.boot *.o *.bootsect
> diff --git a/tests/migration/x86-a-b-bootblock.S b/tests/migration/x86_64/x86-a-b-bootblock.S
> similarity index 100%
> rename from tests/migration/x86-a-b-bootblock.S
> rename to tests/migration/x86_64/x86-a-b-bootblock.S
> diff --git a/tests/migration/x86-a-b-bootblock.h b/tests/migration/x86_64/x86-a-b-bootblock.h
> similarity index 93%
> rename from tests/migration/x86-a-b-bootblock.h
> rename to tests/migration/x86_64/x86-a-b-bootblock.h
> index 78a151f..73670ef 100644
> --- a/tests/migration/x86-a-b-bootblock.h
> +++ b/tests/migration/x86_64/x86-a-b-bootblock.h
> @@ -1,7 +1,7 @@
> -/* This file is automatically generated from
> - * tests/migration/x86-a-b-bootblock.s, edit that and then run
> - * tests/migration/rebuild-x86-bootblock.sh to update,
> - * and then remember to send both in your patch submission.
> +/* This file is automatically generated from the assembly file in
> + * tests/migration/x86_64, edit that and then run "make all"
> + * inside tests/migration to update, and then remember to send both
> + * in your patch submission.
>   */
>  unsigned char x86_bootsect[] = {
>    0xfa, 0x0f, 0x01, 0x16, 0x74, 0x7c, 0x66, 0xb8, 0x01, 0x00, 0x00, 0x00,
> -- 
> 1.8.3.1
> 
>

Thanks,
drew
Wei Huang Sept. 4, 2018, 5:04 p.m. UTC | #3
----- Original Message -----
> From: "Andrew Jones" <drjones@redhat.com>
> To: "Wei Huang" <wei@redhat.com>
> Cc: qemu-devel@nongnu.org, lvivier@redhat.com, "peter maydell" <peter.maydell@linaro.org>, quintela@redhat.com,
> dgilbert@redhat.com
> Sent: Monday, September 3, 2018 6:26:39 AM
> Subject: Re: [Qemu-devel] [PATCH V8 2/4] tests/migration: Support cross compilation in generating boot header file
> 
> On Sat, Sep 01, 2018 at 01:11:13AM -0400, Wei Huang wrote:
> > Recently a new configure option, CROSS_CC_GUEST, was added to
> > $(TARGET)-softmmu/config-target.mak to support TCG-related tests. This
> > patch tries to leverage this option to support cross compilation when the
> > migration boot block file is being re-generated:
> > 
> >  * The x86_64 related files are moved to a new sub-dir (named ./x86_64).
> >  * A new top-layer Makefile is created in tests/migration/ directory.
> >    This Makefile searches and parses CROSS_CC_GUEST to generate
> >    CROSS_PREFIX.
> >    The CROSS_PREFIX, if available, is then passed to
> >    migration/$ARCH/Makefile.
> > 
> > Signed-off-by: Wei Huang <wei@redhat.com>
> > ---
> >  tests/migration-test.c                           |  2 +-
> >  tests/migration/Makefile                         | 43
> >  +++++++++++++-----------
> >  tests/migration/x86_64/Makefile                  | 22 ++++++++++++
> >  tests/migration/{ => x86_64}/x86-a-b-bootblock.S |  0
> >  tests/migration/{ => x86_64}/x86-a-b-bootblock.h |  8 ++---
> >  5 files changed, 50 insertions(+), 25 deletions(-)
> >  create mode 100644 tests/migration/x86_64/Makefile
> >  rename tests/migration/{ => x86_64}/x86-a-b-bootblock.S (100%)
> >  rename tests/migration/{ => x86_64}/x86-a-b-bootblock.h (93%)
> > 
> > diff --git a/tests/migration-test.c b/tests/migration-test.c
> > index 0e687b7..c4d79e9 100644
> > --- a/tests/migration-test.c
> > +++ b/tests/migration-test.c
> > @@ -83,7 +83,7 @@ static const char *tmpfs;
> >  /* A simple PC boot sector that modifies memory (1-100MB) quickly
> >   * outputting a 'B' every so often if it's still running.
> >   */
> > -#include "tests/migration/x86-a-b-bootblock.h"
> > +#include "tests/migration/x86_64/x86-a-b-bootblock.h"
> 
> Is x86-a-b-bootblock.h specific to x86_64, or both i386 and x86_64?
> I think we want the dir name to be i386 if it's the later. Also,
> we could drop the 'x86-' prefix from the filename, now that the
> directory identifies the arch.

Well, I can try it. But this will make the Makefile more complicated as we have to detect x86_64 compiler for i386 binary (most distros only ship x86_64 cross compiler).

> 
> >  
> >  static void init_bootfile_x86(const char *bootpath)
> >  {
> > diff --git a/tests/migration/Makefile b/tests/migration/Makefile
> > index 5d5fa07..1de480e 100644
> > --- a/tests/migration/Makefile
> > +++ b/tests/migration/Makefile
> > @@ -1,31 +1,34 @@
> > -# To specify cross compiler prefix, use CROSS_PREFIX=
> > -#   > make CROSS_PREFIX=x86_64-linux-gnu-
> > +#
> > +# Copyright (c) 2018 Red Hat, Inc. and/or its affiliates
> > +#
> > +# This work is licensed under the terms of the GNU GPL, version 2 or
> > later.
> > +# See the COPYING file in the top-level directory.
> > +#
> > +
> > +TARGET_LIST = x86_64
> > +
> > +SRC_PATH = ../..
> >  
> >  override define __note
> > -/* This file is automatically generated from
> > - * tests/migration/x86-a-b-bootblock.s, edit that and then run
> > - * tests/migration/rebuild-x86-bootblock.sh to update,
> > - * and then remember to send both in your patch submission.
> > +/* This file is automatically generated from the assembly file in
> > + * tests/migration/$@, edit that and then run "make all"
> 
> nit: /, edit that/. Edit that file/
> 
> > + * inside tests/migration to update, and then remember to send both
> > + * in your patch submission.
> nit: ^ the header and the assembler differences
> 
> >   */
> >  endef
> >  export __note
> >  
> > -.PHONY: all clean
> > -all: x86-a-b-bootblock.h
> > -
> > -x86-a-b-bootblock.h: x86.bootsect
> > -	echo "$$__note" > header.tmp
> > -	xxd -i $< | sed -e 's/.*int.*//' >> header.tmp
> > -	mv header.tmp $@
> > +parse-cross-prefix = $(subst gcc,,$(patsubst cc,gcc,$(patsubst
> > CROSS_CC_GUEST="%",%,$(shell grep "CROSS_CC_GUEST="
> > $(SRC_PATH)/$(1)-softmmu/config-target.mak))))
> > +gen-cross-prefix = $(patsubst %-,CROSS_PREFIX=%-,$(call
> > parse-cross-prefix,$(1)))
> >  
> > -x86.bootsect: x86.boot
> > -	dd if=$< of=$@ bs=256 count=2 skip=124
> > +.PHONY: all $(TARGET_LIST)
> >  
> > -x86.boot: x86.o
> > -	$(CROSS_PREFIX)objcopy -O binary $< $@
> > +all: $(TARGET_LIST)
> >  
> > -x86.o: x86-a-b-bootblock.S
> > -	$(CROSS_PREFIX)gcc -m32 -march=i486 -c $< -o $@
> > +$(TARGET_LIST):
> > +	$(MAKE) -C $@ $(call gen-cross-prefix,$@)
> >  
> >  clean:
> > -	@rm -rf *.boot *.o *.bootsect
> > +	for target in $(TARGET_LIST); do \
> > +		$(MAKE) -C $$target clean; \
> > +	done
> 
> The above seems overly complicated. Does the following work?
> 
> $(TARGET_LIST): CROSS_PREFIX=$(CROSS_CC_GUEST)
> $(TARGET_LIST):
> 	$(MAKE) -C $@

No, it doen't work for different reasons.

First, to have CROSS_CC_GUEST defined, we normally would use "-include" to include config-target.mak file. But the end result is, the CROSS_CC_GUEST only has the same definition for both architectures (due to make command's multi-iteration processing and include is processed first). Secondly, CROSS_CC_GUEST needs to be polished because it can be: i) not defined; ii) "cc" without prefix; or iii) used-define value. We can't use it directly.



> 
> 
> > diff --git a/tests/migration/x86_64/Makefile
> > b/tests/migration/x86_64/Makefile
> > new file mode 100644
> > index 0000000..6dc849f
> > --- /dev/null
> > +++ b/tests/migration/x86_64/Makefile
> > @@ -0,0 +1,22 @@
> > +# To specify cross compiler prefix, use CROSS_PREFIX=
> > +#   > make CROSS_PREFIX=x86_64-linux-gnu-
> > +
> > +.PHONY: all clean
> > +all: x86-a-b-bootblock.h
> > +
> > +x86-a-b-bootblock.h: x86.bootsect
> > +	echo "$$__note" > header.tmp
> > +	xxd -i $< | sed -e 's/.*int.*//' >> header.tmp
> > +	mv header.tmp $@
> > +
> > +x86.bootsect: x86.boot
> > +	dd if=$< of=$@ bs=256 count=2 skip=124
> > +
> > +x86.boot: x86.o
> > +	$(CROSS_PREFIX)objcopy -O binary $< $@
> > +
> > +x86.o: x86-a-b-bootblock.S
> > +	$(CROSS_PREFIX)gcc -m32 -march=i486 -c $< -o $@
> > +
> > +clean:
> > +	@rm -rf *.boot *.o *.bootsect
> > diff --git a/tests/migration/x86-a-b-bootblock.S
> > b/tests/migration/x86_64/x86-a-b-bootblock.S
> > similarity index 100%
> > rename from tests/migration/x86-a-b-bootblock.S
> > rename to tests/migration/x86_64/x86-a-b-bootblock.S
> > diff --git a/tests/migration/x86-a-b-bootblock.h
> > b/tests/migration/x86_64/x86-a-b-bootblock.h
> > similarity index 93%
> > rename from tests/migration/x86-a-b-bootblock.h
> > rename to tests/migration/x86_64/x86-a-b-bootblock.h
> > index 78a151f..73670ef 100644
> > --- a/tests/migration/x86-a-b-bootblock.h
> > +++ b/tests/migration/x86_64/x86-a-b-bootblock.h
> > @@ -1,7 +1,7 @@
> > -/* This file is automatically generated from
> > - * tests/migration/x86-a-b-bootblock.s, edit that and then run
> > - * tests/migration/rebuild-x86-bootblock.sh to update,
> > - * and then remember to send both in your patch submission.
> > +/* This file is automatically generated from the assembly file in
> > + * tests/migration/x86_64, edit that and then run "make all"
> > + * inside tests/migration to update, and then remember to send both
> > + * in your patch submission.
> >   */
> >  unsigned char x86_bootsect[] = {
> >    0xfa, 0x0f, 0x01, 0x16, 0x74, 0x7c, 0x66, 0xb8, 0x01, 0x00, 0x00, 0x00,
> > --
> > 1.8.3.1
> > 
> >
> 
> Thanks,
> drew
>
Andrew Jones Sept. 4, 2018, 6:05 p.m. UTC | #4
On Tue, Sep 04, 2018 at 01:04:31PM -0400, Wei Huang wrote:
> > > +parse-cross-prefix = $(subst gcc,,$(patsubst cc,gcc,$(patsubst
> > > CROSS_CC_GUEST="%",%,$(shell grep "CROSS_CC_GUEST="
> > > $(SRC_PATH)/$(1)-softmmu/config-target.mak))))
> > > +gen-cross-prefix = $(patsubst %-,CROSS_PREFIX=%-,$(call
> > > parse-cross-prefix,$(1)))
> > >  
> > > -x86.bootsect: x86.boot
> > > -	dd if=$< of=$@ bs=256 count=2 skip=124
> > > +.PHONY: all $(TARGET_LIST)
> > >  
> > > -x86.boot: x86.o
> > > -	$(CROSS_PREFIX)objcopy -O binary $< $@
> > > +all: $(TARGET_LIST)
> > >  
> > > -x86.o: x86-a-b-bootblock.S
> > > -	$(CROSS_PREFIX)gcc -m32 -march=i486 -c $< -o $@
> > > +$(TARGET_LIST):
> > > +	$(MAKE) -C $@ $(call gen-cross-prefix,$@)
> > >  
> > >  clean:
> > > -	@rm -rf *.boot *.o *.bootsect
> > > +	for target in $(TARGET_LIST); do \
> > > +		$(MAKE) -C $$target clean; \
> > > +	done
> > 
> > The above seems overly complicated. Does the following work?
> > 
> > $(TARGET_LIST): CROSS_PREFIX=$(CROSS_CC_GUEST)
> > $(TARGET_LIST):
> > 	$(MAKE) -C $@
> 
> No, it doen't work for different reasons.
> 
> First, to have CROSS_CC_GUEST defined, we normally would use "-include" to include config-target.mak file. But the end result is, the CROSS_CC_GUEST only has the same definition for both architectures (due to make command's multi-iteration processing and include is processed first). Secondly, CROSS_CC_GUEST needs to be polished because it can be: i) not defined; ii) "cc" without prefix; or iii) used-define value. We can't use it directly.
>

OK. Since I don't have any better suggestions. Then this is good
enough for me.

Thanks,
drew
diff mbox series

Patch

diff --git a/tests/migration-test.c b/tests/migration-test.c
index 0e687b7..c4d79e9 100644
--- a/tests/migration-test.c
+++ b/tests/migration-test.c
@@ -83,7 +83,7 @@  static const char *tmpfs;
 /* A simple PC boot sector that modifies memory (1-100MB) quickly
  * outputting a 'B' every so often if it's still running.
  */
-#include "tests/migration/x86-a-b-bootblock.h"
+#include "tests/migration/x86_64/x86-a-b-bootblock.h"
 
 static void init_bootfile_x86(const char *bootpath)
 {
diff --git a/tests/migration/Makefile b/tests/migration/Makefile
index 5d5fa07..1de480e 100644
--- a/tests/migration/Makefile
+++ b/tests/migration/Makefile
@@ -1,31 +1,34 @@ 
-# To specify cross compiler prefix, use CROSS_PREFIX=
-#   > make CROSS_PREFIX=x86_64-linux-gnu-
+#
+# Copyright (c) 2018 Red Hat, Inc. and/or its affiliates
+#
+# This work is licensed under the terms of the GNU GPL, version 2 or later.
+# See the COPYING file in the top-level directory.
+#
+
+TARGET_LIST = x86_64
+
+SRC_PATH = ../..
 
 override define __note
-/* This file is automatically generated from
- * tests/migration/x86-a-b-bootblock.s, edit that and then run
- * tests/migration/rebuild-x86-bootblock.sh to update,
- * and then remember to send both in your patch submission.
+/* This file is automatically generated from the assembly file in
+ * tests/migration/$@, edit that and then run "make all"
+ * inside tests/migration to update, and then remember to send both
+ * in your patch submission.
  */
 endef
 export __note
 
-.PHONY: all clean
-all: x86-a-b-bootblock.h
-
-x86-a-b-bootblock.h: x86.bootsect
-	echo "$$__note" > header.tmp
-	xxd -i $< | sed -e 's/.*int.*//' >> header.tmp
-	mv header.tmp $@
+parse-cross-prefix = $(subst gcc,,$(patsubst cc,gcc,$(patsubst CROSS_CC_GUEST="%",%,$(shell grep "CROSS_CC_GUEST=" $(SRC_PATH)/$(1)-softmmu/config-target.mak))))
+gen-cross-prefix = $(patsubst %-,CROSS_PREFIX=%-,$(call parse-cross-prefix,$(1)))
 
-x86.bootsect: x86.boot
-	dd if=$< of=$@ bs=256 count=2 skip=124
+.PHONY: all $(TARGET_LIST)
 
-x86.boot: x86.o
-	$(CROSS_PREFIX)objcopy -O binary $< $@
+all: $(TARGET_LIST)
 
-x86.o: x86-a-b-bootblock.S
-	$(CROSS_PREFIX)gcc -m32 -march=i486 -c $< -o $@
+$(TARGET_LIST):
+	$(MAKE) -C $@ $(call gen-cross-prefix,$@)
 
 clean:
-	@rm -rf *.boot *.o *.bootsect
+	for target in $(TARGET_LIST); do \
+		$(MAKE) -C $$target clean; \
+	done
diff --git a/tests/migration/x86_64/Makefile b/tests/migration/x86_64/Makefile
new file mode 100644
index 0000000..6dc849f
--- /dev/null
+++ b/tests/migration/x86_64/Makefile
@@ -0,0 +1,22 @@ 
+# To specify cross compiler prefix, use CROSS_PREFIX=
+#   > make CROSS_PREFIX=x86_64-linux-gnu-
+
+.PHONY: all clean
+all: x86-a-b-bootblock.h
+
+x86-a-b-bootblock.h: x86.bootsect
+	echo "$$__note" > header.tmp
+	xxd -i $< | sed -e 's/.*int.*//' >> header.tmp
+	mv header.tmp $@
+
+x86.bootsect: x86.boot
+	dd if=$< of=$@ bs=256 count=2 skip=124
+
+x86.boot: x86.o
+	$(CROSS_PREFIX)objcopy -O binary $< $@
+
+x86.o: x86-a-b-bootblock.S
+	$(CROSS_PREFIX)gcc -m32 -march=i486 -c $< -o $@
+
+clean:
+	@rm -rf *.boot *.o *.bootsect
diff --git a/tests/migration/x86-a-b-bootblock.S b/tests/migration/x86_64/x86-a-b-bootblock.S
similarity index 100%
rename from tests/migration/x86-a-b-bootblock.S
rename to tests/migration/x86_64/x86-a-b-bootblock.S
diff --git a/tests/migration/x86-a-b-bootblock.h b/tests/migration/x86_64/x86-a-b-bootblock.h
similarity index 93%
rename from tests/migration/x86-a-b-bootblock.h
rename to tests/migration/x86_64/x86-a-b-bootblock.h
index 78a151f..73670ef 100644
--- a/tests/migration/x86-a-b-bootblock.h
+++ b/tests/migration/x86_64/x86-a-b-bootblock.h
@@ -1,7 +1,7 @@ 
-/* This file is automatically generated from
- * tests/migration/x86-a-b-bootblock.s, edit that and then run
- * tests/migration/rebuild-x86-bootblock.sh to update,
- * and then remember to send both in your patch submission.
+/* This file is automatically generated from the assembly file in
+ * tests/migration/x86_64, edit that and then run "make all"
+ * inside tests/migration to update, and then remember to send both
+ * in your patch submission.
  */
 unsigned char x86_bootsect[] = {
   0xfa, 0x0f, 0x01, 0x16, 0x74, 0x7c, 0x66, 0xb8, 0x01, 0x00, 0x00, 0x00,