1*640235e2SEnji Cooper# $NetBSD: t_gpt.sh,v 1.15 2016/03/08 08:04:48 joerg Exp $ 2*640235e2SEnji Cooper# 3*640235e2SEnji Cooper# Copyright (c) 2015 The NetBSD Foundation, Inc. 4*640235e2SEnji Cooper# All rights reserved. 5*640235e2SEnji Cooper# 6*640235e2SEnji Cooper# This code is derived from software contributed to The NetBSD Foundation 7*640235e2SEnji Cooper# by Christos Zoulas 8*640235e2SEnji Cooper# 9*640235e2SEnji Cooper# Redistribution and use in source and binary forms, with or without 10*640235e2SEnji Cooper# modification, are permitted provided that the following conditions 11*640235e2SEnji Cooper# are met: 12*640235e2SEnji Cooper# 1. Redistributions of source code must retain the above copyright 13*640235e2SEnji Cooper# notice, this list of conditions and the following disclaimer. 14*640235e2SEnji Cooper# 2. Redistributions in binary form must reproduce the above copyright 15*640235e2SEnji Cooper# notice, this list of conditions and the following disclaimer in the 16*640235e2SEnji Cooper# documentation and/or other materials provided with the distribution. 17*640235e2SEnji Cooper# 18*640235e2SEnji Cooper# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 19*640235e2SEnji Cooper# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 20*640235e2SEnji Cooper# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 21*640235e2SEnji Cooper# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 22*640235e2SEnji Cooper# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23*640235e2SEnji Cooper# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24*640235e2SEnji Cooper# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25*640235e2SEnji Cooper# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26*640235e2SEnji Cooper# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27*640235e2SEnji Cooper# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28*640235e2SEnji Cooper# POSSIBILITY OF SUCH DAMAGE. 29*640235e2SEnji Cooper# 30*640235e2SEnji Cooper 31*640235e2SEnji Cooperbootblk=/usr/mdec/gptmbr.bin 32*640235e2SEnji Coopersize=10240 33*640235e2SEnji Coopernewsize=20480 34*640235e2SEnji Coopershdr=34 35*640235e2SEnji Cooperdisk=gpt.disk 36*640235e2SEnji Cooperuuid="........-....-....-....-............" 37*640235e2SEnji Cooperzero="00000000-0000-0000-0000-000000000000" 38*640235e2SEnji Coopersrc=$(atf_get_srcdir) 39*640235e2SEnji Cooper 40*640235e2SEnji Coopersilence() { 41*640235e2SEnji Cooper atf_check -s exit:0 -o empty -e empty "$@" 42*640235e2SEnji Cooper} 43*640235e2SEnji Cooper 44*640235e2SEnji Cooperinline() { 45*640235e2SEnji Cooper local inline="$1" 46*640235e2SEnji Cooper shift 47*640235e2SEnji Cooper atf_check -s exit:0 -e empty -o inline:"$inline" "$@" 48*640235e2SEnji Cooper} 49*640235e2SEnji Cooper 50*640235e2SEnji Coopermatch() { 51*640235e2SEnji Cooper local match="$1" 52*640235e2SEnji Cooper shift 53*640235e2SEnji Cooper atf_check -s exit:0 -e empty -o match:"$match" "$@" 54*640235e2SEnji Cooper} 55*640235e2SEnji Cooper 56*640235e2SEnji Coopermatcherr() { 57*640235e2SEnji Cooper local match="$1" 58*640235e2SEnji Cooper shift 59*640235e2SEnji Cooper atf_check -s exit:0 -o empty -e match:"$match" "$@" 60*640235e2SEnji Cooper} 61*640235e2SEnji Cooper 62*640235e2SEnji Cooperfile() { 63*640235e2SEnji Cooper local file="$1" 64*640235e2SEnji Cooper shift 65*640235e2SEnji Cooper atf_check -s exit:0 -e empty -o file:"$file" "$@" 66*640235e2SEnji Cooper} 67*640235e2SEnji Cooper 68*640235e2SEnji Coopersave() { 69*640235e2SEnji Cooper local save="$1" 70*640235e2SEnji Cooper shift 71*640235e2SEnji Cooper atf_check -s exit:0 -e empty -o save:"$save" "$@" 72*640235e2SEnji Cooper} 73*640235e2SEnji Cooper 74*640235e2SEnji Cooperzerodd() { 75*640235e2SEnji Cooper silence dd conv=notrunc msgfmt=quiet if=/dev/zero of="$disk" "$@" 76*640235e2SEnji Cooper} 77*640235e2SEnji Cooper 78*640235e2SEnji Cooperprepare() { 79*640235e2SEnji Cooper rm -f "$disk" 80*640235e2SEnji Cooper zerodd seek="$size" count=1 81*640235e2SEnji Cooper} 82*640235e2SEnji Cooper 83*640235e2SEnji Cooperprepare_2part() { 84*640235e2SEnji Cooper prepare 85*640235e2SEnji Cooper silence gpt create "$disk" 86*640235e2SEnji Cooper match "$(partaddmsg 1 34 1024)" gpt add -t efi -s 1024 "$disk" 87*640235e2SEnji Cooper match "$(partaddmsg 2 1058 9150)" gpt add "$disk" 88*640235e2SEnji Cooper} 89*640235e2SEnji Cooper 90*640235e2SEnji Cooper# Calling this from tests does not work. BUG! 91*640235e2SEnji Coopercheck_2part() { 92*640235e2SEnji Cooper file "$src/gpt.2part.show.normal" gpt show "$disk" 93*640235e2SEnji Cooper file "$src/gpt.2part.show.uuid" gpt show -u "$disk" 94*640235e2SEnji Cooper} 95*640235e2SEnji Cooper 96*640235e2SEnji Cooperpartaddmsg() { 97*640235e2SEnji Cooper echo "^$disk: Partition $1 added: $uuid $2 $3\$" 98*640235e2SEnji Cooper} 99*640235e2SEnji Cooper 100*640235e2SEnji Cooperpartresmsg() { 101*640235e2SEnji Cooper echo "^$disk: Partition $1 resized: $2 $3\$" 102*640235e2SEnji Cooper} 103*640235e2SEnji Cooper 104*640235e2SEnji Cooperpartremmsg() { 105*640235e2SEnji Cooper echo "^$disk: Partition $1 removed\$" 106*640235e2SEnji Cooper} 107*640235e2SEnji Cooper 108*640235e2SEnji Cooperpartlblmsg() { 109*640235e2SEnji Cooper echo "^$disk: Partition $1 label changed\$" 110*640235e2SEnji Cooper} 111*640235e2SEnji Cooper 112*640235e2SEnji Cooperpartbootmsg() { 113*640235e2SEnji Cooper echo "^$disk: Partition $1 marked as bootable\$" 114*640235e2SEnji Cooper} 115*640235e2SEnji Cooper 116*640235e2SEnji Cooperrecovermsg() { 117*640235e2SEnji Cooper echo "^$disk: Recovered $1 GPT [a-z]* from $2\$" 118*640235e2SEnji Cooper} 119*640235e2SEnji Cooper 120*640235e2SEnji Coopermigratemsg() { 121*640235e2SEnji Cooper echo -n "^gpt: $disk: Partition $1 unknown type MSDOS, " 122*640235e2SEnji Cooper echo 'using "Microsoft Basic Data"$' 123*640235e2SEnji Cooper} 124*640235e2SEnji Cooper 125*640235e2SEnji Cooperattrmsg() { 126*640235e2SEnji Cooper echo "^$disk: Partition $1 attributes updated\$" 127*640235e2SEnji Cooper} 128*640235e2SEnji Cooper 129*640235e2SEnji Coopertypemsg() { 130*640235e2SEnji Cooper echo "^$disk: Partition $1 type changed\$" 131*640235e2SEnji Cooper} 132*640235e2SEnji Cooper 133*640235e2SEnji Cooperatf_test_case create_empty 134*640235e2SEnji Coopercreate_empty_head() { 135*640235e2SEnji Cooper atf_set "descr" "Create empty disk" 136*640235e2SEnji Cooper} 137*640235e2SEnji Cooper 138*640235e2SEnji Coopercreate_empty_body() { 139*640235e2SEnji Cooper prepare 140*640235e2SEnji Cooper silence gpt create "$disk" 141*640235e2SEnji Cooper file "$src/gpt.empty.show.normal" gpt show "$disk" 142*640235e2SEnji Cooper} 143*640235e2SEnji Cooper 144*640235e2SEnji Cooperatf_test_case create_2part 145*640235e2SEnji Coopercreate_2part_head() { 146*640235e2SEnji Cooper atf_set "descr" "Create 2 partition disk" 147*640235e2SEnji Cooper} 148*640235e2SEnji Cooper 149*640235e2SEnji Coopercreate_2part_body() { 150*640235e2SEnji Cooper prepare_2part 151*640235e2SEnji Cooper check_2part 152*640235e2SEnji Cooper} 153*640235e2SEnji Cooper 154*640235e2SEnji Cooperatf_test_case change_attr_2part 155*640235e2SEnji Cooperchange_attr_2part_head() { 156*640235e2SEnji Cooper atf_set "descr" "Change the attribute of 2 partition disk" 157*640235e2SEnji Cooper} 158*640235e2SEnji Cooper 159*640235e2SEnji Cooperchange_attr_2part_body() { 160*640235e2SEnji Cooper prepare_2part 161*640235e2SEnji Cooper match "$(attrmsg 1)" gpt set -i 1 -a biosboot,bootme "$disk" 162*640235e2SEnji Cooper save attr gpt show -i 1 "$disk" 163*640235e2SEnji Cooper match "^Attributes: biosboot, bootme\$" tail -1 attr 164*640235e2SEnji Cooper match "$(attrmsg 1)" gpt unset -i 1 -a biosboot,bootme "$disk" 165*640235e2SEnji Cooper save attr gpt show -i 1 "$disk" 166*640235e2SEnji Cooper match "^Attributes: None\$" tail -1 attr 167*640235e2SEnji Cooper} 168*640235e2SEnji Cooper 169*640235e2SEnji Cooperatf_test_case change_type_2part 170*640235e2SEnji Cooperchange_type_2part_head() { 171*640235e2SEnji Cooper atf_set "descr" "Change the partition type type of 2 partition disk" 172*640235e2SEnji Cooper} 173*640235e2SEnji Cooper 174*640235e2SEnji Cooperchange_type_2part_body() { 175*640235e2SEnji Cooper prepare_2part 176*640235e2SEnji Cooper match "$(typemsg 1)" gpt type -i 1 -T apple "$disk" 177*640235e2SEnji Cooper save type gpt show -i 1 "$disk" 178*640235e2SEnji Cooper inline "Type: apple (48465300-0000-11aa-aa11-00306543ecac)\n" \ 179*640235e2SEnji Cooper grep "^Type:" type 180*640235e2SEnji Cooper match "$(typemsg 1)" gpt type -i 1 -T efi "$disk" 181*640235e2SEnji Cooper save type gpt show -i 1 "$disk" 182*640235e2SEnji Cooper inline "Type: efi (c12a7328-f81f-11d2-ba4b-00a0c93ec93b)\n" \ 183*640235e2SEnji Cooper grep "^Type:" type 184*640235e2SEnji Cooper} 185*640235e2SEnji Cooper 186*640235e2SEnji Cooperatf_test_case backup_2part 187*640235e2SEnji Cooperbackup_2part_head() { 188*640235e2SEnji Cooper atf_set "descr" "Backup 2 partition disk" 189*640235e2SEnji Cooper} 190*640235e2SEnji Cooper 191*640235e2SEnji Cooperbackup_2part_body() { 192*640235e2SEnji Cooper prepare_2part 193*640235e2SEnji Cooper save test.backup gpt backup "$disk" 194*640235e2SEnji Cooper file "$src/gpt.backup" sed -e "s/$uuid/$zero/g" "test.backup" 195*640235e2SEnji Cooper} 196*640235e2SEnji Cooper 197*640235e2SEnji Cooperatf_test_case restore_2part 198*640235e2SEnji Cooperrestore_2part_head() { 199*640235e2SEnji Cooper atf_set "descr" "Restore 2 partition disk" 200*640235e2SEnji Cooper} 201*640235e2SEnji Cooper 202*640235e2SEnji Cooperrestore_2part_body() { 203*640235e2SEnji Cooper prepare_2part 204*640235e2SEnji Cooper save test.backup gpt backup "$disk" 205*640235e2SEnji Cooper prepare 206*640235e2SEnji Cooper silence gpt restore -i test.backup "$disk" 207*640235e2SEnji Cooper check_2part 208*640235e2SEnji Cooper} 209*640235e2SEnji Cooper 210*640235e2SEnji Cooperatf_test_case recover_backup 211*640235e2SEnji Cooperrecover_backup_head() { 212*640235e2SEnji Cooper atf_set "descr" "Recover the backup GPT header and table" 213*640235e2SEnji Cooper} 214*640235e2SEnji Cooper 215*640235e2SEnji Cooperrecover_backup_body() { 216*640235e2SEnji Cooper prepare_2part 217*640235e2SEnji Cooper zerodd seek="$((size - shdr))" count="$shdr" 218*640235e2SEnji Cooper match "$(recovermsg secondary primary)" gpt recover "$disk" 219*640235e2SEnji Cooper check_2part 220*640235e2SEnji Cooper} 221*640235e2SEnji Cooper 222*640235e2SEnji Cooperatf_test_case recover_primary 223*640235e2SEnji Cooperrecover_primary_head() { 224*640235e2SEnji Cooper atf_set "descr" "Recover the primary GPT header and table" 225*640235e2SEnji Cooper} 226*640235e2SEnji Cooper 227*640235e2SEnji Cooperrecover_primary_body() { 228*640235e2SEnji Cooper prepare_2part 229*640235e2SEnji Cooper zerodd seek=1 count="$shdr" 230*640235e2SEnji Cooper match "$(recovermsg primary secondary)" gpt recover "$disk" 231*640235e2SEnji Cooper check_2part 232*640235e2SEnji Cooper} 233*640235e2SEnji Cooper 234*640235e2SEnji Cooperatf_test_case resize_2part 235*640235e2SEnji Cooperresize_2part_head() { 236*640235e2SEnji Cooper atf_set "descr" "Resize a 2 partition disk and partition" 237*640235e2SEnji Cooper} 238*640235e2SEnji Cooper 239*640235e2SEnji Cooperresize_2part_body() { 240*640235e2SEnji Cooper prepare_2part 241*640235e2SEnji Cooper zerodd seek="$newsize" count=1 242*640235e2SEnji Cooper silence gpt resizedisk "$disk" 243*640235e2SEnji Cooper file "$src/gpt.resizedisk.show.normal" gpt show "$disk" 244*640235e2SEnji Cooper match "$(partresmsg 2 1058 19390)" gpt resize -i 2 "$disk" 245*640235e2SEnji Cooper file "$src/gpt.resizepart.show.normal" gpt show "$disk" 246*640235e2SEnji Cooper} 247*640235e2SEnji Cooper 248*640235e2SEnji Cooperatf_test_case remove_2part 249*640235e2SEnji Cooperremove_2part_head() { 250*640235e2SEnji Cooper atf_set "descr" "Remove a partition from a 2 partition disk" 251*640235e2SEnji Cooper} 252*640235e2SEnji Cooper 253*640235e2SEnji Cooperremove_2part_body() { 254*640235e2SEnji Cooper prepare_2part 255*640235e2SEnji Cooper match "$(partremmsg 1)" -e empty gpt remove \ 256*640235e2SEnji Cooper -i 1 "$disk" 257*640235e2SEnji Cooper file "$src/gpt.removepart.show.normal" \ 258*640235e2SEnji Cooper gpt show "$disk" 259*640235e2SEnji Cooper} 260*640235e2SEnji Cooper 261*640235e2SEnji Cooperatf_test_case label_2part 262*640235e2SEnji Cooperlabel_2part_head() { 263*640235e2SEnji Cooper atf_set "descr" "Label partitions in a 2 partition disk" 264*640235e2SEnji Cooper} 265*640235e2SEnji Cooper 266*640235e2SEnji Cooperlabel_2part_body() { 267*640235e2SEnji Cooper prepare_2part 268*640235e2SEnji Cooper match "$(partlblmsg 1)" gpt label -i 1 -l potato "$disk" 269*640235e2SEnji Cooper match "$(partlblmsg 2)" gpt label -i 2 -l tomato "$disk" 270*640235e2SEnji Cooper file "$src/gpt.2part.show.label" \ 271*640235e2SEnji Cooper gpt show -l "$disk" 272*640235e2SEnji Cooper} 273*640235e2SEnji Cooper 274*640235e2SEnji Cooperatf_test_case bootable_2part 275*640235e2SEnji Cooperbootable_2part_head() { 276*640235e2SEnji Cooper atf_set "descr" "Make partition 2 bootable in a 2 partition disk" 277*640235e2SEnji Cooper atf_set "require.files" "$bootblk" 278*640235e2SEnji Cooper} 279*640235e2SEnji Cooper 280*640235e2SEnji Cooperbootable_2part_body() { 281*640235e2SEnji Cooper prepare_2part 282*640235e2SEnji Cooper match "$(partbootmsg 2)" gpt biosboot -i 2 "$disk" 283*640235e2SEnji Cooper local bootsz="$(ls -l "$bootblk" | awk '{ print $5 }')" 284*640235e2SEnji Cooper silence dd msgfmt=quiet if="$disk" of=bootblk bs=1 count="$bootsz" 285*640235e2SEnji Cooper silence cmp "$bootblk" bootblk 286*640235e2SEnji Cooper save bootattr gpt show -i 2 "$disk" 287*640235e2SEnji Cooper match "^Attributes: biosboot\$" tail -1 bootattr 288*640235e2SEnji Cooper} 289*640235e2SEnji Cooper 290*640235e2SEnji Cooperatf_test_case migrate_disklabel 291*640235e2SEnji Coopermigrate_disklabel_head() { 292*640235e2SEnji Cooper atf_set "descr" "Migrate an MBR+disklabel disk to GPT" 293*640235e2SEnji Cooper} 294*640235e2SEnji Cooper 295*640235e2SEnji Coopermigrate_disklabel_body() { 296*640235e2SEnji Cooper prepare 297*640235e2SEnji Cooper silence fdisk -fi "$disk" 298*640235e2SEnji Cooper silence fdisk -fu0s "169/63/$((size / 10))" "$disk" 299*640235e2SEnji Cooper silence disklabel -R "$disk" "$src/gpt.disklabel" 300*640235e2SEnji Cooper matcherr "$(migratemsg 5)" gpt migrate "$disk" 301*640235e2SEnji Cooper file "$src/gpt.disklabel.show.normal" gpt show "$disk" 302*640235e2SEnji Cooper} 303*640235e2SEnji Cooper 304*640235e2SEnji Cooperatf_init_test_cases() { 305*640235e2SEnji Cooper atf_add_test_case create_empty 306*640235e2SEnji Cooper atf_add_test_case create_2part 307*640235e2SEnji Cooper atf_add_test_case change_attr_2part 308*640235e2SEnji Cooper atf_add_test_case change_type_2part 309*640235e2SEnji Cooper atf_add_test_case backup_2part 310*640235e2SEnji Cooper atf_add_test_case remove_2part 311*640235e2SEnji Cooper atf_add_test_case restore_2part 312*640235e2SEnji Cooper atf_add_test_case recover_backup 313*640235e2SEnji Cooper atf_add_test_case recover_primary 314*640235e2SEnji Cooper atf_add_test_case resize_2part 315*640235e2SEnji Cooper atf_add_test_case label_2part 316*640235e2SEnji Cooper atf_add_test_case bootable_2part 317*640235e2SEnji Cooper atf_add_test_case migrate_disklabel 318*640235e2SEnji Cooper} 319