#include <sys/types.h>
#include <sys/queue.h>
#include <sys/linker_set.h>
#include <machine/types.h>
struct stat;
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[]);
#define COMMAND_ERRBUFSZ (256)
extern char *command_errmsg;
extern char command_errbuf[COMMAND_ERRBUFSZ];
extern int CurrentCondition;
#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);
int rel_open(const char *path, char **abspathp, int flags);
char * rel_rootpath(const char *path);
int rel_stat(const char *path, struct stat *st);
int chdir(const char *path);
char *unargv(int argc, char *argv[]);
void hexdump(caddr_t region, size_t len);
size_t strlenout(vm_offset_t str);
char *strdupout(vm_offset_t str);
void kern_bzero(vm_offset_t dest, size_t len);
int kern_pread(int fd, vm_offset_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);
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);
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 file_metadata
{
size_t md_size;
u_int16_t md_type;
struct file_metadata *md_next;
char md_data[1];
};
struct preloaded_file;
struct mod_depend;
struct kernel_module
{
char *m_name;
int m_version;
struct preloaded_file *m_fp;
struct kernel_module *m_next;
};
struct preloaded_file
{
char *f_name;
char *f_type;
char *f_args;
struct file_metadata *f_metadata;
int f_loader;
vm_offset_t f_addr;
size_t f_size;
struct kernel_module *f_modules;
struct preloaded_file *f_next;
};
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, struct mod_depend *verinfo, 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);
struct file_metadata *file_findmetadata(struct preloaded_file *fp, int type);
void file_discard(struct preloaded_file *fp);
void file_addmetadata(struct preloaded_file *fp, int type, size_t size, void *p);
int file_addmodule(struct preloaded_file *fp, char *modname, int version,
struct kernel_module **newmp);
#ifdef __elfN
#define ELF_RELOC_REL 1
#define ELF_RELOC_RELA 2
extern u_int64_t __elfN(relocation_offset);
struct elf_file;
typedef Elf_Addr (symaddr_fn)(struct elf_file *ef, Elf_Size symidx);
int __elfN(loadfile)(char *filename, u_int64_t dest, struct preloaded_file **result);
int __elfN(obj_loadfile)(char *filename, u_int64_t dest,
struct preloaded_file **result);
int __elfN(reloc)(struct elf_file *ef, symaddr_fn *symaddr,
const void *reldata, int reltype, Elf_Addr relbase,
Elf_Addr dataaddr, void *data, size_t len);
#endif
struct bootblk_command
{
const char *c_name;
const char *c_desc;
bootblk_cmd_t *c_fn;
int c_cond;
};
#define COMMAND_SET(tag, key, desc, func) \
static bootblk_cmd_t func; \
static struct bootblk_command _cmd_ ## tag = { key, desc, func, 0 };\
DATA_SET(Xcommand_set, _cmd_ ## tag)
#define COMMAND_SET_COND(tag, key, desc, func) \
static bootblk_cmd_t func; \
static struct bootblk_command _cmd_ ## tag = { key, desc, func, 1 };\
DATA_SET(Xcommand_set, _cmd_ ## tag)
SET_DECLARE(Xcommand_set, struct bootblk_command);
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, vm_offset_t dest,
const size_t len);
ssize_t (*arch_copyout)(const vm_offset_t src, void *dest,
const size_t len);
ssize_t (*arch_readin)(const int fd, vm_offset_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);