tazlito rev 499

uefi: add fat32 support
author Pascal Bellard <pascal.bellard@slitaz.org>
date Thu May 17 11:53:31 2018 +0200 (2018-05-17)
parents 5d84fadfd928
children 35f0bc818f6a
files tazlito
line diff
     1.1 --- a/tazlito	Wed May 16 10:03:24 2018 +0200
     1.2 +++ b/tazlito	Thu May 17 11:53:31 2018 +0200
     1.3 @@ -311,10 +311,19 @@
     1.4  	fix_efi_boot_img_size $1 $2 $n $efiblock
     1.5  	
     1.6  	# Build file list tree
     1.7 -	fatsz=$(get 22 "$2/boot/isolinux/efi.img")
     1.8  	resv=$(get 14 "$2/boot/isolinux/efi.img")
     1.9 -	basecluster=$((($resv+2*$fatsz)/4+$efiblock-1))
    1.10 -	hd "$2/boot/isolinux/efi.img" | awk 'BEGIN { skiphead=4 }
    1.11 +	if [ $(get 57 "$2/boot/isolinux/efi.img" 1) -ne 49 ]; then
    1.12 +		skiphead=5
    1.13 +		fatsz=$(get 36 "$2/boot/isolinux/efi.img" 4)
    1.14 +		basecluster=$((($resv+2*$fatsz)/4+$efiblock-2))
    1.15 +		dd if=$1 bs=512 skip=$(($efiblock*4)) count=3 \
    1.16 +			of=$1 seek=$(($efiblock*4+3)) conv=notrunc
    1.17 +	else
    1.18 +		skiphead=4
    1.19 +		fatsz=$(get 22 "$2/boot/isolinux/efi.img")
    1.20 +		basecluster=$((($resv+2*$fatsz)/4+$efiblock-1))
    1.21 +	fi 2> /dev/null
    1.22 +	hd "$2/boot/isolinux/efi.img" | awk 'BEGIN { skiphead='$skiphead' }
    1.23  {
    1.24    if (skiphead!=0) {
    1.25      if ($1=="*") skiphead--
    1.26 @@ -374,6 +383,7 @@
    1.27  ' | (	while read offset cluster file; do
    1.28  		cluster=$(($(first_block "$2/$file")-$basecluster))
    1.29  		set32 $(($efiblock*2048+0x$offset+10)) $cluster "$1" 16
    1.30 +		set32 $(($efiblock*2048+0x$offset+4)) $(($cluster>>16)) "$1" 16
    1.31  		echo "$cluster $((($(stat -c %s "$2/$file")+2047)/2048)) $file"
    1.32  	done
    1.33  
    1.34 @@ -386,12 +396,13 @@
    1.35    if (state==0) {
    1.36      if ($2=="") {
    1.37        if ($1==12849) fat=12
    1.38 -      else fat=16
    1.39 +      else if ($1==13873) fat=16
    1.40 +      else fat=32
    1.41        state++
    1.42      }
    1.43      else {
    1.44        for (i=1;i<$2;i++) c[$1+i]=$1+i
    1.45 -      c[$1+$2]=65535
    1.46 +      c[$1+$2]=268435455
    1.47      }
    1.48      next
    1.49    }
    1.50 @@ -410,10 +421,21 @@
    1.51        next
    1.52      }
    1.53      n=$1*256+prev
    1.54 +    if (fat==32) {
    1.55 +      prev=n
    1.56 +      state=13
    1.57 +      next
    1.58 +    }
    1.59    }
    1.60    else if (state==3) {
    1.61      n=$1*16+prev
    1.62    }
    1.63 +  else if (state==13) {
    1.64 +    prev=$1*65536+prev
    1.65 +    state++
    1.66 +    next
    1.67 +  }
    1.68 +  else n=$1*16777216+prev
    1.69    if (n!=0) c[pos+1]=n
    1.70    pos++
    1.71    state=1
    1.72 @@ -423,7 +445,11 @@
    1.73      if (c[i]=="") c[i]=0
    1.74      if (c[i+1]=="") c[i+1]=0
    1.75      if (fat==12) printf "0  %02X %1X%1X %02X |\n",c[i]%256,c[i+1]%16,(c[i]/256)%16,(c[i+1]/16)%256
    1.76 -    else printf "0  %02X %02X %02X %02X |\n",c[i]%256,(c[i]/256)%256,c[i+1]%256,(c[i+1]/256)%256
    1.77 +    else if (fat==16) printf "0  %02X %02X %02X %02X |\n",c[i]%256,(c[i]/256)%256,c[i+1]%256,(c[i+1]/256)%256
    1.78 +    else {
    1.79 +      printf "0  %02X %02X %02X %02X |\n",c[i]%256,(c[i]/256)%256,(c[i]/65536)%256,(c[i]/16777216)%256
    1.80 +      printf "0  %02X %02X %02X %02X |\n",c[i+1]%256,(c[i+1]/256)%256,(c[i+1]/65536)%256,(c[i+1]/16777216)%256
    1.81 +    }
    1.82    }
    1.83  }' | hexdump -R | dd of="$1" seek=$((4*$efiblock+$fatsz+$resv)) \
    1.84  		conv=notrunc bs=512 > /dev/null 2>&1
    1.85 @@ -480,19 +506,30 @@
    1.86  			print n
    1.87  		}')
    1.88  	local clusters=$(($fclust+$dclust))
    1.89 -	if [ $clusters -lt 4085 ]; then
    1.90 +	if [ $clusters -lt 4068 ]; then
    1.91  		fsect=$(((($clusters+2)*3+1023)/1024))
    1.92  		ftype="31 32"
    1.93  		fhead="F8 FF FF"
    1.94 -	else
    1.95 +		rsect=$(( 1+ ((2*$fsect)-1)%4 ))
    1.96 +		fsz="$(printf "%04X" $fsect | sed 's/\(..\)\(..\)/\2 \1/')"
    1.97 +		rootsz=2
    1.98 +	elif [ $clusters -lt 65525 ]; then
    1.99  		fsect=$((($clusters+2+255)/256))
   1.100  		ftype="31 36"
   1.101  		fhead="F8 FF FF FF"
   1.102 +		rsect=$(( 1+ ((2*$fsect)-1)%4 ))
   1.103 +		fsz="$(printf "%04X" $fsect | sed 's/\(..\)\(..\)/\2 \1/')"
   1.104 +		rootsz=2
   1.105 +	else
   1.106 +		fsect=$((($clusters+2+127)/128))
   1.107 +		ftype="33 32"
   1.108 +		fhead="F8 FF FF 0F FF FF FF FF F8 FF FF 0F"
   1.109 +		rsect=$(( 6+ ((2*$fsect)-6)%4 ))
   1.110 +		fsz="$(printf "%08X" $fsect | sed 's/\(..\)\(..\)\(..\)\(..\)/\4 \3 \2 \1/')"
   1.111 +		rootsz=1
   1.112  	fi
   1.113 -	rsect=$(( 1+ ((2*$fsect)-1)%4 ))
   1.114 -	fsz="$(printf "%02X %02X" $(($fsect%256)) $((($fsect>>8)%256)))"
   1.115  	#       reserved +   fat*2   + root dir  +   dirs
   1.116 -	count=$((($rsect + $fsect*2)/4 +  2  + $dclust ))
   1.117 +	count=$((($rsect + $fsect*2)/4 +  $rootsz  + $dclust ))
   1.118  	s=$((($count+$fclust)*4))
   1.119  	if [ $s -gt 65535 ]; then
   1.120  		size="00 00"
   1.121 @@ -506,16 +543,36 @@
   1.122  		count=$s 2> /dev/null
   1.123  
   1.124  	# Create boot sector
   1.125 -	echo -en '\x55\xAA' | dd of=$basedir/boot/isolinux/efi.img \
   1.126 -		seek=510 bs=1 conv=notrunc 2> /dev/null
   1.127 -	hexdump -R <<EOT | dd of=$basedir/boot/isolinux/efi.img \
   1.128 -		conv=notrunc 2> /dev/null
   1.129 +	if [ "$ftype" == "33 32" ]; then
   1.130 +		hexdump -R <<EOT | dd of=$basedir/boot/isolinux/efi.img \
   1.131 +			conv=notrunc
   1.132 +0  eb 58 90 53 6c 69 54 61  7a 00 00 00 02 04 $rsect 00  |
   1.133 +0  02 00 00 $size f8 00 00  20 00 40 00 00 00 00 00  |
   1.134 +0  $size32     $fsz         00 00 00 00 02 00 00 00  |
   1.135 +0  01 00 03 00 00 00 00 00  00 00 00 00 00 00 00 00  |  
   1.136 +0  80 00 29 00 00 00 00 53  59 53 54 45 4d 00 00 00  |
   1.137 +0  00 00 46 41 54 $ftype 20 20 20 cd 18 cd 19 eb fa  |
   1.138 +EOT
   1.139 +		while read ofs data; do
   1.140 +			echo "0 ${data//:/ } |" | hexdump -R | dd conv=notrunc \
   1.141 +			bs=1 seek=$ofs of=$basedir/boot/isolinux/efi.img
   1.142 +		done <<EOT
   1.143 +510	55:aa:52:52:61:41
   1.144 +996	72:72:41:61:ff:ff:ff:ff:02
   1.145 +1022	55:aa
   1.146 +EOT
   1.147 +	else
   1.148 +		echo -en '\x55\xAA' | dd of=$basedir/boot/isolinux/efi.img \
   1.149 +			seek=510 bs=1 conv=notrunc
   1.150 +		hexdump -R <<EOT | dd of=$basedir/boot/isolinux/efi.img \
   1.151 +			conv=notrunc
   1.152  0  eb 3c 90 53 6c 69 54 61  7a 00 00 00 02 04 $rsect 00  |
   1.153  0  02 40 00 $size f8 $fsz   20 00 40 00 00 00 00 00  |
   1.154 -0  $size32     80 00 29 00  00 00 00 4e 4f 20 4e 41  |
   1.155 -0  4d 45 20 20 20 20 46 41  54 $ftype 20 20 20 cd 18  |
   1.156 +0  $size32     80 00 29 00  00 00 00 53 59 53 54 45  |
   1.157 +0  4d 20 20 20 20 20 46 41  54 $ftype 20 20 20 cd 18  |
   1.158  0  cd 19 eb fa  |
   1.159  EOT
   1.160 +	fi 2> /dev/null
   1.161  
   1.162  	# Create fats
   1.163  	echo "0  $fhead |" | hexdump -R | dd of=$basedir/boot/isolinux/efi.img \
   1.164 @@ -523,6 +580,11 @@
   1.165  	echo "0  $fhead |" | hexdump -R | dd of=$basedir/boot/isolinux/efi.img \
   1.166  		seek=$(($rsect+$fsect)) bs=512 conv=notrunc 2> /dev/null
   1.167  
   1.168 +	# Add label
   1.169 +	echo "0  53 59 53 54 45 4d 00 00  00 00 00 08 |" | hexdump -R | \
   1.170 +		dd of=$basedir/boot/isolinux/efi.img bs=512 conv=notrunc \
   1.171 +		seek=$(($rsect+$fsect+$fsect)) 2> /dev/null
   1.172 +
   1.173  	mkdir -p /tmp/mnt$$
   1.174  	mount -o loop $basedir/boot/isolinux/efi.img /tmp/mnt$$
   1.175  	( cd $basedir; find efi -type d | cpio -o -H newc ) | \