From 6d83b08e9c3e76e2c3e50000552aea3c4e8b111b Mon Sep 17 00:00:00 2001 From: Vladimir Serbinenko Date: Sun, 27 Oct 2013 02:11:29 +0200 Subject: [PATCH] Some work for S390 --- Makefile.util.def | 1 + configure.ac | 4 ++ gentpl.py | 3 +- grub-core/Makefile.core.def | 6 ++ grub-core/partmap/dasd.c | 106 ++++++++++++++++++++++++++++++++++++ 5 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 grub-core/partmap/dasd.c diff --git a/Makefile.util.def b/Makefile.util.def index 193bc4531..4d2798d97 100644 --- a/Makefile.util.def +++ b/Makefile.util.def @@ -146,6 +146,7 @@ library = { common = grub-core/partmap/sunpc.c; common = grub-core/partmap/bsdlabel.c; common = grub-core/partmap/dfly.c; + common = grub-core/partmap/dasd.c; common = grub-core/script/function.c; common = grub-core/script/lexer.c; common = grub-core/script/main.c; diff --git a/configure.ac b/configure.ac index e08aecb6c..43d230d27 100644 --- a/configure.ac +++ b/configure.ac @@ -90,6 +90,7 @@ case "$target_cpu" in i[[3456]]86) target_cpu=i386 ;; amd64) target_cpu=x86_64 ;; sparc) target_cpu=sparc64 ;; + s390x) target_cpu=s390 ;; mipsel|mips64el) target_cpu=mipsel; machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_CPU_MIPSEL=1"; @@ -122,6 +123,7 @@ if test "x$with_platform" = x; then mips-*) platform=arc ;; ia64-*) platform=efi ;; arm-*) platform=uboot ;; + s390-* | s390x-*) platform=mainframe ;; *) AC_MSG_ERROR([unsupported CPU: "$target_cpu"]) ;; esac else @@ -159,6 +161,7 @@ case "$target_cpu"-"$platform" in mipsel-loongson) ;; arm-uboot) ;; arm-efi) ;; + s390-mainframe) ;; *-emu) ;; *) AC_MSG_ERROR([platform "$platform" is not supported for target CPU "$target_cpu"]) ;; esac @@ -1331,6 +1334,7 @@ AM_CONDITIONAL([COND_mips_qemu_mips], [test "(" x$target_cpu = xmips -o x$target AM_CONDITIONAL([COND_mips_arc], [test "(" x$target_cpu = xmips -o x$target_cpu = xmipsel ")" -a x$platform = xarc]) AM_CONDITIONAL([COND_sparc64_ieee1275], [test x$target_cpu = xsparc64 -a x$platform = xieee1275]) AM_CONDITIONAL([COND_powerpc_ieee1275], [test x$target_cpu = xpowerpc -a x$platform = xieee1275]) +AM_CONDITIONAL([COND_s390_mainframe], [test x$target_cpu = xs390 -a x$platform = xmainframe]) AM_CONDITIONAL([COND_mips], [test x$target_cpu = xmips -o x$target_cpu = xmipsel]) AM_CONDITIONAL([COND_mipsel], [test x$target_cpu = xmipsel]) AM_CONDITIONAL([COND_mipseb], [test x$target_cpu = xmips]) diff --git a/gentpl.py b/gentpl.py index 05f3f969b..6052e4661 100644 --- a/gentpl.py +++ b/gentpl.py @@ -23,7 +23,7 @@ GRUB_PLATFORMS = [ "emu", "i386_pc", "i386_efi", "i386_qemu", "i386_coreboot", "i386_multiboot", "i386_ieee1275", "x86_64_efi", "mips_loongson", "sparc64_ieee1275", "powerpc_ieee1275", "mips_arc", "ia64_efi", - "mips_qemu_mips", "arm_uboot", "arm_efi" ] + "mips_qemu_mips", "arm_uboot", "arm_efi", "s390_mainframe" ] GROUPS = {} @@ -37,6 +37,7 @@ GROUPS["mips"] = [ "mips_loongson", "mips_qemu_mips", "mips_arc" ] GROUPS["sparc64"] = [ "sparc64_ieee1275" ] GROUPS["powerpc"] = [ "powerpc_ieee1275" ] GROUPS["arm"] = [ "arm_uboot", "arm_efi" ] +GROUPS["s390"] = [ "s390_mainframe" ] # Groups based on firmware GROUPS["efi"] = [ "i386_efi", "x86_64_efi", "ia64_efi", "arm_efi" ] diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def index abd54bae4..12b4816ea 100644 --- a/grub-core/Makefile.core.def +++ b/grub-core/Makefile.core.def @@ -78,6 +78,7 @@ kernel = { sparc64_ieee1275_ldflags = '-Wl,-Ttext,0x4400'; mips_arc_ldflags = '-Wl,-Ttext,$(TARGET_LINK_ADDR)'; mips_qemu_mips_ldflags = '-Wl,-Ttext,0x80200000'; + s390_mainframe_ldflags = '-Wl,-Ttext,0x8000'; mips_arc_cppflags = '-DGRUB_DECOMPRESSOR_LINK_ADDR=$(TARGET_DECOMPRESSOR_LINK_ADDR)'; mips_loongson_cppflags = '-DUSE_ASCII_FALLBACK'; @@ -1737,6 +1738,11 @@ module = { common = partmap/dfly.c; }; +module = { + name = part_dasd; + common = partmap/dasd.c; +}; + module = { name = msdospart; common = parttool/msdospart.c; diff --git a/grub-core/partmap/dasd.c b/grub-core/partmap/dasd.c new file mode 100644 index 000000000..5159b54b2 --- /dev/null +++ b/grub-core/partmap/dasd.c @@ -0,0 +1,106 @@ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2012 Free Software Foundation, Inc. + * + * GRUB 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, either version 3 of the License, or + * (at your option) any later version. + * + * GRUB 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 GRUB. If not, see . + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +GRUB_MOD_LICENSE ("GPLv3+"); + +static struct grub_partition_map grub_dasd_partition_map; + +struct addr +{ + grub_uint16_t cyl; + grub_uint16_t head; + grub_uint8_t sec; +} __attribute__ ((packed)); + +struct anchor +{ + grub_uint8_t unused1[4]; + grub_uint8_t magic[4]; + grub_uint8_t unused2[7]; + struct addr vtoc_addr; +} __attribute__ ((packed)); + +/* VOL1 in EBCDIC. */ +#define ANCHOR_MAGIC "\xe5\xd6\xd3\xf1" + +struct grub_disk_addr_t +address_to_block (const struct addr *a) +{ + return a->cyl * + a->head * + a->sec; +} + +static grub_err_t +dasd_partition_map_iterate (grub_disk_t disk, + int (*hook) (grub_disk_t disk, + const grub_partition_t partition)) +{ + grub_err_t err; + grub_partition_t p; + struct anchor anchor; + + err = grub_disk_read (disk, 2 * 8, 0, sizeof (anchor), &anchor); + if (err) + return err; + if (grub_memcmp (anchor.magic, ANCHOR_MAGIC, sizeof (ANCHOR_MAGIC) - 1) != 0) + return grub_error (GRUB_ERR_BAD_PART_TABLE, + "not a dasd partition table"); + + p = (grub_partition_t) grub_zalloc (sizeof (struct grub_partition)); + if (! p) + return grub_errno; + p->partmap = &grub_dasd_partition_map; + + p->start = 0x18 << 3; + p->len = disk->total_sectors - p->start; + p->number = 0; + if (hook (disk, p)) + { + grub_free (p); + return GRUB_ERR_NONE; + } + + grub_free (p); + return GRUB_ERR_NONE; +} + +/* Partition map type. */ +static struct grub_partition_map grub_dasd_partition_map = + { + .name = "dasd", + .iterate = dasd_partition_map_iterate, + }; + +GRUB_MOD_INIT(part_dasd) +{ + grub_partition_map_register (&grub_dasd_partition_map); +} + +GRUB_MOD_FINI(part_dasd) +{ + grub_partition_map_unregister (&grub_dasd_partition_map); +} + -- 2.47.2