Subversion Repositories HelenOS

Rev

Rev 3509 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
3264 decky 1
#!/usr/bin/env python
2
#
3
# Copyright (c) 2008 Martin Decky
4
# All rights reserved.
5
#
6
# Redistribution and use in source and binary forms, with or without
7
# modification, are permitted provided that the following conditions
8
# are met:
9
#
10
# - Redistributions of source code must retain the above copyright
11
#   notice, this list of conditions and the following disclaimer.
12
# - Redistributions in binary form must reproduce the above copyright
13
#   notice, this list of conditions and the following disclaimer in the
14
#   documentation and/or other materials provided with the distribution.
15
# - The name of the author may not be used to endorse or promote products
16
#   derived from this software without specific prior written permission.
17
#
18
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
#
29
"""
30
FAT creator
31
"""
32
 
33
import sys
34
import os
35
import random
36
import xstruct
37
 
38
BOOT_SECTOR = """little:
39
	uint8_t jmp[3]             /* jump instruction */
40
	char oem[8]                /* OEM string */
41
	uint16_t sector            /* bytes per sector */
42
	uint8_t cluster            /* sectors per cluster */
43
	uint16_t reserved          /* reserved sectors */
44
	uint8_t fats               /* number of FATs */
45
	uint16_t rootdir           /* root directory entries */
46
	uint16_t sectors           /* total number of sectors */
47
	uint8_t descriptor         /* media descriptor */
48
	uint16_t fat_sectors       /* sectors per single FAT */
49
	uint16_t track_sectors     /* sectors per track */
50
	uint16_t heads             /* number of heads */
51
	uint32_t hidden            /* hidden sectors */
52
	uint32_t sectors_big       /* total number of sectors (if sectors == 0) */
53
 
54
	/* Extended BIOS Parameter Block */
55
	uint8_t drive              /* physical drive number */
56
	padding[1]                 /* reserved (current head) */
57
	uint8_t extboot_signature  /* extended boot signature */
58
	uint32_t serial            /* serial number */
59
	char label[11]             /* volume label */
60
	char fstype[8]             /* filesystem type */
61
	padding[448]               /* boot code */
62
	uint8_t boot_signature[2]  /* boot signature */
63
"""
64
 
65
def usage(prname):
66
	"Print usage syntax"
67
	print prname + " <PATH> <IMAGE>"
68
 
69
def main():
70
	if (len(sys.argv) < 3):
71
		usage(sys.argv[0])
72
		return
73
 
74
	path = os.path.abspath(sys.argv[1])
75
	if (not os.path.isdir(path)):
76
		print "<PATH> must be a directory"
77
		return
78
 
79
	outf = file(sys.argv[2], "w")
80
 
81
	boot_sector = xstruct.create(BOOT_SECTOR)
82
	boot_sector.jmp = [0xEB, 0x3C, 0x90]
83
	boot_sector.oem = "MSDOS5.0"
84
	boot_sector.sector = 512
85
	boot_sector.cluster = 8 # 4096 bytes per cluster
86
	boot_sector.reserved = 1
87
	boot_sector.fats = 2
88
	boot_sector.rootdir = 224 # FIXME: root directory should be sector aligned
89
	boot_sector.sectors = 0 # FIXME
90
	boot_sector.descriptor = 0xF8
91
	boot_sector.fat_sectors = 0 # FIXME
92
	boot_sector.track_sectors = 0 # FIXME
93
	boot_sector.heads = 0 # FIXME
94
	boot_sector.hidden = 0
95
	boot_sector.sectors_big = 0 # FIXME
96
 
97
	boot_sector.drive = 0
98
	boot_sector.extboot_signature = 0x29
99
	boot_sector.serial = random.randint(0, 0xFFFFFFFF)
100
	boot_sector.label = "HELENOS"
101
	boot_sector.fstype = "FAT16   "
102
	boot_sector.boot_signature = [0x55, 0xAA]
103
 
104
	outf.write(boot_sector.pack())
105
 
106
	outf.close()
107
 
108
if __name__ == '__main__':
109
	main()