summaryrefslogtreecommitdiffstats
path: root/include/filetype.h
blob: 6425c9c8c5b98776a6db218f8d78036a015e7b9a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef __FILE_TYPE_H
#define __FILE_TYPE_H

#include <linux/string.h>
#include <linux/types.h>

/*
 * List of file types we know
 */
enum filetype {
	filetype_unknown,
	filetype_arm_zimage,
	filetype_lzo_compressed,
	filetype_lz4_compressed,
	filetype_arm_barebox,
	filetype_uimage,
	filetype_ubi,
	filetype_jffs2,
	filetype_squashfs,
	filetype_gzip,
	filetype_bzip2,
	filetype_oftree,
	filetype_aimage,
	filetype_sh,
	filetype_mips_barebox,
	filetype_fat,
	filetype_mbr,
	filetype_bmp,
	filetype_png,
	filetype_qoi,
	filetype_ext,
	filetype_gpt,
	filetype_ubifs,
	filetype_bpk,
	filetype_barebox_env,
	filetype_ch_image,
	filetype_ch_image_be,
	filetype_exe,
	filetype_xz_compressed,
	filetype_mxs_bootstream,
	filetype_socfpga_xload,
	filetype_kwbimage_v0,
	filetype_kwbimage_v1,
	filetype_android_sparse,
	filetype_arm64_linux_image,
	filetype_arm64_efi_linux_image,
	filetype_riscv_linux_image,
	filetype_riscv_efi_linux_image,
	filetype_riscv_barebox_image,
	filetype_elf,
	filetype_imx_image_v1,
	filetype_imx_image_v2,
	filetype_layerscape_image,
	filetype_layerscape_qspi_image,
	filetype_ubootvar,
	filetype_stm32_image_fsbl_v1,
	filetype_stm32_image_ssbl_v1,
	filetype_zynq_image,
	filetype_mxs_sd_image,
	filetype_rockchip_rkns_image,
	filetype_fip,
	filetype_qemu_fw_cfg,
	filetype_nxp_fspi_image,
	filetype_zstd_compressed,
	filetype_max,
};

#define FILE_TYPE_SAFE_BUFSIZE		2048

struct cdev;

const char *file_type_to_string(enum filetype f);
const char *file_type_to_short_string(enum filetype f);
enum filetype file_detect_partition_table(const void *_buf, size_t bufsize);
enum filetype file_detect_type(const void *_buf, size_t bufsize);
int file_name_detect_type(const char *filename, enum filetype *type);
int file_name_detect_type_offset(const char *filename, loff_t pos, enum filetype *type);
int cdev_detect_type(struct cdev *cdev, enum filetype *type);
enum filetype is_fat_or_mbr(const unsigned char *sector, unsigned long *bootsec);
int is_fat_boot_sector(const void *_buf);
bool filetype_is_barebox_image(enum filetype ft);

static inline bool file_is_compressed_file(enum filetype ft)
{
	switch (ft) {
	case filetype_lzo_compressed:
	case filetype_lz4_compressed:
	case filetype_gzip:
	case filetype_bzip2:
	case filetype_xz_compressed:
	case filetype_zstd_compressed:
		return true;
	default:
		return false;
	}
}

#define ARM_HEAD_SIZE			0x30
#define ARM_HEAD_MAGICWORD_OFFSET	0x20
#define ARM_HEAD_SIZE_OFFSET		0x2C

#ifdef CONFIG_ARM
static inline int is_barebox_arm_head(const char *head)
{
	return !strcmp(head + ARM_HEAD_MAGICWORD_OFFSET, "barebox");
}
#else
static inline int is_barebox_arm_head(const char *head)
{
	return 0;
}
#endif

#define MIPS_HEAD_SIZE			0x20
#define MIPS_HEAD_MAGICWORD_OFFSET	0x10
#define MIPS_HEAD_SIZE_OFFSET		0x1C

#ifdef CONFIG_MIPS
static inline int is_barebox_mips_head(const char *head)
{
	return !strncmp(head + MIPS_HEAD_MAGICWORD_OFFSET, "barebox", 7);
}
#else
static inline int is_barebox_mips_head(const char *head)
{
	return 0;
}
#endif

static inline int is_barebox_head(const char *head)
{
	return is_barebox_arm_head(head) || is_barebox_mips_head(head);
}

#endif /* __FILE_TYPE_H */