Adjust memory layout for 2.6.22+ kernels with 32KB setup code
[mknbi.git] / dismbr.pl
1 #!/usr/bin/perl -w
2 #
3 # Quick and dirty program to decode a partition table in MBR
4 # GPL, July 2000, Ken Yap
5 #
6
7 sub decodechs ($)
8 {
9         my ($chs) = @_;
10         my ($c, $h, $s);
11
12         ($h, $s, $c) = unpack('CCC', $chs);
13         $c += ($s & 0xC0) << 2;
14         $s &= 0x3F;
15         return ($c, $h, $s);
16 }
17
18 sub dismbr ($)
19 {
20         my ($par) = @_;
21         my ($flags, $chs1, $type, $chs2, $bootseg, $numsegs);
22
23         ($flags, $chs1, $type, $chs2, $bootseg, $numsegs) =
24                 unpack('Ca3Ca3VV', $par);
25         printf "%s type:%02x %d/%d/%d-%d/%d/%d boot:%04x sectors:%04x\n",
26                 ($flags & 0x80) ? '*' : ' ', $type,
27                 decodechs($chs1), decodechs($chs2),
28                 $bootseg, $numsegs;
29 }
30
31 if ($#ARGV >= 0) {
32         open(STDIN, "$ARGV[0]") or die "$ARGV[0]: $!\n";
33 }
34 binmode(STDIN);
35 $nread = read(STDIN, $mbr, 512);
36 (defined($nread) and $nread == 512) or die "Cannot read 512 bytes of MBR\n";
37 (undef, $par[0], $par[1], $par[2], $par[3], $sig) =
38         unpack('a446a16a16a16a16v', $mbr);
39 $sig == 0xAA55 or die "Input is not a MBR\n";
40 foreach $i (0..3) {
41         print "$i: ";
42         dismbr($par[$i]);
43 }