162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * fs/partitions/karma.c 462306a36Sopenharmony_ci * Rio Karma partition info. 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Copyright (C) 2006 Bob Copeland (me@bobcopeland.com) 762306a36Sopenharmony_ci * based on osf.c 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include "check.h" 1162306a36Sopenharmony_ci#include <linux/compiler.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#define KARMA_LABEL_MAGIC 0xAB56 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ciint karma_partition(struct parsed_partitions *state) 1662306a36Sopenharmony_ci{ 1762306a36Sopenharmony_ci int i; 1862306a36Sopenharmony_ci int slot = 1; 1962306a36Sopenharmony_ci Sector sect; 2062306a36Sopenharmony_ci unsigned char *data; 2162306a36Sopenharmony_ci struct disklabel { 2262306a36Sopenharmony_ci u8 d_reserved[270]; 2362306a36Sopenharmony_ci struct d_partition { 2462306a36Sopenharmony_ci __le32 p_res; 2562306a36Sopenharmony_ci u8 p_fstype; 2662306a36Sopenharmony_ci u8 p_res2[3]; 2762306a36Sopenharmony_ci __le32 p_offset; 2862306a36Sopenharmony_ci __le32 p_size; 2962306a36Sopenharmony_ci } d_partitions[2]; 3062306a36Sopenharmony_ci u8 d_blank[208]; 3162306a36Sopenharmony_ci __le16 d_magic; 3262306a36Sopenharmony_ci } __packed *label; 3362306a36Sopenharmony_ci struct d_partition *p; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci data = read_part_sector(state, 0, §); 3662306a36Sopenharmony_ci if (!data) 3762306a36Sopenharmony_ci return -1; 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci label = (struct disklabel *)data; 4062306a36Sopenharmony_ci if (le16_to_cpu(label->d_magic) != KARMA_LABEL_MAGIC) { 4162306a36Sopenharmony_ci put_dev_sector(sect); 4262306a36Sopenharmony_ci return 0; 4362306a36Sopenharmony_ci } 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci p = label->d_partitions; 4662306a36Sopenharmony_ci for (i = 0 ; i < 2; i++, p++) { 4762306a36Sopenharmony_ci if (slot == state->limit) 4862306a36Sopenharmony_ci break; 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci if (p->p_fstype == 0x4d && le32_to_cpu(p->p_size)) { 5162306a36Sopenharmony_ci put_partition(state, slot, le32_to_cpu(p->p_offset), 5262306a36Sopenharmony_ci le32_to_cpu(p->p_size)); 5362306a36Sopenharmony_ci } 5462306a36Sopenharmony_ci slot++; 5562306a36Sopenharmony_ci } 5662306a36Sopenharmony_ci strlcat(state->pp_buf, "\n", PAGE_SIZE); 5762306a36Sopenharmony_ci put_dev_sector(sect); 5862306a36Sopenharmony_ci return 1; 5962306a36Sopenharmony_ci} 6062306a36Sopenharmony_ci 61