1 #include "devices/partition.h"
3 #include "threads/malloc.h"
8 disk_sector_t first_sector;
9 disk_sector_t sector_cnt;
12 struct partition partitions[PARTITION_CNT];
14 static void scan_partition_table (struct disk *, disk_sector_t);
21 for (chan = 0; chan < 2; chan++)
22 for (dev = 0; dev < 2; dev++)
24 struct disk *disk = disk_get (chan, dev);
26 scan_partition_table (disk, 0);
32 partition_get (enum partition_type type)
34 ASSERT (type < PARTITION_CNT);
36 return &partitions[type];
40 partition_size (struct partition *p)
48 partition_read (struct partition *p, disk_sector_t sector, void *buffer)
51 ASSERT (sector < p->sector_cnt);
52 ASSERT (buffer != NULL);
54 disk_read (p->disk, p->first_sector + sector, buffer);
58 partition_write (struct partition *p, disk_sector_t sector, const void *buffer)
61 ASSERT (sector < p->sector_cnt);
62 ASSERT (buffer != NULL);
64 disk_write (p->disk, p->first_sector + sector, buffer);
67 #define PARTITION_CNT 4
68 #define PARTITION_TABLE_SIGNATURE 0xaa55
70 struct partition_table_entry
76 uint32_t first_sector;
80 struct partition_table
82 uint8_t boot_loader[446];
83 struct partition_table_entry partitions[PARTITION_CNT];
87 static void register_partition (struct disk *,
88 const struct partition_table_entry *,
92 scan_partition_table (struct disk *disk, disk_sector_t sector)
94 struct partition_table *pt;
96 ASSERT (sizeof *pt == DISK_SECTOR_SIZE);
97 pt = xmalloc (sizeof *pt);
98 disk_read (disk, sector, pt);
100 if (pt->signature == PARTITION_TABLE_SIGNATURE)
104 for (i = 0; i < PARTITION_CNT; i++)
106 struct partition_table_entry *pte = &pt->partitions[i];
110 case 0x05: /* DOS extended partition. */
111 case 0x0f: /* Windows 95 extented partition. */
112 case 0x85: /* Linux extended partition. */
113 case 0xc5: /* DRDOS "secured" extended partition. */
114 scan_partition_table (disk, pte->first_sector);
117 case 0x20: /* Pintos boot partition. */
118 register_partition (disk, pte, PARTITION_BOOT);
121 case 0x21: /* Pintos file system partition. */
122 register_partition (disk, pte, PARTITION_FILESYS);
125 case 0x22: /* Pintos scratch partition. */
126 register_partition (disk, pte, PARTITION_SCRATCH);
129 case 0x23: /* Pintos swap partition. */
130 register_partition (disk, pte, PARTITION_SWAP);
134 /* We don't know anything about this kind of
135 partition. Ignore it. */
146 register_partition (struct disk *disk, const struct partition_table_entry *pte,
147 enum partition_type type)
149 static const char *partition_names[] =
150 {"boot", "file system", "scratch", "swap"};
153 ASSERT (type < PARTITION_CNT);
155 printf ("%s: Found %"PRDSNu" sector (", disk_name (disk), pte->sector_cnt);
156 print_human_readable_size ((uint64_t) pte->sector_cnt * DISK_SECTOR_SIZE);
157 printf (") %s partition starting at sector %"PRDSNu"\n",
158 partition_names[pte->type], pte->first_sector);
160 p = &partitions[type];
162 PANIC ("Can't handle multiple %s partitions", partition_names[pte->type]);
164 p->first_sector = pte->first_sector;
165 p->sector_cnt = pte->sector_cnt;