18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * fs/partitions/karma.c 48c2ecf20Sopenharmony_ci * Rio Karma partition info. 58c2ecf20Sopenharmony_ci * 68c2ecf20Sopenharmony_ci * Copyright (C) 2006 Bob Copeland (me@bobcopeland.com) 78c2ecf20Sopenharmony_ci * based on osf.c 88c2ecf20Sopenharmony_ci */ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include "check.h" 118c2ecf20Sopenharmony_ci#include <linux/compiler.h> 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#define KARMA_LABEL_MAGIC 0xAB56 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ciint karma_partition(struct parsed_partitions *state) 168c2ecf20Sopenharmony_ci{ 178c2ecf20Sopenharmony_ci int i; 188c2ecf20Sopenharmony_ci int slot = 1; 198c2ecf20Sopenharmony_ci Sector sect; 208c2ecf20Sopenharmony_ci unsigned char *data; 218c2ecf20Sopenharmony_ci struct disklabel { 228c2ecf20Sopenharmony_ci u8 d_reserved[270]; 238c2ecf20Sopenharmony_ci struct d_partition { 248c2ecf20Sopenharmony_ci __le32 p_res; 258c2ecf20Sopenharmony_ci u8 p_fstype; 268c2ecf20Sopenharmony_ci u8 p_res2[3]; 278c2ecf20Sopenharmony_ci __le32 p_offset; 288c2ecf20Sopenharmony_ci __le32 p_size; 298c2ecf20Sopenharmony_ci } d_partitions[2]; 308c2ecf20Sopenharmony_ci u8 d_blank[208]; 318c2ecf20Sopenharmony_ci __le16 d_magic; 328c2ecf20Sopenharmony_ci } __packed *label; 338c2ecf20Sopenharmony_ci struct d_partition *p; 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci data = read_part_sector(state, 0, §); 368c2ecf20Sopenharmony_ci if (!data) 378c2ecf20Sopenharmony_ci return -1; 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci label = (struct disklabel *)data; 408c2ecf20Sopenharmony_ci if (le16_to_cpu(label->d_magic) != KARMA_LABEL_MAGIC) { 418c2ecf20Sopenharmony_ci put_dev_sector(sect); 428c2ecf20Sopenharmony_ci return 0; 438c2ecf20Sopenharmony_ci } 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci p = label->d_partitions; 468c2ecf20Sopenharmony_ci for (i = 0 ; i < 2; i++, p++) { 478c2ecf20Sopenharmony_ci if (slot == state->limit) 488c2ecf20Sopenharmony_ci break; 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci if (p->p_fstype == 0x4d && le32_to_cpu(p->p_size)) { 518c2ecf20Sopenharmony_ci put_partition(state, slot, le32_to_cpu(p->p_offset), 528c2ecf20Sopenharmony_ci le32_to_cpu(p->p_size)); 538c2ecf20Sopenharmony_ci } 548c2ecf20Sopenharmony_ci slot++; 558c2ecf20Sopenharmony_ci } 568c2ecf20Sopenharmony_ci strlcat(state->pp_buf, "\n", PAGE_SIZE); 578c2ecf20Sopenharmony_ci put_dev_sector(sect); 588c2ecf20Sopenharmony_ci return 1; 598c2ecf20Sopenharmony_ci} 608c2ecf20Sopenharmony_ci 61