#ifndef SILO_H
#define SILO_H

#include <asm/openprom.h>
#include <stdarg.h>

#define CMD_LENG 512

struct aout_hdr {
    int magic;
    int ltext;
    int ldata;
    int lbss;
    int lsym;
    int lentry;
    int x1;
    int x2;
};
typedef struct {
    unsigned char info[128];	/* Informative text string */
    unsigned char spare0[14];
    struct sun_info {
	unsigned char spare1;
	unsigned char id;
	unsigned char spare2;
	unsigned char flags;
    } infos[8];
    unsigned char spare1[246];	/* Boot information etc. */
    unsigned short rspeed;	/* Disk rotational speed */
    unsigned short pcylcount;	/* Physical cylinder count */
    unsigned short sparecyl;	/* extra sects per cylinder */
    unsigned char spare2[4];	/* More magic... */
    unsigned short ilfact;	/* Interleave factor */
    unsigned short ncyl;	/* Data cylinder count */
    unsigned short nacyl;	/* Alt. cylinder count */
    unsigned short ntrks;	/* Tracks per cylinder */
    unsigned short nsect;	/* Sectors per track */
    unsigned char spare3[4];	/* Even more magic... */
    struct sun_partition {
	unsigned int start_cylinder;
	unsigned int num_sectors;
    } partitions[8];
    unsigned short magic;	/* Magic number */
    unsigned short csum;	/* Label xor'd checksum */
} sun_partition;

#define SUN_LABEL_MAGIC          0xDABE

enum arch { sun4, sun4c, sun4m, sun4d, sun4e, sun4u, sununknown };

/* console.c */
void dpset (const struct linux_romvec *);
void dpout (const char *, int);
char dpin ();
int nbgetchar (struct linux_romvec *);
/* cmdline.c */
void cmdinit ();
void cmdedit (void (*)(void),int);
extern char cbuff[];
extern char passwdbuff[];
/* disk.c */
extern char bootdevice[];
int diskinit (const struct linux_romvec *);
int read (char *, int, int);
int xmit (char *, int);
int open (char *);
int setdisk (char *);
void close (void);
/* printf.c */
void printf (char *,...);
void vprintf (char *, va_list);
void putchar (char);
/* malloc.c */
void *malloc (int);
void free (void *);
void mark (void **);
void release (void *);
/* file.c */
int load_file (char *, int, char *, char *, char *, int *, int, void (*)(int, char **, char **));
/* misc.c */
void fatal (const char *);
char *get_bootargs (struct linux_romvec *, int);
void show_bootargs (struct linux_romvec *);
void set_bootargs (struct linux_romvec *, char *, char *);
char *v0_device (char *);
enum arch get_architecture(struct linux_romvec *);
unsigned char *find_linux_HdrS (int);
void print_message(char *);
void get_idprom(void);
char *get_syspackage(void);
char *seed_part_into_device (char *device, int part);
/* cfg.c */
int cfg_parse (char *, char *, int);
char *cfg_get_strg (char *, char *);
int cfg_get_flag (char *, char *);
void cfg_print_images (void);
char *cfg_get_default (void);
/* strtol.c */
int strtol (const char *, char **, int);
#define atoi(a) strtol(a,0,10)
/* decompress.c */
int decompress (char *, char *, unsigned char (*)(void), void (*)(void));
/* main.c */
extern struct linux_nodeops *prom_nodeops;
extern int prom_root_node;
extern enum arch architecture;
extern struct linux_romvec *romvec;
/* tree.c */
int prom_getchild (int);
int prom_getsibling (int);
int prom_getproplen (int, char *);
int prom_getproperty (int, char *, char *, int);
int prom_getint (int, char *);
int prom_getintdefault (int, char *, int);
int prom_getbool (int, char *);
void prom_getstring (int, char *, char *, int);
int prom_nodematch (int, char *);
int prom_searchsiblings (int, char *);
char *prom_firstprop (int);
char *prom_nextprop (int, char *);
int prom_node_has_property (int, char *);
int prom_setprop (int, char *, char *, int);
/* ranges.c */
void prom_adjust_regs (struct linux_prom_registers *, int,
		       struct linux_prom_ranges *, int);
void prom_adjust_ranges (struct linux_prom_ranges *, int,
		         struct linux_prom_ranges *, int);
void prom_apply_obio_ranges (struct linux_prom_registers *, int);
/* timer.c */
int init_timer (struct linux_romvec *);
void close_timer (struct linux_romvec *);
int get_ticks (void);
void reset_ticks (void);
/* memory.c */
char *memory_find (int);
struct linux_mlist_v0 *prom_meminit (void);
int sun4c_mapio (unsigned long, unsigned long, int);
void sun4c_unmapio (unsigned long);
/* libc */
char *strdup (const char *);
char *strchr (const char *, char);
char *strrchr (const char *, char);
char *strstr (const char *, const char *);
#endif