1*83d290c5STom Rini /* SPDX-License-Identifier: GPL-2.0+ */ 24d3c95f5SJorgen Lundman /* 34d3c95f5SJorgen Lundman * GRUB -- GRand Unified Bootloader 44d3c95f5SJorgen Lundman * Copyright (C) 1999,2000,2001,2002,2003,2004 Free Software Foundation, Inc. 54d3c95f5SJorgen Lundman */ 64d3c95f5SJorgen Lundman /* 74d3c95f5SJorgen Lundman * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 84d3c95f5SJorgen Lundman * Use is subject to license terms. 94d3c95f5SJorgen Lundman */ 104d3c95f5SJorgen Lundman 114d3c95f5SJorgen Lundman #ifndef _SYS_ZAP_LEAF_H 124d3c95f5SJorgen Lundman #define _SYS_ZAP_LEAF_H 134d3c95f5SJorgen Lundman 144d3c95f5SJorgen Lundman #define ZAP_LEAF_MAGIC 0x2AB1EAF 154d3c95f5SJorgen Lundman 164d3c95f5SJorgen Lundman /* chunk size = 24 bytes */ 174d3c95f5SJorgen Lundman #define ZAP_LEAF_CHUNKSIZE 24 184d3c95f5SJorgen Lundman 194d3c95f5SJorgen Lundman /* 204d3c95f5SJorgen Lundman * The amount of space within the chunk available for the array is: 214d3c95f5SJorgen Lundman * chunk size - space for type (1) - space for next pointer (2) 224d3c95f5SJorgen Lundman */ 234d3c95f5SJorgen Lundman #define ZAP_LEAF_ARRAY_BYTES (ZAP_LEAF_CHUNKSIZE - 3) 244d3c95f5SJorgen Lundman 254d3c95f5SJorgen Lundman typedef enum zap_chunk_type { 264d3c95f5SJorgen Lundman ZAP_CHUNK_FREE = 253, 274d3c95f5SJorgen Lundman ZAP_CHUNK_ENTRY = 252, 284d3c95f5SJorgen Lundman ZAP_CHUNK_ARRAY = 251, 294d3c95f5SJorgen Lundman ZAP_CHUNK_TYPE_MAX = 250 304d3c95f5SJorgen Lundman } zap_chunk_type_t; 314d3c95f5SJorgen Lundman 324d3c95f5SJorgen Lundman /* 334d3c95f5SJorgen Lundman * TAKE NOTE: 344d3c95f5SJorgen Lundman * If zap_leaf_phys_t is modified, zap_leaf_byteswap() must be modified. 354d3c95f5SJorgen Lundman */ 364d3c95f5SJorgen Lundman typedef struct zap_leaf_phys { 374d3c95f5SJorgen Lundman struct zap_leaf_header { 384d3c95f5SJorgen Lundman uint64_t lh_block_type; /* ZBT_LEAF */ 394d3c95f5SJorgen Lundman uint64_t lh_pad1; 404d3c95f5SJorgen Lundman uint64_t lh_prefix; /* hash prefix of this leaf */ 414d3c95f5SJorgen Lundman uint32_t lh_magic; /* ZAP_LEAF_MAGIC */ 424d3c95f5SJorgen Lundman uint16_t lh_nfree; /* number free chunks */ 434d3c95f5SJorgen Lundman uint16_t lh_nentries; /* number of entries */ 444d3c95f5SJorgen Lundman uint16_t lh_prefix_len; /* num bits used to id this */ 454d3c95f5SJorgen Lundman 464d3c95f5SJorgen Lundman /* above is accessable to zap, below is zap_leaf private */ 474d3c95f5SJorgen Lundman 484d3c95f5SJorgen Lundman uint16_t lh_freelist; /* chunk head of free list */ 494d3c95f5SJorgen Lundman uint8_t lh_pad2[12]; 504d3c95f5SJorgen Lundman } l_hdr; /* 2 24-byte chunks */ 514d3c95f5SJorgen Lundman 524d3c95f5SJorgen Lundman /* 534d3c95f5SJorgen Lundman * The header is followed by a hash table with 544d3c95f5SJorgen Lundman * ZAP_LEAF_HASH_NUMENTRIES(zap) entries. The hash table is 554d3c95f5SJorgen Lundman * followed by an array of ZAP_LEAF_NUMCHUNKS(zap) 564d3c95f5SJorgen Lundman * zap_leaf_chunk structures. These structures are accessed 574d3c95f5SJorgen Lundman * with the ZAP_LEAF_CHUNK() macro. 584d3c95f5SJorgen Lundman */ 594d3c95f5SJorgen Lundman 604d3c95f5SJorgen Lundman uint16_t l_hash[1]; 614d3c95f5SJorgen Lundman } zap_leaf_phys_t; 624d3c95f5SJorgen Lundman 634d3c95f5SJorgen Lundman typedef union zap_leaf_chunk { 644d3c95f5SJorgen Lundman struct zap_leaf_entry { 654d3c95f5SJorgen Lundman uint8_t le_type; /* always ZAP_CHUNK_ENTRY */ 664d3c95f5SJorgen Lundman uint8_t le_int_size; /* size of ints */ 674d3c95f5SJorgen Lundman uint16_t le_next; /* next entry in hash chain */ 684d3c95f5SJorgen Lundman uint16_t le_name_chunk; /* first chunk of the name */ 694d3c95f5SJorgen Lundman uint16_t le_name_length; /* bytes in name, incl null */ 704d3c95f5SJorgen Lundman uint16_t le_value_chunk; /* first chunk of the value */ 714d3c95f5SJorgen Lundman uint16_t le_value_length; /* value length in ints */ 724d3c95f5SJorgen Lundman uint32_t le_cd; /* collision differentiator */ 734d3c95f5SJorgen Lundman uint64_t le_hash; /* hash value of the name */ 744d3c95f5SJorgen Lundman } l_entry; 754d3c95f5SJorgen Lundman struct zap_leaf_array { 764d3c95f5SJorgen Lundman uint8_t la_type; /* always ZAP_CHUNK_ARRAY */ 774d3c95f5SJorgen Lundman union { 784d3c95f5SJorgen Lundman uint8_t la_array[ZAP_LEAF_ARRAY_BYTES]; 794d3c95f5SJorgen Lundman uint64_t la_array64; 804d3c95f5SJorgen Lundman } __attribute__ ((packed)); 814d3c95f5SJorgen Lundman uint16_t la_next; /* next blk or CHAIN_END */ 824d3c95f5SJorgen Lundman } l_array; 834d3c95f5SJorgen Lundman struct zap_leaf_free { 844d3c95f5SJorgen Lundman uint8_t lf_type; /* always ZAP_CHUNK_FREE */ 854d3c95f5SJorgen Lundman uint8_t lf_pad[ZAP_LEAF_ARRAY_BYTES]; 864d3c95f5SJorgen Lundman uint16_t lf_next; /* next in free list, or CHAIN_END */ 874d3c95f5SJorgen Lundman } l_free; 884d3c95f5SJorgen Lundman } zap_leaf_chunk_t; 894d3c95f5SJorgen Lundman 904d3c95f5SJorgen Lundman #endif /* _SYS_ZAP_LEAF_H */ 91