"Fossies" - the Fresh Open Source Software Archive

Member "radare2-4.0.0/shlr/grub/partmap/acorn.c" (28 Oct 2019, 3617 Bytes) of package /linux/privat/radare2-4.0.0.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "acorn.c" see the Fossies "Dox" file reference documentation.

    1 /* acorn.c - Read Linux/ADFS partition tables.  */
    2 /*
    3  *  GRUB  --  GRand Unified Bootloader
    4  *  Copyright (C) 2005,2007  Free Software Foundation, Inc.
    5  *
    6  *  GRUB is free software: you can redistribute it and/or modify
    7  *  it under the terms of the GNU General Public License as published by
    8  *  the Free Software Foundation, either version 3 of the License, or
    9  *  (at your option) any later version.
   10  *
   11  *  GRUB is distributed in the hope that it will be useful,
   12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
   13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   14  *  GNU General Public License for more details.
   15  *
   16  *  You should have received a copy of the GNU General Public License
   17  *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
   18  */
   19 
   20 #include <grub/disk.h>
   21 #include <grub/misc.h>
   22 #include <grub/mm.h>
   23 #include <grub/partition.h>
   24 #include <grub/acorn_filecore.h>
   25 
   26 #define LINUX_NATIVE_MAGIC grub_cpu_to_le32 (0xdeafa1de)
   27 #define LINUX_SWAP_MAGIC   grub_cpu_to_le32 (0xdeafab1e)
   28 #define LINUX_MAP_ENTRIES  (512 / 12)
   29 
   30 #define NONADFS_PARTITION_TYPE_LINUX 9
   31 #define NONADFS_PARTITION_TYPE_MASK 15
   32 
   33 struct grub_acorn_boot_block
   34 {
   35   grub_uint8_t misc[0x1C0];
   36   struct grub_filecore_disc_record disc_record;
   37   grub_uint8_t flags;
   38   grub_uint16_t start_cylinder;
   39   grub_uint8_t checksum;
   40 } __attribute__ ((packed, aligned));
   41 
   42 struct linux_part
   43 {
   44   grub_uint32_t magic;
   45   grub_uint32_t start;
   46   grub_uint32_t size;
   47 };
   48 
   49 struct grub_partition_map grub_acorn_partition_map;
   50 
   51 static grub_err_t
   52 acorn_partition_map_find (grub_disk_t disk, struct linux_part *m,
   53               grub_disk_addr_t *sector)
   54 {
   55   struct grub_acorn_boot_block boot;
   56   grub_err_t err;
   57   unsigned int checksum = 0;
   58   unsigned int heads;
   59   unsigned int sectors_per_cylinder;
   60   int i;
   61 
   62   err = grub_disk_read (disk, 0xC00 / GRUB_DISK_SECTOR_SIZE, 0,
   63             sizeof (struct grub_acorn_boot_block),
   64             &boot);
   65   if (err)
   66     return err;
   67 
   68   if ((boot.flags & NONADFS_PARTITION_TYPE_MASK) != NONADFS_PARTITION_TYPE_LINUX)
   69     goto fail;
   70 
   71   for (i = 0; i != 0x1ff; ++i)
   72     checksum = (checksum & 0xff) + (checksum >> 8) + boot.misc[i];
   73 
   74   if ((grub_uint8_t) checksum != boot.checksum)
   75     goto fail;
   76 
   77   heads = (boot.disc_record.heads
   78             + ((boot.disc_record.lowsector >> 6) & 1));
   79   sectors_per_cylinder = boot.disc_record.secspertrack * heads;
   80   *sector = grub_le_to_cpu16 (boot.start_cylinder) * sectors_per_cylinder;
   81 
   82   return grub_disk_read (disk, *sector, 0,
   83              sizeof (struct linux_part) * LINUX_MAP_ENTRIES,
   84              m);
   85 
   86 fail:
   87   return grub_error (GRUB_ERR_BAD_PART_TABLE,
   88              "Linux/ADFS partition map not found");
   89 
   90 }
   91 
   92 
   93 static grub_err_t
   94 acorn_partition_map_iterate (grub_disk_t disk,
   95                  int (*hook) (grub_disk_t disk,
   96                       const grub_partition_t partition,
   97                       void *closure),
   98                  void *closure)
   99 {
  100   struct grub_partition part;
  101   struct linux_part map[LINUX_MAP_ENTRIES];
  102   int i;
  103   grub_disk_addr_t sector = 0;
  104   grub_err_t err;
  105 
  106   err = acorn_partition_map_find (disk, map, &sector);
  107   if (err)
  108     return err;
  109 
  110   part.partmap = &grub_acorn_partition_map;
  111 
  112   for (i = 0; i != LINUX_MAP_ENTRIES; ++i)
  113     {
  114       if (map[i].magic != LINUX_NATIVE_MAGIC
  115       && map[i].magic != LINUX_SWAP_MAGIC)
  116     return GRUB_ERR_NONE;
  117 
  118       part.start = sector + map[i].start;
  119       part.len = map[i].size;
  120       part.offset = 6;
  121       part.number = part.index = i;
  122 
  123       if (hook (disk, &part, closure))
  124     return grub_errno;
  125     }
  126 
  127   return GRUB_ERR_NONE;
  128 }
  129 
  130 
  131 
  132 /* Partition map type.  */
  133 struct grub_partition_map grub_acorn_partition_map =
  134 {
  135   .name = "acorn",
  136   .iterate = acorn_partition_map_iterate,
  137 };
  138