In order to use the grub arm-uboot support something needs to arrange
for the grub kernel to be loaded from u-boot on the various platforms,
which in turn requires some platform specific knowledge (load addresses,
partitions and the like). Since flash-kernel already has a bunch of
infrastructure for this I thought it might be good to reuse it rather
than reinventing that wheel in grub-installer (or upstream grub).

I changed grub-installer's XB-Installer-Menu-Item to 7200 (from 7400) so
it would come before flash-kernel-installer (also 7400) and added to the
grub-installer postinst (bit WIP, especially the error handling):
        @@ -829,6 +837,17 @@ EOF
         
         fi
         
        +case $ARCH:$grub_package in
        +       *:grub-uboot)
        +               log "Installing flash-kernel-installer"
        +               ANNA_VERBOSE=1 anna-install flash-kernel-installer || 
error "failed to install flash-kernel-installer"
        +               log "Configuring flash-kernel-installer"
        +               udpkg --force-configure --configure 
flash-kernel-installer || error "failed to configure flash-kernel-installer"
        +               ;;
        +       *)
        +               log "ARCH:PKG is $ARCH:$grub_package"
        +esac
        +
         # Split a device name into a disk device name and a partition number, 
if
         # possible.
         split_device () {

(full WIP patches to grub-installer and flash-kernel, which are working
on Calxeda Midway, are appended)

Just doing anna-install was not sufficient, I think because once
grub-installer's postinst finishes the top-level bootable-system
dependency is satisfied so main-menu sees no reason to configure
flash-kernel too.

Is this call to udpkg allowable? codesearch seems to suggest that the
idiom is not very widespread, only kickseed and cdrom-checker use it.

Another approach might be to split bootable-system into two parts
(perhaps only on armhf) e.g. stage1 (==flash-kernel) and stage2
(==grub).

It's worth mentioning that unless the grub-kernel can be made
relocatable it may turn out that grub-installer needs some platform
specific knowledge (the grub load address, see [0]) anyway. Leif was
going to investigate -fpie but if that doesn't pan out then I wonder if
grub-installer can/should share the flash-kernel db or if it should go
its own way? Ideally only one place would need updating for each
platform.

[0] http://lists.gnu.org/archive/html/grub-devel/2013-12/msg00415.html

Ian.

===WIP: grub-installer===
diff --git a/debian/control b/debian/control
index 571459a..a4a8c34 100644
--- a/debian/control
+++ b/debian/control
@@ -8,10 +8,10 @@ Vcs-Browser: 
http://anonscm.debian.org/gitweb/?p=d-i/grub-installer.git
 Vcs-Git: git://anonscm.debian.org/d-i/grub-installer.git
 
 Package: grub-installer
-Architecture: i386 hurd-i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc mipsel
+Architecture: i386 hurd-i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc mipsel 
armhf
 XB-Subarchitecture: ${subarch}
 Provides: bootable-system
 Depends: cdebconf-udeb, kernel-installer, created-fstab, di-utils (>= 1.15), 
di-utils-mapdevfs, os-prober, partman-utils
-XB-Installer-Menu-Item: 7400
+XB-Installer-Menu-Item: 7200
 Package-Type: udeb
 Description: Install GRUB on a hard disk
diff --git a/grub-installer b/grub-installer
index 71e10c8..dbb46ad 100755
--- a/grub-installer
+++ b/grub-installer
@@ -327,6 +327,10 @@ case $ARCH in
     i386/*|amd64/*)
        grub_package="grub-pc"
        ;;
+    armhf/*)
+       # XXX detect and handle EFI too
+       grub_package="grub-uboot"
+       ;;
     powerpc/*)
        grub_package="grub-ieee1275"
        experimental_arch
@@ -753,6 +757,10 @@ if [ -z "$frdisk" ]; then
                        fi
                fi
 
+               #if [ "$ARCH" = "armhf/XXX" ] ; then
+               #       grub_install_params="$grub_install_params -T 
0xLOADADDRESS"
+               #fi
+
                if [ "$ARCH" = "powerpc/chrp_pegasos" ] ; then
                        # nvram is broken here
                        grub_install_params="$grub_install_params --no-nvram"
@@ -829,6 +837,17 @@ EOF
 
 fi
 
+case $ARCH:$grub_package in
+       *:grub-uboot)
+               log "Installing flash-kernel-installer"
+               ANNA_VERBOSE=1 anna-install flash-kernel-installer || error 
"failed to install flash-kernel-installer"
+               log "Configuring flash-kernel-installer"
+               udpkg --force-configure --configure flash-kernel-installer || 
error "failed to configure flash-kernel-installer"
+               ;;
+       *)
+               log "ARCH:PKG is $ARCH:$grub_package"
+esac
+
 # Split a device name into a disk device name and a partition number, if
 # possible.
 split_device () {

===WIP: flash-kernel===
diff --git a/bootscript/bootscr.calxeda b/bootscript/bootscr.calxeda
new file mode 100644
index 0000000..4d925e2
--- /dev/null
+++ b/bootscript/bootscr.calxeda
@@ -0,0 +1,4 @@
+echo "Loading Debian Grub ..."
+${fs}load ${devtype} ${devnum} ${kernel_addr_r} 
${prefix}/grub/arm-uboot/core.img
+bootm ${kernel_addr_r} - ${fdt_addr}
+
diff --git a/db/all.db b/db/all.db
index 76e99fd..95e503e 100644
--- a/db/all.db
+++ b/db/all.db
@@ -40,6 +40,13 @@ Boot-Initrd-Path: /boot/initrd.buffalo
 Required-Packages: u-boot-tools
 Bootloader-Sets-Root: yes
 
+Machine: Calxeda ECX-2000
+Method: grub
+Required-Packages: u-boot-tools
+Boot-Script-Path: /boot/boot.scr
+U-Boot-Script-Name: bootscr.calxeda
+Bootloader-Sets-Root: no
+
 Machine: D-Link DNS-323
 Kernel-Flavors: orion5x
 Machine-Id: 1542
diff --git a/debian/control b/debian/control
index f8bfa67..bdd1378 100644
--- a/debian/control
+++ b/debian/control
@@ -29,7 +29,7 @@ Section: debian-installer
 Priority: standard
 Package-Type: udeb
 Architecture: armel armhf
-XB-Subarchitecture: iop32x ixp4xx kirkwood orion5x s3c24xx mx5
+XB-Subarchitecture: iop32x ixp4xx kirkwood orion5x s3c24xx mx5 generic
 Provides: bootable-system
 Depends: cdebconf-udeb, installed-base
 XB-Installer-Menu-Item: 7300
diff --git a/debian/flash-kernel-installer.isinstallable 
b/debian/flash-kernel-installer.isinstallable
index ce85af3..0d75039 100755
--- a/debian/flash-kernel-installer.isinstallable
+++ b/debian/flash-kernel-installer.isinstallable
@@ -20,8 +20,14 @@ case "`archdetect`" in
        arm*/s3c24xx)
                exit 0
        ;;
+       armhf/generic)
+               logger -t flash-kernel-installer armhf/generic is installable
+               # XXX check db for /proc/device-tree/model?
+               exit 0
+       ;;
        # Don't activate it by default
        *)
+               logger -t flash-kernel-installer `archdetect` is installable
                exit 1
        ;;
 esac
diff --git a/functions b/functions
index 66e9738..54c84ba 100644
--- a/functions
+++ b/functions
@@ -488,13 +492,29 @@ case "$method" in
                fi
                android_flash "$part"
        ;;
+       "grub")
+               grub="/boot/grub/arm-uboot/core.img"
+               # Address to load to:
+               #  ukaddr="$(get_machine_field "$machine" 
"U-Boot-Kernel-Address")" || :
+               # Script address: (needed?)
+               #  usaddr="$(get_machine_field "$machine" 
"U-Boot-Script-Address")" || :
+               # Name of the input script:
+               #  usname="$(get_machine_field "$machine" 
"U-Boot-Script-Name")" || :
+               # File to load
+               ugrubname="$(get_machine_field "$machine" "U-Boot-Grub-Name")" 
|| ugrubname="/boot/grub/arm-uboot/core.img"
+               # Script output path:
+               #  boot_script_path="$(get_machine_field "$machine" 
"Boot-Script-Path")" || :
+               boot_script_path="$boot_mnt_dir/$boot_script_path"
+               boot_script="$BOOTSCRIPTS_DIR/$usname"
+               mkimage_script "$usaddr" "grub boot script" "$boot_script" \
+                       "$tmpdir/boot.scr"
+               boot_script="$tmpdir/boot.scr"
+               backup_and_install "$boot_script" "$boot_script_path"
+       ;;
        "generic")
                kernel="$kfile"
                initrd="$ifile"
                if [ -n "$machine_id" ]; then
[...snip some unrelated local hacks...]

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to