You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
148 lines
4.0 KiB
148 lines
4.0 KiB
/*
|
|
* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
#ifndef VBOOT_REFERENCE_FUTILITY_H_
|
|
#define VBOOT_REFERENCE_FUTILITY_H_
|
|
#include <stdint.h>
|
|
|
|
#include "vboot_common.h"
|
|
#include "gbb_header.h"
|
|
#include "host_key.h"
|
|
|
|
/* This program */
|
|
#define MYNAME "futility"
|
|
|
|
/* Version string (autogenerated) */
|
|
extern const char futility_version[];
|
|
|
|
/* Bitfields indicating the struct/format versions supported by a command */
|
|
enum vboot_version {
|
|
/*
|
|
* v1.0 is the original structs used since the dawn of time.
|
|
* v2.0 can verify the firmware in smaller chunks, but there's
|
|
* no difference in the on-device structs, so it's only
|
|
* meaningful for the firmware API. Futility doesn't care.
|
|
*/
|
|
VBOOT_VERSION_1_0 = 0x00000001,
|
|
|
|
/*
|
|
* v2.1 uses new and different structs, and is what v2.0 would have
|
|
* been if someone hadn't started using it before it was ready.
|
|
*/
|
|
VBOOT_VERSION_2_1 = 0x00000002,
|
|
|
|
/*
|
|
* Everything we know about to date.
|
|
*/
|
|
VBOOT_VERSION_ALL = 0x00000003,
|
|
};
|
|
|
|
/* What's our preferred API & data format? */
|
|
enum vboot_version vboot_version;
|
|
|
|
/* Here's a structure to define the commands that futility implements. */
|
|
struct futil_cmd_t {
|
|
const char *const name;
|
|
int (*const handler) (int argc, char **argv);
|
|
enum vboot_version version;
|
|
const char *const shorthelp;
|
|
void (*longhelp) (const char *cmd);
|
|
};
|
|
|
|
/* Macro to define a command */
|
|
#define DECLARE_FUTIL_COMMAND(NAME, HANDLER, VERSION, SHORTHELP, LONGHELP) \
|
|
const struct futil_cmd_t __cmd_##NAME = { \
|
|
.name = #NAME, \
|
|
.handler = HANDLER, \
|
|
.version = VERSION, \
|
|
.shorthelp = SHORTHELP, \
|
|
.longhelp = LONGHELP, \
|
|
}
|
|
|
|
/* This is the list of pointers to all commands. */
|
|
extern const struct futil_cmd_t *const futil_cmds[];
|
|
|
|
/* Size of an array */
|
|
#ifndef ARRAY_SIZE
|
|
#define ARRAY_SIZE(array) (sizeof(array)/sizeof(array[0]))
|
|
#endif
|
|
|
|
/* Test an important condition at compile time, not run time */
|
|
#ifndef BUILD_ASSERT
|
|
#define _BA1_(cond, line) \
|
|
extern int __build_assertion_ ## line[1 - 2*!(cond)] \
|
|
__attribute__ ((unused))
|
|
#define _BA0_(c, x) _BA1_(c, x)
|
|
#define BUILD_ASSERT(cond) _BA0_(cond, __LINE__)
|
|
#endif
|
|
|
|
/* Fatal internal stupidness */
|
|
#ifndef DIE
|
|
#define DIE do { \
|
|
fprintf(stderr, MYNAME ": internal error at %s:%d\n", \
|
|
__FILE__, __LINE__); \
|
|
exit(1); \
|
|
} while (0)
|
|
#endif
|
|
|
|
/* Debug output (off by default) */
|
|
extern int debugging_enabled;
|
|
void Debug(const char *format, ...);
|
|
|
|
/* Returns true if this looks enough like a GBB header to proceed. */
|
|
int futil_looks_like_gbb(GoogleBinaryBlockHeader *gbb, uint32_t len);
|
|
|
|
/*
|
|
* Returns true if the gbb header is valid (and optionally updates *maxlen).
|
|
* This doesn't verify the contents, though.
|
|
*/
|
|
int futil_valid_gbb_header(GoogleBinaryBlockHeader *gbb, uint32_t len,
|
|
uint32_t *maxlen);
|
|
|
|
/* For GBB v1.2 and later, update the hwid_digest */
|
|
void update_hwid_digest(GoogleBinaryBlockHeader *gbb);
|
|
|
|
/* For GBB v1.2 and later, print the stored digest of the HWID (and whether
|
|
* it's correct). Return true if it is correct. */
|
|
int print_hwid_digest(GoogleBinaryBlockHeader *gbb,
|
|
const char *banner, const char *footer);
|
|
|
|
/* Copies a file or dies with an error message */
|
|
void futil_copy_file_or_die(const char *infile, const char *outfile);
|
|
|
|
/* Possible file operation errors */
|
|
enum futil_file_err {
|
|
FILE_ERR_NONE,
|
|
FILE_ERR_STAT,
|
|
FILE_ERR_SIZE,
|
|
FILE_ERR_MMAP,
|
|
FILE_ERR_MSYNC,
|
|
FILE_ERR_MUNMAP,
|
|
FILE_ERR_OPEN,
|
|
FILE_ERR_CLOSE,
|
|
FILE_ERR_DIR,
|
|
FILE_ERR_CHR,
|
|
FILE_ERR_FIFO,
|
|
FILE_ERR_SOCK,
|
|
};
|
|
|
|
/* Wrapper for mmap/munmap. Skips stupidly large files. */
|
|
#define MAP_RO 0
|
|
#define MAP_RW 1
|
|
enum futil_file_err futil_map_file(int fd, int writeable,
|
|
uint8_t **buf, uint32_t *len);
|
|
enum futil_file_err futil_unmap_file(int fd, int writeable,
|
|
uint8_t *buf, uint32_t len);
|
|
|
|
/* The CPU architecture is occasionally important */
|
|
enum arch_t {
|
|
ARCH_UNSPECIFIED,
|
|
ARCH_X86,
|
|
ARCH_ARM,
|
|
ARCH_MIPS
|
|
};
|
|
|
|
#endif /* VBOOT_REFERENCE_FUTILITY_H_ */
|