1*8617a60dSAndroid Build Coastguard Worker /* Copyright 2011 The ChromiumOS Authors 2*8617a60dSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 3*8617a60dSAndroid Build Coastguard Worker * found in the LICENSE file. 4*8617a60dSAndroid Build Coastguard Worker */ 5*8617a60dSAndroid Build Coastguard Worker 6*8617a60dSAndroid Build Coastguard Worker #ifndef VBOOT_REFERENCE_FMAP_H_ 7*8617a60dSAndroid Build Coastguard Worker #define VBOOT_REFERENCE_FMAP_H_ 8*8617a60dSAndroid Build Coastguard Worker 9*8617a60dSAndroid Build Coastguard Worker #include <inttypes.h> 10*8617a60dSAndroid Build Coastguard Worker #include <stddef.h> 11*8617a60dSAndroid Build Coastguard Worker 12*8617a60dSAndroid Build Coastguard Worker /* FMAP structs. See http://code.google.com/p/flashmap/wiki/FmapSpec */ 13*8617a60dSAndroid Build Coastguard Worker #define FMAP_NAMELEN 32 14*8617a60dSAndroid Build Coastguard Worker #define FMAP_SIGNATURE "__FMAP__" 15*8617a60dSAndroid Build Coastguard Worker #define FMAP_SIGNATURE_SIZE 8 16*8617a60dSAndroid Build Coastguard Worker #define FMAP_SEARCH_STRIDE 4 17*8617a60dSAndroid Build Coastguard Worker #define FMAP_VER_MAJOR 1 18*8617a60dSAndroid Build Coastguard Worker typedef struct _FmapHeader { 19*8617a60dSAndroid Build Coastguard Worker /* Avoid endian issues in signature... */ 20*8617a60dSAndroid Build Coastguard Worker char fmap_signature[FMAP_SIGNATURE_SIZE]; 21*8617a60dSAndroid Build Coastguard Worker uint8_t fmap_ver_major; 22*8617a60dSAndroid Build Coastguard Worker uint8_t fmap_ver_minor; 23*8617a60dSAndroid Build Coastguard Worker uint64_t fmap_base; 24*8617a60dSAndroid Build Coastguard Worker uint32_t fmap_size; 25*8617a60dSAndroid Build Coastguard Worker char fmap_name[FMAP_NAMELEN]; 26*8617a60dSAndroid Build Coastguard Worker uint16_t fmap_nareas; 27*8617a60dSAndroid Build Coastguard Worker } __attribute__((packed)) FmapHeader; 28*8617a60dSAndroid Build Coastguard Worker 29*8617a60dSAndroid Build Coastguard Worker enum fmap_flags { 30*8617a60dSAndroid Build Coastguard Worker FMAP_AREA_STATIC = 1 << 0, 31*8617a60dSAndroid Build Coastguard Worker FMAP_AREA_COMPRESSED = 1 << 1, 32*8617a60dSAndroid Build Coastguard Worker FMAP_AREA_RO = 1 << 2, 33*8617a60dSAndroid Build Coastguard Worker /* Should be preserved on update or rollback. */ 34*8617a60dSAndroid Build Coastguard Worker FMAP_AREA_PRESERVE = 1 << 3, 35*8617a60dSAndroid Build Coastguard Worker }; 36*8617a60dSAndroid Build Coastguard Worker 37*8617a60dSAndroid Build Coastguard Worker typedef struct _FmapAreaHeader { 38*8617a60dSAndroid Build Coastguard Worker uint32_t area_offset; 39*8617a60dSAndroid Build Coastguard Worker uint32_t area_size; 40*8617a60dSAndroid Build Coastguard Worker char area_name[FMAP_NAMELEN]; 41*8617a60dSAndroid Build Coastguard Worker uint16_t area_flags; 42*8617a60dSAndroid Build Coastguard Worker } __attribute__((packed)) FmapAreaHeader; 43*8617a60dSAndroid Build Coastguard Worker 44*8617a60dSAndroid Build Coastguard Worker 45*8617a60dSAndroid Build Coastguard Worker /* Find and point to the FMAP header within the buffer */ 46*8617a60dSAndroid Build Coastguard Worker FmapHeader *fmap_find(uint8_t *ptr, size_t size); 47*8617a60dSAndroid Build Coastguard Worker 48*8617a60dSAndroid Build Coastguard Worker /* Search for an area by name, return pointer to its beginning */ 49*8617a60dSAndroid Build Coastguard Worker uint8_t *fmap_find_by_name(uint8_t *ptr, size_t size, 50*8617a60dSAndroid Build Coastguard Worker /* optional, will call fmap_find() if NULL */ 51*8617a60dSAndroid Build Coastguard Worker FmapHeader *fmap, 52*8617a60dSAndroid Build Coastguard Worker /* The area name to search for */ 53*8617a60dSAndroid Build Coastguard Worker const char *name, 54*8617a60dSAndroid Build Coastguard Worker /* optional, return pointer to entry if not NULL */ 55*8617a60dSAndroid Build Coastguard Worker FmapAreaHeader **ah); 56*8617a60dSAndroid Build Coastguard Worker 57*8617a60dSAndroid Build Coastguard Worker #endif /* VBOOT_REFERENCE_FMAP_H_ */ 58