cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

osf.c (1982B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 *  fs/partitions/osf.c
      4 *
      5 *  Code extracted from drivers/block/genhd.c
      6 *
      7 *  Copyright (C) 1991-1998  Linus Torvalds
      8 *  Re-organised Feb 1998 Russell King
      9 */
     10
     11#include "check.h"
     12
     13#define MAX_OSF_PARTITIONS 18
     14#define DISKLABELMAGIC (0x82564557UL)
     15
     16int osf_partition(struct parsed_partitions *state)
     17{
     18	int i;
     19	int slot = 1;
     20	unsigned int npartitions;
     21	Sector sect;
     22	unsigned char *data;
     23	struct disklabel {
     24		__le32 d_magic;
     25		__le16 d_type,d_subtype;
     26		u8 d_typename[16];
     27		u8 d_packname[16];
     28		__le32 d_secsize;
     29		__le32 d_nsectors;
     30		__le32 d_ntracks;
     31		__le32 d_ncylinders;
     32		__le32 d_secpercyl;
     33		__le32 d_secprtunit;
     34		__le16 d_sparespertrack;
     35		__le16 d_sparespercyl;
     36		__le32 d_acylinders;
     37		__le16 d_rpm, d_interleave, d_trackskew, d_cylskew;
     38		__le32 d_headswitch, d_trkseek, d_flags;
     39		__le32 d_drivedata[5];
     40		__le32 d_spare[5];
     41		__le32 d_magic2;
     42		__le16 d_checksum;
     43		__le16 d_npartitions;
     44		__le32 d_bbsize, d_sbsize;
     45		struct d_partition {
     46			__le32 p_size;
     47			__le32 p_offset;
     48			__le32 p_fsize;
     49			u8  p_fstype;
     50			u8  p_frag;
     51			__le16 p_cpg;
     52		} d_partitions[MAX_OSF_PARTITIONS];
     53	} * label;
     54	struct d_partition * partition;
     55
     56	data = read_part_sector(state, 0, &sect);
     57	if (!data)
     58		return -1;
     59
     60	label = (struct disklabel *) (data+64);
     61	partition = label->d_partitions;
     62	if (le32_to_cpu(label->d_magic) != DISKLABELMAGIC) {
     63		put_dev_sector(sect);
     64		return 0;
     65	}
     66	if (le32_to_cpu(label->d_magic2) != DISKLABELMAGIC) {
     67		put_dev_sector(sect);
     68		return 0;
     69	}
     70	npartitions = le16_to_cpu(label->d_npartitions);
     71	if (npartitions > MAX_OSF_PARTITIONS) {
     72		put_dev_sector(sect);
     73		return 0;
     74	}
     75	for (i = 0 ; i < npartitions; i++, partition++) {
     76		if (slot == state->limit)
     77		        break;
     78		if (le32_to_cpu(partition->p_size))
     79			put_partition(state, slot,
     80				le32_to_cpu(partition->p_offset),
     81				le32_to_cpu(partition->p_size));
     82		slot++;
     83	}
     84	strlcat(state->pp_buf, "\n", PAGE_SIZE);
     85	put_dev_sector(sect);
     86	return 1;
     87}