Coverage Report

Created: 2025-06-22 06:56

/src/util-linux/include/pt-sgi.h
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * No copyright is claimed.  This code is in the public domain; do with
3
 * it what you wish.
4
 */
5
#ifndef UTIL_LINUX_PT_SGI_H
6
#define UTIL_LINUX_PT_SGI_H
7
8
#include <stdint.h>
9
10
#define SGI_LABEL_MAGIC   0x0be5a941
11
12
0
#define SGI_MAXPARTITIONS 16
13
#define SGI_MAXVOLUMES    15
14
15
/* partition types */
16
enum {
17
  SGI_TYPE_VOLHDR   = 0x00,
18
  SGI_TYPE_TRKREPL  = 0x01,
19
  SGI_TYPE_SECREPL  = 0x02,
20
  SGI_TYPE_SWAP   = 0x03,
21
  SGI_TYPE_BSD    = 0x04,
22
  SGI_TYPE_SYSV   = 0x05,
23
  SGI_TYPE_ENTIRE_DISK  = 0x06,
24
  SGI_TYPE_EFS    = 0x07,
25
  SGI_TYPE_LVOL   = 0x08,
26
  SGI_TYPE_RLVOL    = 0x09,
27
  SGI_TYPE_XFS    = 0x0a,
28
  SGI_TYPE_XFSLOG   = 0x0b,
29
  SGI_TYPE_XLV    = 0x0c,
30
  SGI_TYPE_XVM    = 0x0d
31
};
32
33
struct sgi_device_parameter {
34
  unsigned char skew;
35
  unsigned char gap1;
36
  unsigned char gap2;
37
  unsigned char sparecyl;
38
39
  uint16_t pcylcount;
40
  uint16_t head_vol0;
41
  uint16_t ntrks;   /* tracks in cyl 0 or vol 0 */
42
43
  unsigned char cmd_tag_queue_depth;
44
  unsigned char unused0;
45
46
  uint16_t unused1;
47
  uint16_t nsect;   /* sectors/tracks in cyl 0 or vol 0 */
48
  uint16_t bytes;
49
  uint16_t ilfact;
50
  uint32_t flags;   /* SGI_DEVPARAM_* controller flags */
51
  uint32_t datarate;
52
  uint32_t retries_on_error;
53
  uint32_t ms_per_word;
54
  uint16_t xylogics_gap1;
55
  uint16_t xylogics_syncdelay;
56
  uint16_t xylogics_readdelay;
57
  uint16_t xylogics_gap2;
58
  uint16_t xylogics_readgate;
59
  uint16_t xylogics_writecont;
60
} __attribute__((packed));
61
62
enum {
63
  SGI_DEVPARAM_SECTOR_SLIP  = 0x01,
64
  SGI_DEVPARAM_SECTOR_FWD   = 0x02,
65
  SGI_DEVPARAM_TRACK_FWD    = 0x04,
66
  SGI_DEVPARAM_TRACK_MULTIVOL = 0x08,
67
  SGI_DEVPARAM_IGNORE_ERRORS  = 0x10,
68
  SGI_DEVPARAM_RESEEK   = 0x20,
69
  SGI_DEVPARAM_CMDTAGQ_ENABLE = 0x40
70
};
71
72
73
struct sgi_disklabel {
74
  uint32_t magic;     /* magic number */
75
  uint16_t root_part_num;   /* # root partition */
76
  uint16_t swap_part_num;   /* # swap partition */
77
  unsigned char boot_file[16];  /* name of boot file */
78
79
  struct sgi_device_parameter devparam; /* not used now */
80
81
  struct sgi_volume {
82
    unsigned char name[8];  /* name of volume */
83
    uint32_t block_num; /* logical block number */
84
    uint32_t num_bytes; /* how big, in bytes */
85
  } __attribute__((packed)) volume[SGI_MAXVOLUMES];
86
87
  struct sgi_partition {
88
    uint32_t num_blocks;  /* size in logical blocks */
89
    uint32_t first_block; /* first logical block */
90
    uint32_t type;    /* type of this partition */
91
  } __attribute__((packed)) partitions[SGI_MAXPARTITIONS];
92
93
  /* checksum is the 32bit 2's complement sum of the disklabel */
94
  uint32_t csum;      /* disk label checksum */
95
  uint32_t padding;   /* padding */
96
} __attribute__((packed));
97
98
static inline uint32_t sgi_pt_checksum(struct sgi_disklabel *label)
99
103
{
100
103
  int count;
101
103
  uint32_t sum = 0;
102
103
  unsigned char *ptr = (unsigned char *) label;
103
104
103
  count = sizeof(*label) / sizeof(uint32_t);
105
103
  ptr += sizeof(uint32_t) * (count - 1);
106
107
13.2k
  while (count--) {
108
13.1k
    uint32_t val;
109
110
13.1k
    memcpy(&val, ptr, sizeof(uint32_t));
111
13.1k
    sum -= be32_to_cpu(val);
112
113
13.1k
    ptr -= sizeof(uint32_t);
114
13.1k
  }
115
116
103
  return sum;
117
103
}
118
119
#endif /* UTIL_LINUX_PT_SGI_H */