/* * libsc.h - Standalone support library definitions and prototypes * * Where routines in libsc have POSIX or Standard C counterparts, * the standard syntax and semantics should be used. An exception * to this are the buffered I/O routines. * * $Revision: 1.48 $ */ #ifndef _LIBSC_H #define _LIBSC_H #include #include #include #include #include struct RestartBlock; struct buf; struct cmd_table; struct dmamap; struct gui_obj; struct htp_state; struct pcbm; struct range; struct string_list; struct volume_header; struct in_addr; #ifndef EOF #define EOF (-1) #endif #ifndef NULL #define NULL 0 #endif /* * Memory reference widths */ #define SW_BYTE 1 #define SW_HALFWORD 2 #define SW_WORD 4 #define SW_DOUBLEWORD 8 /* Misc prototypes */ int _argvize(char *, struct string_list *); /* lib/parser.c */ char *expand(char *, int); /* lib/expand.c */ char *makepath(void); /* lib/path.c */ int autoboot(int, char *, char *); /* lib/auto.c */ void backtrace(int); /* ml/btrace.s */ int token(char *, char *); /* cmd/menu_cmd.c */ int efs_install(void); /* fs/efs.c */ int xfs_install(void); /* fs/xfs.c */ void updatetv(void); /* lib/arcs_stubs.c */ extern int sgivers(void); /* lib/privstub.c */ /* Restart Block -- lib/rb.c */ void rbsetbs(int); void rbclrbs(int); /* lib/scsaio.c */ void __close_fds(void); void getack_andexit(void); void panic(char *msg, ...); int isgraphic(ULONG); void close_noncons(void); unsigned long get_tod(void); void prcuroff(ULONG); /* lib/dummyfunc.s (these routines do nothing) */ int preemptchk(void); int dma_mapbp(struct dmamap *, struct buf *, int); void splx(int); int untimeout(toid_t); /* lib/malloc.c */ void _init_malloc (void); void *malloc(size_t); void free(void *); void *realloc (void *, size_t); void *calloc(size_t, size_t); void *kern_calloc(size_t, size_t); void *dmabuf_malloc(size_t); void dmabuf_free(void *); void align_free(void *); void *align_malloc(size_t, uint_t); /* lib/mp.c */ int _get_numcpus(void); void _init_libsc_private(void); /* lib/libasm.s */ void debug(char *); long get_sp(void); long getpc(void); /* lib/inetaddr.c */ struct in_addr inet_makeaddr(int, int); unsigned int inet_network(char *); unsigned int inet_lnaof(struct in_addr); struct in_addr inet_addr(char *); int inet_netof(struct in_addr); char *inet_ntoa(struct in_addr); /* lib/perror.c */ char *arcs_strerror(long); void perror(long, char *); /* lib/invfind.c */ char *inv_findcpu(void); char *fixupname(COMPONENT *); char *inv_findtape(void); COMPONENT *find_type(COMPONENT *, CONFIGTYPE); int count_type(COMPONENT *, CONFIGTYPE); /* Standard I/O */ void _init_ttyputc(void (*)()); extern int getchar(void); extern int getc(ULONG); extern char *fgets(char *, int, ULONG); extern char *gets(char *); extern int putchar(int); extern int putc(int, int); extern int puts(const char *); extern int printf(const char *, ...); extern int vprintf(const char *, /* va_list */ char *); extern int sprintf(char *, const char *, ...); extern void sprintn(char *, __scunsigned_t, int); extern int vsprintf(char *, const char *, /* va_list */ char *); extern int ttyprintf(const char *, ...); extern int vttyprintf(const char *, /* va_list */ char *); extern void cmn_err(int, char *, ...); extern void panic(char *, ...); /* Cute routines for waiting spinner */ extern void start_spinner(int); extern void spinner(void); extern void end_spinner(void); /* Conversion */ extern char * atob(const char *, int *); extern char * atob_ptr(const char *, __psint_t *); extern char * atob_L(const char *, long long *); extern int atoi(const char *); extern void atohex(const char *, int *); extern void atohex_L(const char *, long long *); extern void atohex_ptr(const char *, __psunsigned_t *); extern char * atobu(const char *, unsigned *); extern char * atobu_ptr(const char *, __psunsigned_t *); extern char * atobu_L(const char *, unsigned long long *); extern char * btoa(int); /* Environment */ extern int setenv(char *, char *); extern int _setenv(char *, char *, int); extern int syssetenv(char *, char *); extern char * getenv(const char *); extern char * getpath(COMPONENT *); extern char * getargv(char *); /* String functions */ extern int strcasecmp(const char *, const char *); extern char * strcat(char *, const char *); extern int strcmp(const char *, const char *); extern char * strcpy(char *, const char *); extern size_t strlen(const char *); extern char * strdup (const char *); extern char * strstr(const char *, const char *); extern int strncasecmp(const char *, const char *, size_t); extern int strncmp(const char *, const char *, size_t); extern char * strncpy(char *, const char *, size_t); extern char * strncat(char *, const char *, size_t); extern char * index(const char *, int c); extern char * rindex(const char *, int c); extern unsigned long long int strtoull(const char *, char **, int); /* Memory functions */ extern void bcopy(const void *, void *, size_t); extern int bcmp(const void *, const void *, size_t); extern void bzero(void *, size_t); extern unsigned _cksum1(void *, unsigned, unsigned); extern unsigned nuxi_s(unsigned short); extern unsigned nuxi_l(unsigned); extern void swapl(void *,unsigned); extern void swaps(void *,unsigned); /* Display Functions */ extern void p_offset(int); extern void p_indent(void); extern void p_clear(void); extern void p_cursoff(void); extern void p_curson(void); extern void p_panelmode(void); extern void p_textmode(void); extern void p_printf(const char *,...); extern void p_center(void); extern void p_ljust(void); extern void p_puts(char *); /* EnterInteractiveMode() is used a lot w/o including restart.h */ extern void EnterInteractiveMode(void); /* Miscellaneous */ extern LONG ioctl(ULONG,LONG,LONG); extern int isatty(ULONG); extern int _min(int,int); extern int _max(int,int); extern int getcpuid(void); #undef cpuid extern int cpuid(void); /* for SN0 */ #undef splockspl #undef spunlockspl int splockspl(lock_t, int (*)(void)); void spunlockspl(lock_t, int); /* Misc commands */ int go_cmd(int, char **, char **, struct cmd_table *); /* cmd/go_cmd.c */ int boot(int, char **, char **, struct cmd_table *); /* cmd/boot_cmd.c */ int cat(int, char **, char **, struct cmd_table *); /* cmd/cat_cmd.c */ int copy(int, char **, char **, struct cmd_table *); /* cmd/copy_cmd.c */ int hinv(int, char **, char **, struct cmd_table *); /* cmd/hinv_cmd.c */ int klhinv(int, char **, char **, struct cmd_table *); /* cmd/sn0hinv_cmd.c */ int mfind(int, char **, char **, struct cmd_table *); /* cmd/memdb_cmd.c */ int ls(int, char **, char **, struct cmd_table *); /* cmd/ls_cmd.c */ /* cmd/mrboot_cmd.c */ int mrboot(int, char **, char **, struct cmd_table *); int do_custom_boot(int, char**); /* cmd/env.c */ int printenv_cmd(int, char **, char **, struct cmd_table *); int setenv_cmd(int, char **, char **, struct cmd_table *); int unsetenv_cmd(int, char **, char **, struct cmd_table *); /* cmd/menu_cmd.c */ extern int token(char *, char *); /* Hardware graph/SN0 private vectors */ char *kl_inv_find(void); int kl_hinv(int, char **); int kl_get_num_cpus(void); int sn0_getcpuid(void); /* lib/stdio.c */ extern void showchar(int); extern void setscalable(int); extern int getscalable(void); /* Global variables */ extern char ** environ; extern int Debug; extern int Verbose; /* Structure definitions */ /* * bit field descriptions for printf %r and %R formats * * printf("%r %R", val, reg_descp); * struct reg_desc *reg_descp; * * the %r and %R formats allow formatted print of bit fields. individual * bit fields are described by a struct reg_desc, multiple bit fields within * a single word can be described by multiple reg_desc structures. * %r outputs a string of the format "" * %R outputs a string of the format "0x%x" * * The fields in a reg_desc are: * unsigned rd_mask; An appropriate mask to isolate the bit field * within a word, and'ed with val * * int rd_shift; A shift amount to be done to the isolated * bit field. done before printing the isolate * bit field with rd_format and before searching * for symbolic value names in rd_values * * char *rd_name; If non-null, a bit field name to label any * out from rd_format or searching rd_values. * if neither rd_format or rd_values is non-null * rd_name is printed only if the isolated * bit field is non-null. * * char *rd_format; If non-null, the shifted bit field value * is printed using this format. * * struct reg_values *rd_values; If non-null, a pointer to a table * matching numeric values with symbolic names. * rd_values are searched and the symbolic * value is printed if a match is found, if no * match is found "???" is printed. * */ /* * register values * map between numeric values and symbolic values */ struct reg_values { __scunsigned_t rv_value; char *rv_name; }; /* * register descriptors are used for formatted prints of register values * rd_mask and rd_shift must be defined, other entries may be null */ struct reg_desc { k_machreg_t rd_mask; /* mask to extract field */ int rd_shift; /* shift for extracted value, - >>, + << */ char *rd_name; /* field name */ char *rd_format; /* format to print field */ struct reg_values *rd_values; /* symbolic names of values */ }; /* * libsc's per-processor data. */ typedef union libsc_private_u { struct privdata_s { /* pointers used for buffering in stdio support */ char *fputbp; char *fputbb; int fputbs; int fputcn; int column; char *sprintf_cp; } privdata; char pad[128]; /* any reasonable power of 2 */ } libsc_private_t; extern int stdio_init; extern libsc_private_t *_libsc_private; #define LIBSC_PRIVATE(x) \ (_libsc_private[(stdio_init ? cpuid() : 0)].privdata.x) #endif