#ifndef _BOOTSTRAP_H_
#define _BOOTSTRAP_H_
#include <sys/types.h>
#include <sys/queue.h>
struct devdesc
{
struct devsw *d_dev;
int d_type;
#define DEVT_NONE 0
#define DEVT_DISK 1
#define DEVT_NET 2
#define DEVT_CD 3
};
typedef int (bootblk_cmd_t)(int argc, char *argv[]);
int command_seterr(const char *fmt, ...) __printflike(1, 2);
const char *command_geterr(void);
#define CMD_OK 0
#define CMD_ERROR 1
void interact(void);
int include(const char *filename);
char *backslash(char *str);
int parse(int *argc, char ***argv, char *str);
void bf_init(void);
int bf_run(char *line);
int autoboot(int timeout, char *prompt);
void autoboot_maybe(void);
int getrootmount(char *rootdev);
char *unargv(int argc, char *argv[]);
#if 0
void hexdump(void *region, size_t len);
#endif
size_t strlenout(vaddr_t str);
char *strdupout(vaddr_t str);
void kern_bzero(vaddr_t dest, size_t len);
int kern_pread(int fd, vaddr_t dest, size_t len, off_t off);
void *alloc_pread(int fd, off_t off, size_t len);
int bcache_init(u_int nblks, size_t bsize);
void bcache_flush(void);
int bcache_strategy(void *devdata, int unit, int rw, daddr_t blk,
size_t size, char *buf, size_t *rsize);
char *strdup(const char*);
struct bcache_devdata
{
int (*dv_strategy)(void *devdata, int rw, daddr_t blk, size_t size, char *buf, size_t *rsize);
void *dv_devdata;
};
struct console
{
const char *c_name;
const char *c_desc;
int c_flags;
#define C_PRESENTIN (1<<0)
#define C_PRESENTOUT (1<<1)
#define C_ACTIVEIN (1<<2)
#define C_ACTIVEOUT (1<<3)
void (* c_probe)(struct console *cp);
int (* c_init)(int arg);
void (* c_out)(int c);
int (* c_in)(void);
int (* c_ready)(void);
};
extern struct console *consoles[];
void cons_probe(void);
int ischar(void);
struct pnphandler
{
const char *pp_name;
void (* pp_enumerate)(void);
};
struct pnpident
{
char *id_ident;
STAILQ_ENTRY(pnpident) id_link;
};
struct pnpinfo
{
char *pi_desc;
int pi_revision;
char *pi_module;
int pi_argc;
char **pi_argv;
struct pnphandler *pi_handler;
STAILQ_HEAD(,pnpident) pi_ident;
STAILQ_ENTRY(pnpinfo) pi_link;
};
STAILQ_HEAD(pnpinfo_stql, pnpinfo);
extern struct pnpinfo_stql pnp_devices;
extern struct pnphandler *pnphandlers[];
void pnp_addident(struct pnpinfo *pi, char *ident);
struct pnpinfo *pnp_allocinfo(void);
void pnp_freeinfo(struct pnpinfo *pi);
void pnp_addinfo(struct pnpinfo *pi);
char *pnp_eisaformat(u_int8_t *data);
extern int isapnp_readport;
struct preloaded_file;
struct preloaded_file
{
char *f_name;
char *f_type;
char *f_args;
int f_loader;
vaddr_t f_addr;
size_t f_size;
struct preloaded_file *f_next;
u_long marks[MARK_MAX];
};
struct file_format
{
int (* l_load)(char *filename, u_int64_t dest, struct preloaded_file **result);
int (* l_exec)(struct preloaded_file *mp);
};
extern struct file_format *file_formats[];
extern struct preloaded_file *preloaded_files;
int mod_load(char *name, int argc, char *argv[]);
int mod_loadkld(const char *name, int argc, char *argv[]);
struct preloaded_file *file_alloc(void);
struct preloaded_file *file_findfile(char *name, char *type);
int file_loadkernel(char *filename, int argc, char *argv[]);
void file_discard(struct preloaded_file *fp);
int elf64_loadfile(char *filename, u_int64_t dest, struct preloaded_file **result);
struct bootblk_command
{
const char *c_name;
const char *c_desc;
bootblk_cmd_t *c_fn;
};
int command_help(int argc, char *argv[]) ;
int command_commandlist(int argc, char *argv[]);
int command_show(int argc, char *argv[]);
int command_set(int argc, char *argv[]);
int command_unset(int argc, char *argv[]);
int command_echo(int argc, char *argv[]);
int command_read(int argc, char *argv[]);
int command_more(int argc, char *argv[]);
int command_lsdev(int argc, char *argv[]);
int command_boot(int argc, char *argv[]);
int command_autoboot(int argc, char *argv[]);
int command_load(int argc, char *argv[]);
int command_unload(int argc, char *argv[]);
int command_lskern(int argc, char *argv[]);
int command_include(int argc, char *argv[]);
int command_ls(int argc, char *argv[]);
#define COMMAND_SET(a, b, c, d)
#define COMMON_COMMANDS \
\
{ "help", "detailed help", command_help }, \
{ "?", "list commands", command_commandlist }, \
{ "show", "show variable(s)", command_show }, \
{ "set", "set a variable", command_set }, \
{ "unset", "unset a variable", command_unset }, \
{ "echo", "echo arguments", command_echo }, \
{ "read", "read input from the terminal", command_read }, \
{ "more", "show contents of a file", command_more }, \
{ "lsdev", "list all devices", command_lsdev }, \
\
\
\
\
\
\
\
{ "boot", "boot a file or loaded kernel", command_boot }, \
{ "autoboot", "boot automatically after a delay", command_autoboot }, \
\
\
\
{ "load", "load a kernel", command_load }, \
{ "unload", "unload all modules", command_unload }, \
{ "lskern", "list loaded kernel", command_lskern }, \
\
\
\
{ "include", "read commands from a file", command_include }, \
\
\
\
{ "ls", "list files", command_ls }
extern struct bootblk_command commands[];
struct arch_switch
{
int (*arch_autoload)(void);
int (*arch_getdev)(void **dev, const char *name, const char **path);
ssize_t (*arch_copyin)(const void *src, vaddr_t dest,
const size_t len);
ssize_t (*arch_copyout)(const vaddr_t src, void *dest,
const size_t len);
ssize_t (*arch_readin)(const int fd, vaddr_t dest,
const size_t len);
int (*arch_isainb)(int port);
void (*arch_isaoutb)(int port, int value);
};
extern struct arch_switch archsw;
void delay(int delay);
void dev_cleanup(void);
time_t time(time_t *tloc);
void *calloc(unsigned int, unsigned int);
size_t strspn(const char *s1, const char *s2);
size_t strlen(const char *s);
char *strcpy(char * restrict dst, const char * restrict src);
char *strcat(char * restrict s, const char * restrict append);
extern void pager_open(void);
extern void pager_close(void);
extern int pager_output(const char *lines);
extern int pager_file(const char *fname);
#define EV_DYNAMIC (1<<0)
#define EV_VOLATILE (1<<1)
#define EV_NOHOOK (1<<2)
struct env_var;
typedef char *(ev_format_t)(struct env_var *ev);
typedef int (ev_sethook_t)(struct env_var *ev, int flags,
const void *value);
typedef int (ev_unsethook_t)(struct env_var *ev);
struct env_var
{
char *ev_name;
int ev_flags;
void *ev_value;
ev_sethook_t *ev_sethook;
ev_unsethook_t *ev_unsethook;
struct env_var *ev_next, *ev_prev;
};
extern struct env_var *environ;
extern struct env_var *env_getenv(const char *name);
extern int env_setenv(const char *name, int flags,
const void *value, ev_sethook_t sethook,
ev_unsethook_t unsethook);
extern char *getenv(const char *name);
extern int setenv(const char *name, const char *value,
int overwrite);
extern int putenv(const char *string);
extern int unsetenv(const char *name);
extern ev_sethook_t env_noset;
extern ev_unsethook_t env_nounset;
struct dirent *readdirfd(int);
#define free(ptr) dealloc(ptr, 0)
#ifdef SKIFS
#define FS_READDIR(f, dirptr) skifs_readdir(f, dirptr)
#else
#define FS_READDIR(f, dirptr) efifs_readdir(f, dirptr)
#endif
extern int fgetstr(char *buf, int size, int fd);
extern void ngets(char *, int);
extern long strtol(const char *, char **, int);
extern long strtol(const char *, char **, int);
#define O_RDONLY 0x00000000
#define O_WRONLY 0x00000001
#define O_RDWR 0x00000002
#define O_ACCMODE 0x00000003
#define ELF64_KERNELTYPE "elf kernel"
#endif