Commit 22ad69b7 authored by Tom Rini's avatar Tom Rini
Browse files

Merge tag 'dm-pull5nov20' of git://git.denx.de/u-boot-dm

patman status subcommand to collect tags from Patchwork
patman showing email replies from Patchwork
sandbox poweroff command
minor fixes in binman, tests
parents 896cc5aa dc4b2a97
...@@ -140,7 +140,7 @@ jobs: ...@@ -140,7 +140,7 @@ jobs:
export USER=azure export USER=azure
virtualenv -p /usr/bin/python3 /tmp/venv virtualenv -p /usr/bin/python3 /tmp/venv
. /tmp/venv/bin/activate . /tmp/venv/bin/activate
pip install pyelftools pytest pip install pyelftools pytest pygit2
export UBOOT_TRAVIS_BUILD_DIR=/tmp/sandbox_spl export UBOOT_TRAVIS_BUILD_DIR=/tmp/sandbox_spl
export PYTHONPATH=${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc/pylibfdt export PYTHONPATH=${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc/pylibfdt
export PATH=${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc:${PATH} export PATH=${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc:${PATH}
......
...@@ -161,7 +161,7 @@ Run binman, buildman, dtoc, Kconfig and patman testsuites: ...@@ -161,7 +161,7 @@ Run binman, buildman, dtoc, Kconfig and patman testsuites:
export USER=gitlab; export USER=gitlab;
virtualenv -p /usr/bin/python3 /tmp/venv; virtualenv -p /usr/bin/python3 /tmp/venv;
. /tmp/venv/bin/activate; . /tmp/venv/bin/activate;
pip install pyelftools pytest; pip install pyelftools pytest pygit2;
export UBOOT_TRAVIS_BUILD_DIR=/tmp/sandbox_spl; export UBOOT_TRAVIS_BUILD_DIR=/tmp/sandbox_spl;
export PYTHONPATH="${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc/pylibfdt"; export PYTHONPATH="${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc/pylibfdt";
export PATH="${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc:${PATH}"; export PATH="${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc:${PATH}";
......
...@@ -26,6 +26,7 @@ addons: ...@@ -26,6 +26,7 @@ addons:
- python3-sphinx - python3-sphinx
- python3-virtualenv - python3-virtualenv
- python3-pip - python3-pip
- python3-pygit2
- swig - swig
- libpython-dev - libpython-dev
- iasl - iasl
......
...@@ -92,6 +92,7 @@ config SANDBOX ...@@ -92,6 +92,7 @@ config SANDBOX
bool "Sandbox" bool "Sandbox"
select BOARD_LATE_INIT select BOARD_LATE_INIT
select BZIP2 select BZIP2
select CMD_POWEROFF
select DM select DM
select DM_GPIO select DM_GPIO
select DM_I2C select DM_I2C
...@@ -107,7 +108,7 @@ config SANDBOX ...@@ -107,7 +108,7 @@ config SANDBOX
select PCI_ENDPOINT select PCI_ENDPOINT
select SPI select SPI
select SUPPORT_OF_CONTROL select SUPPORT_OF_CONTROL
select SYSRESET_CMD_POWEROFF if CMD_POWEROFF select SYSRESET_CMD_POWEROFF
imply BITREVERSE imply BITREVERSE
select BLOBLIST select BLOBLIST
imply CMD_DM imply CMD_DM
......
...@@ -53,7 +53,7 @@ int sandbox_eth_raw_os_is_local(const char *ifname) ...@@ -53,7 +53,7 @@ int sandbox_eth_raw_os_is_local(const char *ifname)
} }
ret = !!(ifr.ifr_flags & IFF_LOOPBACK); ret = !!(ifr.ifr_flags & IFF_LOOPBACK);
out: out:
close(fd); os_close(fd);
return ret; return ret;
} }
...@@ -220,7 +220,7 @@ int sandbox_eth_raw_os_send(void *packet, int length, ...@@ -220,7 +220,7 @@ int sandbox_eth_raw_os_send(void *packet, int length,
struct sockaddr_in addr; struct sockaddr_in addr;
if (priv->local_bind_sd != -1) if (priv->local_bind_sd != -1)
close(priv->local_bind_sd); os_close(priv->local_bind_sd);
/* A normal UDP socket is required to bind */ /* A normal UDP socket is required to bind */
priv->local_bind_sd = socket(AF_INET, SOCK_DGRAM, 0); priv->local_bind_sd = socket(AF_INET, SOCK_DGRAM, 0);
...@@ -284,11 +284,11 @@ void sandbox_eth_raw_os_stop(struct eth_sandbox_raw_priv *priv) ...@@ -284,11 +284,11 @@ void sandbox_eth_raw_os_stop(struct eth_sandbox_raw_priv *priv)
{ {
free(priv->device); free(priv->device);
priv->device = NULL; priv->device = NULL;
close(priv->sd); os_close(priv->sd);
priv->sd = -1; priv->sd = -1;
if (priv->local) { if (priv->local) {
if (priv->local_bind_sd != -1) if (priv->local_bind_sd != -1)
close(priv->local_bind_sd); os_close(priv->local_bind_sd);
priv->local_bind_sd = -1; priv->local_bind_sd = -1;
priv->local_bind_udp_port = 0; priv->local_bind_udp_port = 0;
} }
......
...@@ -80,13 +80,21 @@ int os_open(const char *pathname, int os_flags) ...@@ -80,13 +80,21 @@ int os_open(const char *pathname, int os_flags)
flags |= O_CREAT; flags |= O_CREAT;
if (os_flags & OS_O_TRUNC) if (os_flags & OS_O_TRUNC)
flags |= O_TRUNC; flags |= O_TRUNC;
/*
* During a cold reset execv() is used to relaunch the U-Boot binary.
* We must ensure that all files are closed in this case.
*/
flags |= O_CLOEXEC;
return open(pathname, flags, 0777); return open(pathname, flags, 0777);
} }
int os_close(int fd) int os_close(int fd)
{ {
return close(fd); /* Do not close the console input */
if (fd)
return close(fd);
return -1;
} }
int os_unlink(const char *pathname) int os_unlink(const char *pathname)
...@@ -814,3 +822,9 @@ void *os_find_text_base(void) ...@@ -814,3 +822,9 @@ void *os_find_text_base(void)
return base; return base;
} }
void os_relaunch(char *argv[])
{
execv(argv[0], argv);
os_exit(1);
}
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include <common.h> #include <common.h>
#include <command.h> #include <command.h>
#include <dm/root.h>
#include <errno.h> #include <errno.h>
#include <init.h> #include <init.h>
#include <os.h> #include <os.h>
...@@ -19,6 +20,8 @@ ...@@ -19,6 +20,8 @@
DECLARE_GLOBAL_DATA_PTR; DECLARE_GLOBAL_DATA_PTR;
static char **os_argv;
/* Compare two options so that they can be sorted into alphabetical order */ /* Compare two options so that they can be sorted into alphabetical order */
static int h_compare_opt(const void *p1, const void *p2) static int h_compare_opt(const void *p1, const void *p2)
{ {
...@@ -403,12 +406,35 @@ void state_show(struct sandbox_state *state) ...@@ -403,12 +406,35 @@ void state_show(struct sandbox_state *state)
printf("\n"); printf("\n");
} }
void sandbox_reset(void)
{
/* Do this here while it still has an effect */
os_fd_restore();
if (state_uninit())
os_exit(2);
if (dm_uninit())
os_exit(2);
/* Restart U-Boot */
os_relaunch(os_argv);
}
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
struct sandbox_state *state; struct sandbox_state *state;
gd_t data; gd_t data;
int ret; int ret;
/*
* Copy argv[] so that we can pass the arguments in the original
* sequence when resetting the sandbox.
*/
os_argv = calloc(argc + 1, sizeof(char *));
if (!os_argv)
os_exit(1);
memcpy(os_argv, argv, sizeof(char *) * (argc + 1));
memset(&data, '\0', sizeof(data)); memset(&data, '\0', sizeof(data));
gd = &data; gd = &data;
gd->arch.text_base = os_find_text_base(); gd->arch.text_base = os_find_text_base();
......
...@@ -358,6 +358,7 @@ void state_reset_for_test(struct sandbox_state *state) ...@@ -358,6 +358,7 @@ void state_reset_for_test(struct sandbox_state *state)
/* No reset yet, so mark it as such. Always allow power reset */ /* No reset yet, so mark it as such. Always allow power reset */
state->last_sysreset = SYSRESET_COUNT; state->last_sysreset = SYSRESET_COUNT;
state->sysreset_allowed[SYSRESET_POWER_OFF] = true; state->sysreset_allowed[SYSRESET_POWER_OFF] = true;
state->sysreset_allowed[SYSRESET_COLD] = true;
state->allow_memio = false; state->allow_memio = false;
memset(&state->wdt, '\0', sizeof(state->wdt)); memset(&state->wdt, '\0', sizeof(state->wdt));
......
...@@ -84,6 +84,16 @@ void sandbox_set_enable_pci_map(int enable); ...@@ -84,6 +84,16 @@ void sandbox_set_enable_pci_map(int enable);
*/ */
int sandbox_read_fdt_from_file(void); int sandbox_read_fdt_from_file(void);
/**
* sandbox_reset() - reset sandbox
*
* This functions implements the cold reboot of the sandbox. It relaunches the
* U-Boot binary with the same command line parameters as the original call.
* The PID of the process stays the same. All file descriptors that have not
* been opened with O_CLOEXEC stay open including stdin, stdout, stderr.
*/
void sandbox_reset(void);
/* Exit sandbox (quit U-Boot) */ /* Exit sandbox (quit U-Boot) */
void sandbox_exit(void); void sandbox_exit(void);
......
...@@ -12,6 +12,7 @@ U-Boot API documentation ...@@ -12,6 +12,7 @@ U-Boot API documentation
linker_lists linker_lists
pinctrl pinctrl
rng rng
sandbox
serial serial
timer timer
unicode unicode
.. SPDX-License-Identifier: GPL-2.0+
Sandbox
=======
The following API routines are used to implement the U-Boot sandbox.
.. kernel-doc:: include/os.h
:internal:
...@@ -47,15 +47,35 @@ static int check_for_keys(struct udevice *dev, struct key_matrix_key *keys, ...@@ -47,15 +47,35 @@ static int check_for_keys(struct udevice *dev, struct key_matrix_key *keys,
struct key_matrix_key *key; struct key_matrix_key *key;
static struct mbkp_keyscan last_scan; static struct mbkp_keyscan last_scan;
static bool last_scan_valid; static bool last_scan_valid;
struct mbkp_keyscan scan; struct ec_response_get_next_event event;
struct mbkp_keyscan *scan = (struct mbkp_keyscan *)
&event.data.key_matrix;
unsigned int row, col, bit, data; unsigned int row, col, bit, data;
int num_keys; int num_keys;
int ret;
if (cros_ec_scan_keyboard(dev->parent, &scan)) { /* Get pending MKBP event. It may not be a key matrix event. */
debug("%s: keyboard scan failed\n", __func__); do {
ret = cros_ec_get_next_event(dev->parent, &event);
/* The EC has no events for us at this time. */
if (ret == -EC_RES_UNAVAILABLE)
return -EIO;
else if (ret)
break;
} while (event.event_type != EC_MKBP_EVENT_KEY_MATRIX);
/* Try the old command if the EC doesn't support the above. */
if (ret == -EC_RES_INVALID_COMMAND) {
if (cros_ec_scan_keyboard(dev->parent, scan)) {
debug("%s: keyboard scan failed\n", __func__);
return -EIO;
}
} else if (ret) {
debug("%s: Error getting next MKBP event. (%d)\n",
__func__, ret);
return -EIO; return -EIO;
} }
*samep = last_scan_valid && !memcmp(&last_scan, &scan, sizeof(scan)); *samep = last_scan_valid && !memcmp(&last_scan, scan, sizeof(*scan));
/* /*
* This is a bit odd. The EC has no way to tell us that it has run * This is a bit odd. The EC has no way to tell us that it has run
...@@ -64,14 +84,14 @@ static int check_for_keys(struct udevice *dev, struct key_matrix_key *keys, ...@@ -64,14 +84,14 @@ static int check_for_keys(struct udevice *dev, struct key_matrix_key *keys,
* that this scan is the same as the last. * that this scan is the same as the last.
*/ */
last_scan_valid = true; last_scan_valid = true;
memcpy(&last_scan, &scan, sizeof(last_scan)); memcpy(&last_scan, scan, sizeof(last_scan));
for (col = num_keys = bit = 0; col < priv->matrix.num_cols; for (col = num_keys = bit = 0; col < priv->matrix.num_cols;
col++) { col++) {
for (row = 0; row < priv->matrix.num_rows; row++) { for (row = 0; row < priv->matrix.num_rows; row++) {
unsigned int mask = 1 << (bit & 7); unsigned int mask = 1 << (bit & 7);
data = scan.data[bit / 8]; data = scan->data[bit / 8];
if ((data & mask) && num_keys < max_count) { if ((data & mask) && num_keys < max_count) {
key = keys + num_keys++; key = keys + num_keys++;
key->row = row; key->row = row;
......
...@@ -415,6 +415,21 @@ int cros_ec_scan_keyboard(struct udevice *dev, struct mbkp_keyscan *scan) ...@@ -415,6 +415,21 @@ int cros_ec_scan_keyboard(struct udevice *dev, struct mbkp_keyscan *scan)
return 0; return 0;
} }
int cros_ec_get_next_event(struct udevice *dev,
struct ec_response_get_next_event *event)
{
int ret;
ret = ec_command(dev, EC_CMD_GET_NEXT_EVENT, 0, NULL, 0,
event, sizeof(*event));
if (ret < 0)
return ret;
else if (ret != sizeof(*event))
return -EC_RES_INVALID_RESPONSE;
return 0;
}
int cros_ec_read_id(struct udevice *dev, char *id, int maxlen) int cros_ec_read_id(struct udevice *dev, char *id, int maxlen)
{ {
struct ec_response_get_version *r; struct ec_response_get_version *r;
......
...@@ -56,6 +56,9 @@ static int sandbox_sysreset_request(struct udevice *dev, enum sysreset_t type) ...@@ -56,6 +56,9 @@ static int sandbox_sysreset_request(struct udevice *dev, enum sysreset_t type)
switch (type) { switch (type) {
case SYSRESET_COLD: case SYSRESET_COLD:
state->last_sysreset = type; state->last_sysreset = type;
if (!state->sysreset_allowed[type])
return -EACCES;
sandbox_reset();
break; break;
case SYSRESET_POWER_OFF: case SYSRESET_POWER_OFF:
state->last_sysreset = type; state->last_sysreset = type;
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
#ifdef CONFIG_BINMAN #ifdef CONFIG_BINMAN
/** /**
* binman_symname() - Internal fnuction to get a binman symbol name * binman_symname() - Internal function to get a binman symbol name
* *
* @entry_name: Name of the entry to look for (e.g. 'u_boot_spl') * @entry_name: Name of the entry to look for (e.g. 'u_boot_spl')
* @_prop_name: Property value to get from that entry (e.g. 'pos') * @_prop_name: Property value to get from that entry (e.g. 'pos')
......
...@@ -82,6 +82,17 @@ int cros_ec_read_id(struct udevice *dev, char *id, int maxlen); ...@@ -82,6 +82,17 @@ int cros_ec_read_id(struct udevice *dev, char *id, int maxlen);
*/ */
int cros_ec_scan_keyboard(struct udevice *dev, struct mbkp_keyscan *scan); int cros_ec_scan_keyboard(struct udevice *dev, struct mbkp_keyscan *scan);
/**
* Get the next pending MKBP event from the ChromeOS EC device.
*
* Send a message requesting the next event and return the result.
*
* @param event Place to put the event.
* @return 0 if ok, <0 on error.
*/
int cros_ec_get_next_event(struct udevice *dev,
struct ec_response_get_next_event *event);
/** /**
* Read which image is currently running on the CROS-EC device. * Read which image is currently running on the CROS-EC device.
* *
......
...@@ -19,30 +19,30 @@ struct sandbox_state; ...@@ -19,30 +19,30 @@ struct sandbox_state;
/** /**
* Access to the OS read() system call * Access to the OS read() system call
* *
* \param fd File descriptor as returned by os_open() * @fd: File descriptor as returned by os_open()
* \param buf Buffer to place data * @buf: Buffer to place data
* \param count Number of bytes to read * @count: Number of bytes to read
* \return number of bytes read, or -1 on error * Return: number of bytes read, or -1 on error
*/ */
ssize_t os_read(int fd, void *buf, size_t count); ssize_t os_read(int fd, void *buf, size_t count);
/** /**
* Access to the OS write() system call * Access to the OS write() system call
* *
* \param fd File descriptor as returned by os_open() * @fd: File descriptor as returned by os_open()
* \param buf Buffer containing data to write * @buf: Buffer containing data to write
* \param count Number of bytes to write * @count: Number of bytes to write
* \return number of bytes written, or -1 on error * Return: number of bytes written, or -1 on error
*/ */
ssize_t os_write(int fd, const void *buf, size_t count); ssize_t os_write(int fd, const void *buf, size_t count);
/** /**
* Access to the OS lseek() system call * Access to the OS lseek() system call
* *
* \param fd File descriptor as returned by os_open() * @fd: File descriptor as returned by os_open()
* \param offset File offset (based on whence) * @offset: File offset (based on whence)
* \param whence Position offset is relative to (see below) * @whence: Position offset is relative to (see below)
* \return new file offset * Return: new file offset
*/ */
off_t os_lseek(int fd, off_t offset, int whence); off_t os_lseek(int fd, off_t offset, int whence);
...@@ -54,9 +54,9 @@ off_t os_lseek(int fd, off_t offset, int whence); ...@@ -54,9 +54,9 @@ off_t os_lseek(int fd, off_t offset, int whence);
/** /**
* Access to the OS open() system call * Access to the OS open() system call
* *
* \param pathname Pathname of file to open * @pathname: Pathname of file to open
* \param flags Flags, like OS_O_RDONLY, OS_O_RDWR * @flags: Flags, like OS_O_RDONLY, OS_O_RDWR
* \return file descriptor, or -1 on error * Return: file descriptor, or -1 on error
*/ */
int os_open(const char *pathname, int flags); int os_open(const char *pathname, int flags);
...@@ -68,42 +68,42 @@ int os_open(const char *pathname, int flags); ...@@ -68,42 +68,42 @@ int os_open(const char *pathname, int flags);
#define OS_O_TRUNC 01000 #define OS_O_TRUNC 01000
/** /**
* Access to the OS close() system call * os_close() - access to the OS close() system call
* *
* \param fd File descriptor to close * @fd: File descriptor to close
* \return 0 on success, -1 on error * Return: 0 on success, -1 on error
*/ */
int os_close(int fd); int os_close(int fd);
/** /**
* Access to the OS unlink() system call * os_unlink() - access to the OS unlink() system call
* *
* \param pathname Path of file to delete * @pathname: Path of file to delete
* \return 0 for success, other for error * Return: 0 for success, other for error
*/ */
int os_unlink(const char *pathname); int os_unlink(const char *pathname);
/** /**
* Access to the OS exit() system call * os_exit() - access to the OS exit() system call
* *
* This exits with the supplied return code, which should be 0 to indicate * This exits with the supplied return code, which should be 0 to indicate
* success. * success.
* *
* @param exit_code exit code for U-Boot * @exit_code: exit code for U-Boot
*/ */
void os_exit(int exit_code) __attribute__((noreturn)); void os_exit(int exit_code) __attribute__((noreturn));
/** /**
* Put tty into raw mode to mimic serial console better * os_tty_raw() - put tty into raw mode to mimic serial console better
* *
* @param fd File descriptor of stdin (normally 0) * @fd: File descriptor of stdin (normally 0)
* @param allow_sigs Allow Ctrl-C, Ctrl-Z to generate signals rather than * @allow_sigs: Allow Ctrl-C, Ctrl-Z to generate signals rather than
* be handled by U-Boot * be handled by U-Boot
*/ */
void os_tty_raw(int fd, bool allow_sigs); void os_tty_raw(int fd, bool allow_sigs);
/** /**
* Restore the tty to its original mode * os_fs_restore() - restore the tty to its original mode
* *
* Call this to restore the original terminal mode, after it has been changed * Call this to restore the original terminal mode, after it has been changed
* by os_tty_raw(). This is an internal function. * by os_tty_raw(). This is an internal function.
...@@ -111,144 +111,180 @@ void os_tty_raw(int fd, bool allow_sigs); ...@@ -111,144 +111,180 @@ void os_tty_raw(int fd, bool allow_sigs);
void os_fd_restore(void); void os_fd_restore(void);
/** /**
* Acquires some memory from the underlying os. * os_malloc() - aquires some memory from the underlying os.
* *
* \param length Number of bytes to be allocated * @length: Number of bytes to be allocated
* \return Pointer to length bytes or NULL on error * Return: Pointer to length bytes or NULL on error
*/ */
void *os_malloc(size_t length); void *os_malloc(size_t length);
/** /**
* Free memory previous allocated with os_malloc() * os_free() - free memory previous allocated with os_malloc()
* *
* This returns the memory to the OS. * This returns the memory to the OS.
* *
* \param ptr Pointer to memory block to free * @ptr: Pointer to memory block to free
*/ */
void os_free(void *ptr); void os_free(void *ptr);
/** /**
* Access to the usleep function of the os * os_usleep() - access to the usleep function of the os
* *
* \param usec Time to sleep in micro seconds * @usec: time to sleep in micro seconds
*/ */
void os_usleep(unsigned long usec); void os_usleep(unsigned long usec);
/** /**
* Gets a monotonic increasing number of nano seconds from the OS * Gets a monotonic increasing number of nano seconds from the OS
* *
* \return A monotonic increasing time scaled in nano seconds * Return: a monotonic increasing time scaled in nano seconds
*/ */
uint64_t os_get_nsec(void); uint64_t os_get_nsec(void);
/** /**
* Parse arguments and update sandbox state. * Parse arguments and update sandbox state.
* *
* @param state Sandbox state to update * @state: sandbox state to update
* @param argc Argument count * @argc: argument count
* @param argv Argument vector * @argv: argument vector
* @return 0 if ok, and program should continue; * Return:
* 1 if ok, but program should stop; * * 0 if ok, and program should continue
* -1 on error: program should terminate. * * 1 if ok, but program should stop
* * -1 on error: program should terminate
*/ */
int os_parse_args(struct sandbox_state *state, int argc, char *argv[]); int os_parse_args(struct sandbox_state *state, int argc, char *argv[]);
/* /*
* enum os_dirent_t - type of directory entry
*
* Types of directory entry that we support. See also os_dirent_typename in * Types of directory entry that we support. See also os_dirent_typename in
* the C file. * the C file.
*/ */
enum os_dirent_t { enum os_dirent_t {
OS_FILET_REG, /* Regular file */ /**
OS_FILET_LNK, /* Symbolic link */ * @OS_FILET_REG: regular file
OS_FILET_DIR, /* Directory */ */
OS_FILET_UNKNOWN, /* Something else */ OS_FILET_REG,
/**
* @OS_FILET_LNK: symbolic link
*/
OS_FILET_LNK,
/**
* @OS_FILET_DIR: directory
*/
OS_FILET_DIR,
/**
* @OS_FILET_UNKNOWN: something else
*/
OS_FILET_UNKNOWN,
/**
* @OS_FILET_COUNT: number of directory entry types
*/
OS_FILET_COUNT, OS_FILET_COUNT,
}; };
/** A directory entry node, containing information about a single dirent */ /**
* struct os_dirent_node - directory node
*
* A directory entry node, containing information about a single dirent
*
*/
struct os_dirent_node { struct os_dirent_node {
struct os_dirent_node *next; /* Pointer to next node, or NULL */ /**
ulong size; /* Size of file in bytes */ * @next: pointer to next node, or NULL
enum os_dirent_t type; /* Type of entry */ */
char name[0]; /* Name of entry */ struct os_dirent_node *next;
/**
* @size: size of file in bytes
*/
ulong size;
/**
* @type: type of entry
*/
enum os_dirent_t type;
/**
* @name: name of entry
*/
char name[0];
}; };
/** /**
* Get a directionry listing * os_dirent_ls() - get a directory listing
* *
* This allocates and returns a linked list containing the directory listing. * This allocates and returns a linked list containing the directory listing.
* *
* @param dirname Directory to examine * @dirname: directory to examine
* @param headp Returns pointer to head of linked list, or NULL if none * @headp: on return pointer to head of linked list, or NULL if none
* @return 0 if ok, -ve on error * Return: 0 if ok, -ve on error
*/ */
int os_dirent_ls(const char *dirname, struct os_dirent_node **headp); int os_dirent_ls(const char *dirname, struct os_dirent_node **headp);
/** /**
* Free directory list * os_dirent_free() - free directory list
* *
* This frees a linked list containing a directory listing. * This frees a linked list containing a directory listing.
* *
* @param node Pointer to head of linked list * @node: pointer to head of linked list
*/ */
void os_dirent_free(struct os_dirent_node *node); void os_dirent_free(struct os_dirent_node *node);
/** /**
* Get the name of a directory entry type * os_dirent_get_typename() - get the name of a directory entry type
* *
* @param type Type to check * @type: type to check
* @return string containing the name of that type, or "???" if none/invalid * Return:
* string containing the name of that type,
* or "???" if none/invalid
*/ */
const char *os_dirent_get_typename(enum os_dirent_t type); const char *os_dirent_get_typename(enum os_dirent_t type);
/** /**
* Get the size of a file * os_get_filesize() - get the size of a file
* *
* @param fname Filename to check * @fname: filename to check
* @param size size of file is returned if no error * @size: size of file is returned if no error
* @return 0 on success or -1 if an error ocurred * Return: 0 on success or -1 if an error ocurred
*/ */
int os_get_filesize(const char *fname, loff_t *size); int os_get_filesize(const char *fname, loff_t *size);
/** /**
* Write a character to the controlling OS terminal * os_putc() - write a character to the controlling OS terminal
* *
* This bypasses the U-Boot console support and writes directly to the OS * This bypasses the U-Boot console support and writes directly to the OS
* stdout file descriptor. * stdout file descriptor.
* *
* @param ch Character to write * @ch: haracter to write
*/ */
void os_putc(int ch); void os_putc(int ch);
/** /**
* Write a string to the controlling OS terminal * os_puts() - write a string to the controlling OS terminal
* *
* This bypasses the U-Boot console support and writes directly to the OS * This bypasses the U-Boot console support and writes directly to the OS
* stdout file descriptor. * stdout file descriptor.
* *
* @param str String to write (note that \n is not appended) * @str: string to write (note that \n is not appended)
*/ */
void os_puts(const char *str); void os_puts(const char *str);
/** /**
* Write the sandbox RAM buffer to a existing file * os_write_ram_buf() - write the sandbox RAM buffer to a existing file
* *
* @param fname Filename to write memory to (simple binary format) * @fname: filename to write memory to (simple binary format)
* @return 0 if OK, -ve on error * Return: 0 if OK, -ve on error
*/ */
int os_write_ram_buf(const char *fname); int os_write_ram_buf(const char *fname);
/** /**
* Read the sandbox RAM buffer from an existing file * os_read_ram_buf() - read the sandbox RAM buffer from an existing file
* *
* @param fname Filename containing memory (simple binary format) * @fname: filename containing memory (simple binary format)
* @return 0 if OK, -ve on error * Return: 0 if OK, -ve on error
*/ */
int os_read_ram_buf(const char *fname); int os_read_ram_buf(const char *fname);
/** /**
* Jump to a new executable image * os_jump_to_image() - jump to a new executable image
* *
* This uses exec() to run a new executable image, after putting it in a * This uses exec() to run a new executable image, after putting it in a
* temporary file. The same arguments and environment are passed to this * temporary file. The same arguments and environment are passed to this
...@@ -261,22 +297,23 @@ int os_read_ram_buf(const char *fname); ...@@ -261,22 +297,23 @@ int os_read_ram_buf(const char *fname);
* have access to this. It also means that the original * have access to this. It also means that the original
* memory filename passed to U-Boot will be left intact. * memory filename passed to U-Boot will be left intact.
* *
* @param dest Buffer containing executable image * @dest: buffer containing executable image
* @param size Size of buffer * @size: size of buffer
* Return: 0 if OK, -ve on error
*/ */
int os_jump_to_image(const void *dest, int size); int os_jump_to_image(const void *dest, int size);
/** /**
* os_find_u_boot() - Determine the path to U-Boot proper * os_find_u_boot() - determine the path to U-Boot proper
* *
* This function is intended to be called from within sandbox SPL. It uses * This function is intended to be called from within sandbox SPL. It uses
* a few heuristics to find U-Boot proper. Normally it is either in the same * a few heuristics to find U-Boot proper. Normally it is either in the same
* directory, or the directory above (since u-boot-spl is normally in an * directory, or the directory above (since u-boot-spl is normally in an
* spl/ subdirectory when built). * spl/ subdirectory when built).
* *
* @fname: Place to put full path to U-Boot * @fname: place to put full path to U-Boot
* @maxlen: Maximum size of @fname * @maxlen: maximum size of @fname
* @return 0 if OK, -NOSPC if the filename is too large, -ENOENT if not found * Return: 0 if OK, -NOSPC if the filename is too large, -ENOENT if not found
*/ */
int os_find_u_boot(char *fname, int maxlen); int os_find_u_boot(char *fname, int maxlen);
...@@ -286,23 +323,23 @@ int os_find_u_boot(char *fname, int maxlen); ...@@ -286,23 +323,23 @@ int os_find_u_boot(char *fname, int maxlen);
* When called from SPL, this runs U-Boot proper. The filename is obtained by * When called from SPL, this runs U-Boot proper. The filename is obtained by
* calling os_find_u_boot(). * calling os_find_u_boot().
* *
* @fname: Full pathname to U-Boot executable * @fname: full pathname to U-Boot executable
* @return 0 if OK, -ve on error * Return: 0 if OK, -ve on error
*/ */
int os_spl_to_uboot(const char *fname); int os_spl_to_uboot(const char *fname);
/** /**
* Read the current system time * os_localtime() - read the current system time
* *
* This reads the current Local Time and places it into the provided * This reads the current Local Time and places it into the provided
* structure. * structure.
* *
* @param rt Place to put system time * @rt: place to put system time
*/ */
void os_localtime(struct rtc_time *rt); void os_localtime(struct rtc_time *rt);
/** /**
* os_abort() - Raise SIGABRT to exit sandbox (e.g. to debugger) * os_abort() - raise SIGABRT to exit sandbox (e.g. to debugger)
*/ */
void os_abort(void); void os_abort(void);
...@@ -313,12 +350,12 @@ void os_abort(void); ...@@ -313,12 +350,12 @@ void os_abort(void);
* *
* @start: Region start * @start: Region start
* @len: Region length in bytes * @len: Region length in bytes
* @return 0 if OK, -1 on error from mprotect() * Return: 0 if OK, -1 on error from mprotect()
*/ */
int os_mprotect_allow(void *start, size_t len); int os_mprotect_allow(void *start, size_t len);
/** /**
* os_write_file() - Write a file to the host filesystem * os_write_file() - write a file to the host filesystem
* *
* This can be useful when debugging for writing data out of sandbox for * This can be useful when debugging for writing data out of sandbox for
* inspection by external tools. * inspection by external tools.
...@@ -326,7 +363,7 @@ int os_mprotect_allow(void *start, size_t len); ...@@ -326,7 +363,7 @@ int os_mprotect_allow(void *start, size_t len);
* @name: File path to write to * @name: File path to write to
* @buf: Data to write * @buf: Data to write
* @size: Size of data to write * @size: Size of data to write
* @return 0 if OK, -ve on error * Return: 0 if OK, -ve on error
*/ */
int os_write_file(const char *name, const void *buf, int size); int os_write_file(const char *name, const void *buf, int size);
...@@ -340,7 +377,7 @@ int os_write_file(const char *name, const void *buf, int size); ...@@ -340,7 +377,7 @@ int os_write_file(const char *name, const void *buf, int size);
* @name: File path to read from * @name: File path to read from
* @bufp: Returns buffer containing data read * @bufp: Returns buffer containing data read
* @sizep: Returns size of data * @sizep: Returns size of data
* @return 0 if OK, -ve on error * Return: 0 if OK, -ve on error
*/ */
int os_read_file(const char *name, void **bufp, int *sizep); int os_read_file(const char *name, void **bufp, int *sizep);
...@@ -351,8 +388,23 @@ int os_read_file(const char *name, void **bufp, int *sizep); ...@@ -351,8 +388,23 @@ int os_read_file(const char *name, void **bufp, int *sizep);
* It can be useful to map the address of functions to the address listed in * It can be useful to map the address of functions to the address listed in
* the u-boot.map file. * the u-boot.map file.
* *
* @return address if found, else NULL * Return: address if found, else NULL
*/ */
void *os_find_text_base(void); void *os_find_text_base(void);
/**
* os_relaunch() - restart the sandbox
*
* This functions is used to implement the cold reboot of the sand box.
* @argv\[0] specifies the binary that is started while the calling process
* stops immediately. If the new binary cannot be started, the process is
* terminated and 1 is set as shell return code.
*
* The PID of the process stays the same. All file descriptors that have not
* been opened with O_CLOEXEC stay open including stdin, stdout, stderr.
*
* @argv: NULL terminated list of command line parameters
*/
void os_relaunch(char *argv[]);
#endif #endif
...@@ -103,7 +103,7 @@ int binman_init(void) ...@@ -103,7 +103,7 @@ int binman_init(void)
return log_msg_ret("first image", -ENOENT); return log_msg_ret("first image", -ENOENT);
binman->image = node; binman->image = node;
} }
binman->rom_offset = ROM_OFFSET_NONE; binman_set_rom_offset(ROM_OFFSET_NONE);
\
return 0; return 0;
} }
...@@ -50,6 +50,15 @@ config UT_LIB_RSA ...@@ -50,6 +50,15 @@ config UT_LIB_RSA
endif endif
config UT_COMPRESSION
bool "Unit test for compression"
depends on UNIT_TEST
depends on CMDLINE && GZIP_COMPRESSED && BZIP2 && LZMA && LZO && LZ4
default y
help
Enables tests for compression and decompression routines for simple
sanity and for buffer overflow conditions.
config UT_LOG config UT_LOG
bool "Unit tests for logging functions" bool "Unit tests for logging functions"
depends on UNIT_TEST depends on UNIT_TEST
......
...@@ -2,11 +2,13 @@ ...@@ -2,11 +2,13 @@
# #
# (C) Copyright 2012 The Chromium Authors # (C) Copyright 2012 The Chromium Authors
ifneq ($(CONFIG_SANDBOX),)
obj-$(CONFIG_$(SPL_)CMDLINE) += bloblist.o obj-$(CONFIG_$(SPL_)CMDLINE) += bloblist.o
endif
obj-$(CONFIG_$(SPL_)CMDLINE) += cmd/ obj-$(CONFIG_$(SPL_)CMDLINE) += cmd/
obj-$(CONFIG_$(SPL_)CMDLINE) += cmd_ut.o obj-$(CONFIG_$(SPL_)CMDLINE) += cmd_ut.o
obj-$(CONFIG_$(SPL_)CMDLINE) += command_ut.o obj-$(CONFIG_$(SPL_)CMDLINE) += command_ut.o
obj-$(CONFIG_$(SPL_)CMDLINE) += compression.o obj-$(CONFIG_$(SPL_)UT_COMPRESSION) += compression.o
obj-y += dm/ obj-y += dm/
obj-$(CONFIG_$(SPL_)CMDLINE) += print_ut.o obj-$(CONFIG_$(SPL_)CMDLINE) += print_ut.o
obj-$(CONFIG_$(SPL_)CMDLINE) += str_ut.o obj-$(CONFIG_$(SPL_)CMDLINE) += str_ut.o
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment