xref: /aosp_15_r20/external/coreboot/payloads/libpayload/include/archive.h (revision b9411a12aaaa7e1e6a6fb7c5e057f44ee179a49c)
1 /*
2  *
3  * Copyright (C) 2015 The ChromiumOS Authors.  All rights reserved.
4  *                 written by Daisuke Nojiri <[email protected]>
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  * 3. The name of the author may not be used to endorse or promote products
15  *    derived from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  */
29 
30 #ifndef __ARCHIVE_H
31 #define __ARCHIVE_H
32 
33 #include <stdint.h>
34 
35 /*
36  * Archive file layout:
37  *
38  *  +----------------------------------+
39  *  |           root header            |
40  *  +----------------------------------+
41  *  |         file_header[0]           |
42  *  +----------------------------------+
43  *  |         file_header[1]           |
44  *  +----------------------------------+
45  *  |              ...                 |
46  *  +----------------------------------+
47  *  |         file_header[count-1]     |
48  *  +----------------------------------+
49  *  |         file(0) content          |
50  *  +----------------------------------+
51  *  |         file(1) content          |
52  *  +----------------------------------+
53  *  |              ...                 |
54  *  +----------------------------------+
55  *  |         file(count-1) content    |
56  *  +----------------------------------+
57  */
58 
59 #define VERSION		0
60 #define CBAR_MAGIC	"CBAR"
61 #define NAME_LENGTH	32
62 
63 /* Root header */
64 struct directory {
65 	char magic[4];
66 	uint32_t version;	/* version of the header. little endian */
67 	uint32_t size;		/* total size of archive. little endian */
68 	uint32_t count;		/* number of files. little endian */
69 };
70 
71 /* File header */
72 struct dentry {
73 	/* file name. null-terminated if shorter than NAME_LENGTH */
74 	char name[NAME_LENGTH];
75 	/* file offset from the root header. little endian */
76 	uint32_t offset;
77 	/* file size. little endian */
78 	uint32_t size;
79 };
80 
get_first_dentry(const struct directory * dir)81 static inline struct dentry *get_first_dentry(const struct directory *dir)
82 {
83 	return (struct dentry *)(dir + 1);
84 }
85 
get_first_offset(const struct directory * dir)86 static inline uint32_t get_first_offset(const struct directory *dir)
87 {
88 	return sizeof(struct directory) + sizeof(struct dentry) * dir->count;
89 }
90 
91 #endif
92