Re: [U-Boot-Users] FAT mbr on MMC or SD cards

Hello Joey,
"Joey Oravec" joravec@drewtech.com wrote:
- This code assumes that sector 0 contains a VBR. Instead I think it
should decide if 0 is an MBR or VBR, or even better utilize the dev:part command line. Can I make this determination that from the first three bytes, or is there a better way?
We have a patch in the queue to fix this, but it did not pass our internal review and unfortunately the engineer is on vacation right now so he cannot clean it up. Please be patiend for a week or two.
I wanted to share that with the list in case anybody else gets stuck.
Since my original email, I noticed code in fat_register_device() which determines a part_offset for 1.1.5 and 1.1.6. For now I've hacked this code to check the first three bytes EB:xx:90 or E9:xx:xx to make the mbr/pbr decision instead of the ascii string. Also I have it reading the valid partition offset instead of assuming 32. And finally I added a packed attribute to all structs.
I am not sure if we can use EB:xx:90 or E9:xx:xx (Am I right, this is the "Jump instruction to boot code" on a PBR?) for deciding between a MBR and a VBR, because the First 446 Bytes from a MBR are only "Bootcode", whatever this means, and maybe there is a MBR with EB:xx:90 or E9:xx:xx in the First 3 Bytes ...
- The decision of fat12, fat16, and fat32 is made upon fat_length and an
ascii field. The Microsoft document claims that the determination shall be made only by the count of clusters. Any disputes on that fix?
I have no idea...
I was reading a document "FAT: General Overfiew of On-Disk Format" v1.02 May 5, 1999 by Microsoft Corporation. The correct way is to calculate CountofClusters. Less than 4085 is FAT12, less than 65525 is FAT16, anything else is FAT32. I'll watch, and after he gets back from vacation we can do something about it.
This sounds good to me.
Do you have a patch for me, so I can test it?
thanks Heiko

"Heiko Schocher" hs@denx.de wrote in message news:1182164674.15090.54.camel@Apollo...
I am not sure if we can use EB:xx:90 or E9:xx:xx (Am I right, this is the "Jump instruction to boot code" on a PBR?) for deciding between a MBR and a VBR, because the First 446 Bytes from a MBR are only "Bootcode", whatever this means, and maybe there is a MBR with EB:xx:90 or E9:xx:xx in the First 3 Bytes ...
Correct, the Microsoft document says the beginning of a VBR will always be "a 3-byte intel x86 unconditional branch (jump) instruction that jumps to the start of the operating system bootstrap code". It says either form is acceptable but 0xEB is used more frequently.
None of the common MBRs start with a jump (http://mirror.href.com/thestarman/asm/mbr/), so it seems like a pretty decent heuristic.
Linux-2.6.20 in fs/partitions/msdos.c has a function msdos_partition() that checks for the 0xAA55 signature and a 0x80 active or 0x00 inactive boot indicator for each partition in the table. I'm not sure if that technique is any better or worse.
-joey
participants (2)
-
Heiko Schocher
-
Joey Oravec