summaryrefslogtreecommitdiff
path: root/util/nvmutil/include
diff options
context:
space:
mode:
Diffstat (limited to 'util/nvmutil/include')
-rw-r--r--util/nvmutil/include/common.h236
1 files changed, 91 insertions, 145 deletions
diff --git a/util/nvmutil/include/common.h b/util/nvmutil/include/common.h
index 18f74412..881d602f 100644
--- a/util/nvmutil/include/common.h
+++ b/util/nvmutil/include/common.h
@@ -4,26 +4,37 @@
* Copyright (c) 2022-2026 Leah Rowe <leah@libreboot.org>
*/
-/*
- * TODO: split this per .c file
- */
-
-/* Use this shorthand in cmd helpers. e.g.
- in cmd_setmac function:
- check_cmd(cmd_helper_cat);
-*/
-
#ifndef COMMON_H
#define COMMON_H
-/*
- * system prototypes
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <limits.h>
+
+/* keep SYS_RENAME 1 to
+ * use libc rename()
+ * recommended
+ */
+#ifndef SYS_RENAME
+#define SYS_RENAME 1
+#endif
+
+#define items(x) (sizeof((x)) / sizeof((x)[0]))
+
+/* system prototypes
*/
int fchmod(int fd, mode_t mode);
-/*
- * build config
+/* analog of SSIZE_MAX
+ */
+
+#ifndef X_LONG_MAX
+#define X_LONG_MAX ((long)(~((long)1 << (sizeof(long)*CHAR_BIT-1))))
+#endif
+
+
+/* build config
*/
#ifndef NVMUTIL_H
@@ -71,27 +82,6 @@ int fchmod(int fd, mode_t mode);
#define _FILE_OFFSET_BITS 64
#endif
-/*
- * Older versions of BSD to the early 2000s
- * could compile nvmutil, but pledge was
- * added in the 2010s. Therefore, for extra
- * portability, we will only pledge/unveil
- * on OpenBSD versions that have it.
- */
-
-#if defined(__OpenBSD__) && defined(OpenBSD)
-#if OpenBSD >= 604
-#ifndef NVMUTIL_UNVEIL
-#define NVMUTIL_UNVEIL 1
-#endif
-#endif
-#if OpenBSD >= 509
-#ifndef NVMUTIL_PLEDGE
-#define NVMUTIL_PLEDGE 1
-#endif
-#endif
-#endif
-
#ifndef EXIT_FAILURE
#define EXIT_FAILURE 1
#endif
@@ -132,8 +122,7 @@ int fchmod(int fd, mode_t mode);
#define FD_CLOEXEC 0
#endif
-/*
- * Sizes in bytes:
+/* Sizes in bytes:
*/
#define SIZE_1KB 1024
@@ -144,17 +133,12 @@ int fchmod(int fd, mode_t mode);
#define GBE_BUF_SIZE (SIZE_128KB)
-/*
- * First 128 bytes of a GbE part contains
- * the regular NVM (Non-Volatile-Memory)
- * area. All of these bytes must add up,
- * truncated to 0xBABA.
- *
- * The full GbE region is 4KB, but only
- * the first 128 bytes are used here.
+/* First 128 bytes of gbe.bin is NVM.
+ * Then extended area. All of NVM must
+ * add up to BABA, truncated (LE)
*
- * There is a second 4KB part with the same
- * rules, and it *should* be identical.
+ * First 4KB of each half of the file
+ * contains NVM+extended.
*/
#define GBE_WORK_SIZE (SIZE_8KB)
@@ -164,29 +148,7 @@ int fchmod(int fd, mode_t mode);
#define NVM_WORDS (NVM_SIZE >> 1)
#define NVM_CHECKSUM_WORD (NVM_WORDS - 1)
-/*
- * Portable macro based on BSD nitems.
- * Used to count the number of commands (see below).
- */
-
-#define items(x) (sizeof((x)) / sizeof((x)[0]))
-
-/*
- * GbE files can be 8KB, 16KB or 128KB,
- * but we only need the two 4KB parts
- * from offset zero and offset 64KB in
- * a 128KB file, or zero and 8KB in a 16KB
- * file, or zero and 4KB in an 8KB file.
- *
- * The code will handle this properly.
- */
-
-#ifndef X_LONG_MAX
-#define X_LONG_MAX ((long)(~((long)1 << (sizeof(long)*CHAR_BIT-1))))
-#endif
-
-/*
- * Use these for .argc in command[]:
+/* argc minimum (dispatch)
*/
#define ARGC_3 3
@@ -195,16 +157,11 @@ int fchmod(int fd, mode_t mode);
#define NO_LOOP_EAGAIN 0
#define NO_LOOP_EINTR 0
-/*
- * Used for checking whether.
- * a file is a file via stat().
- *
- * Portable macro for compatibility
- * with older unix e.g. v7 unix (has S_IFREG),
- * 4.2bsd (has S_IFMT) or POSIX (has S_ISREG)
+/* For checking if an fd is a normal file.
+ * Portable for old Unix e.g. v7 (S_IFREG),
+ * 4.2BSD (S_IFMT), POSIX (S_ISREG).
*
- * Fallback works where S_IFREG == 0100000
- * (classic unix bitmask)
+ * IFREG: assumed 0100000 (classic bitmask)
*/
#ifndef S_ISREG
@@ -222,9 +179,7 @@ int fchmod(int fd, mode_t mode);
#define IO_PREAD 2
#define IO_PWRITE 3
-/*
- * Used as indices for command[]
- * MUST be in the same order as entries in command[]
+/* for nvmutil commands
*/
#define CMD_DUMP 0
@@ -244,6 +199,9 @@ int fchmod(int fd, mode_t mode);
#define SKIP_CHECKSUM_WRITE 0
#define CHECKSUM_WRITE 1
+/* command table
+ */
+
struct commands {
unsigned long chk;
char *str;
@@ -256,15 +214,24 @@ struct commands {
int flags; /* e.g. O_RDWR or O_RDONLY */
};
+/* mac address
+ */
+
struct macaddr {
char *str; /* set to rmac, or argv string */
char rmac[18]; /* xx:xx:xx:xx:xx:xx */
unsigned short mac_buf[3];
};
+/* gbe.bin and tmpfile
+ */
+
struct xfile {
int gbe_fd;
+ struct stat gbe_st;
+
int tmp_fd;
+ struct stat tmp_st;
char *tname; /* path of tmp file */
char *fname; /* path of gbe file */
@@ -279,12 +246,6 @@ struct xfile {
int post_rw_checksum[2];
- dev_t gbe_dev;
- ino_t gbe_ino;
-
- dev_t tmp_dev;
- ino_t tmp_ino;
-
off_t gbe_file_size;
off_t gbe_tmp_size;
@@ -298,11 +259,13 @@ struct xfile {
unsigned char pad[GBE_WORK_SIZE]; /* the file that wouldn't die */
};
-/*
+/* Command table, MAC address, files
+ *
* BE CAREFUL when editing this
* to ensure that you also update
* the tables in xstatus()
*/
+
struct xstate {
struct commands cmd[7];
struct macaddr mac;
@@ -313,10 +276,6 @@ struct xstate {
unsigned long i; /* index to cmd[] for current command */
int no_cmd;
- /* store size of a struct here.
- (can be used to copy old state) */
- unsigned long xsize;
-
/* Cat commands set this.
the cat cmd helpers check it */
int cat;
@@ -324,52 +283,47 @@ struct xstate {
+struct xstate *xstatus(int argc, char *argv[]);
-struct xstate *xstatus(void);
-
-/*
- * Sanitize command tables.
+/* Sanitize command tables.
*/
+
void sanitize_command_list(void);
void sanitize_command_index(unsigned long c);
-/*
- * Argument handling (user input)
+/* Argument handling (user input)
*/
+
void set_cmd(int argc, char *argv[]);
void set_cmd_args(int argc, char *argv[]);
unsigned long conv_argv_part_num(const char *part_str);
int xstrxcmp(const char *a, const char *b, unsigned long maxlen);
-/*
- * Prep files for reading
+/* Prep files for reading
*/
+
void open_gbe_file(void);
int lock_file(int fd, int flags);
+int same_file(int fd, struct stat *st_old, int check_size);
void xopen(int *fd, const char *path, int flags, struct stat *st);
-/*
- * Read GbE file and verify
- * checksums.
- *
- * After this, we can run commands.
+/* Read GbE file and verify checksums
*/
+
void copy_gbe(void);
void read_file(void);
void read_checksums(void);
int good_checksum(unsigned long partnum);
-/*
- * Execute user command on GbE data.
- * These are stubs that call helpers.
+/* validate commands
*/
-void run_cmd(void);
+
void check_command_num(unsigned long c);
unsigned char valid_command(unsigned long c);
-/*
- * Helper functions for command: setmac
+/* Helper functions for command: setmac
*/
+
void cmd_helper_setmac(void);
void parse_mac_string(void);
unsigned long xstrxlen(const char *scmp, unsigned long maxlen);
@@ -380,51 +334,49 @@ unsigned short hextonum(char ch_s);
unsigned long rlong(void);
void write_mac_part(unsigned long partnum);
-/*
- * Helper functions for command: dump
+/* Helper functions for command: dump
*/
+
void cmd_helper_dump(void);
void print_mac_from_nvm(unsigned long partnum);
void hexdump(unsigned long partnum);
-/*
- * Helper functions for command: swap
+/* Helper functions for command: swap
*/
+
void cmd_helper_swap(void);
-/*
- * Helper functions for command: copy
+/* Helper functions for command: copy
*/
+
void cmd_helper_copy(void);
-/*
- * Helper functions for commands:
+/* Helper functions for commands:
* cat, cat16 and cat128
*/
+
void cmd_helper_cat(void);
void cmd_helper_cat16(void);
void cmd_helper_cat128(void);
void cat(unsigned long nff);
void cat_buf(unsigned char *b);
+/* Command verification/control
+ */
+
void check_cmd(void (*fn)(void), const char *name);
void cmd_helper_err(void);
-/*
- * After command processing, write
- * the modified GbE file back.
- *
- * These are stub functions: check
- * below for the actual functions.
+/* Write GbE files to disk
*/
+
void write_gbe_file(void);
void set_checksum(unsigned long part);
unsigned short calculated_checksum(unsigned long p);
-/*
- * Helper functions for accessing
- * the NVM area during operation.
+/* NVM read/write
*/
+
unsigned short nvm_word(unsigned long pos16, unsigned long part);
void set_nvm_word(unsigned long pos16,
unsigned long part, unsigned short val16);
@@ -432,23 +384,26 @@ void set_part_modified(unsigned long p);
void check_nvm_bound(unsigned long pos16, unsigned long part);
void check_bin(unsigned long a, const char *a_name);
-/*
- * Helper functions for stub functions
- * that handle GbE file reads/writes.
+/* GbE file read/write
*/
+
void rw_gbe_file_part(unsigned long p, int rw_type,
const char *rw_type_str);
void write_to_gbe_bin(void);
int gbe_mv(void);
void check_written_part(unsigned long p);
void report_io_err_rw(void);
-int fsync_dir(const char *path);
unsigned char *gbe_mem_offset(unsigned long part, const char *f_op);
off_t gbe_file_offset(unsigned long part, const char *f_op);
off_t gbe_x_offset(unsigned long part, const char *f_op,
const char *d_type, off_t nsize, off_t ncmp);
long rw_gbe_file_exact(int fd, unsigned char *mem, unsigned long nrw,
off_t off, int rw_type);
+
+/* Generic read/write
+ */
+
+int fsync_dir(const char *path);
long rw_file_exact(int fd, unsigned char *mem, unsigned long len,
off_t off, int rw_type, int loop_eagain, int loop_eintr,
unsigned long max_retries, int off_reset);
@@ -466,27 +421,21 @@ off_t lseek_loop(int fd, off_t off,
#endif
int try_err(int loop_err, int errval);
-/*
- * Error handling and cleanup
+/* Error handling and cleanup
*/
+
void usage(void);
void err(int nvm_errval, const char *msg, ...);
int exit_cleanup(void);
const char *getnvmprogname(void);
-/*
- * a special kind of hell
+/* Portable libc functions
*/
+
char *new_tmpfile(int *fd, int local, const char *path);
int x_i_mkstemp(char *template);
char *x_c_strrchr(const char *s, int c);
-/* x_i_rename not suitable
- * for atomic writes. kept
- * commentted for use in a
- * library in the future */
-/*
int x_i_rename(const char *src, const char *dst);
-*/
char *x_c_tmpdir(void);
int x_i_close(int fd);
void *x_v_memcpy(void *dst,
@@ -495,9 +444,6 @@ int x_i_memcmp(const void *a,
const void *b, unsigned long n);
int x_i_fsync(int fd);
-
-
-
/* asserts */
/* type asserts */