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