Print this page
NEX-16819 loader UEFI support
Includes work by Toomas Soome <tsoome@me.com>
Upstream commits:
    loader: pxe receive cleanup
    9475 libefi: Do not return only if ReceiveFilter
    installboot: should support efi system partition
    8931 boot1.efi: scan all display modes rather than
    loader: spinconsole updates
    loader: gfx experiment to try GOP Blt() function.
    sha1 build test
    loader: add sha1 hash calculation
    common/sha1: update for loader build
    loader: biosdisk rework
    uts: 32-bit kernel FB needs mapping in low memory
    uts: add diag-device
    uts: boot console mirror with diag-device
    uts: enable very early console on ttya
    kmdb: add diag-device as input/output device
    uts: test VGA memory exclusion from mapping
    uts: clear boot mapping and protect boot pages test
    uts: add dboot map debug printf
    uts: need to release FB pages in release_bootstrap()
    uts: add screenmap ioctl
    uts: update sys/queue.h
    loader: add illumos uts/common to include path
    loader: tem/gfx font cleanup
    loader: vbe checks
    uts: gfx_private set KD_TEXT when KD_RESETTEXT is
    uts: gfx 8-bit update
    loader: gfx 8-bit fix
    loader: always set media size from partition.
    uts: MB2 support for 32-bit kernel
    loader: x86 should have tem 80x25
    uts: x86 should have tem 80x25
    uts: font update
    loader: font update
    uts: tem attributes
    loader: tem.c comment added
    uts: use font module
    loader: add font module
    loader: build rules for new font setup
    uts: gfx_private update for new font structure
    uts: early boot update for new font structure
    uts: font update
    uts: font build rules update for new fonts
    uts: tem update to new font structure
    loader: module.c needs to include tem_impl.h
    uts: gfx_private 8x16 font rework
    uts: make font_lookup public
    loader: font rework
    uts: font rework
    9259 libefi: efi_alloc_and_read should check for PMBR
    uts: tem utf-8 support
    loader: implement tem utf-8 support
    loader: tem should be able to display UTF-8
    7784 uts: console input should support utf-8
    7796 uts: ldterm default to utf-8
    uts: do not reset serial console
    uts: set up colors even if tem is not console
    uts: add type for early boot properties
    uts: gfx_private experiment with drm and vga
    uts: gfx_private should use setmode drm callback.
    uts: identify FB types and set up gfx_private based
    loader: replace gop and vesa with framebuffer
    uts: boot needs simple tem to support mdb
    uts: boot_keyboard should emit esc sequences for
    uts: gfx_private FB showuld be written by line
    kmdb: set terminal window size
    uts: gfx_private needs to keep track of early boot FB
    pnglite: move pnglite to usr/src/common
    loader: gfx_fb
    ficl-sys: add gfx primitives
    loader: add illumos.png logo
    ficl: add fb-putimage
    loader: add png support
    loader: add alpha blending for gfx_fb
    loader: use term-drawrect for menu frame
    ficl: add simple gfx words
    uts: provide fb_info via fbgattr dev_specific array.
    uts: gfx_private add alpha blending
    uts: update sys/ascii.h
    uts: tem OSC support (incomplete)
    uts: implement env module support and use data from
    uts: tem get colors from early boot data
    loader: use crc32 from libstand (libz)
    loader: optimize for size
    loader: pass tem info to the environment
    loader: import tem for loader console
    loader: UEFI loader needs to set ISADIR based on
    loader: need UEFI32 support
    8918 loader.efi: add vesa edid support
    uts: tem_safe_pix_clear_prom_output() should only
    uts: tem_safe_pix_clear_entire_screen() should use
    uts: tem_safe_check_first_time() should query cursor
    uts: tem implement cls callback & visual_io v4
    uts: gfx_vgatext use block cursor for vgatext
    uts: gfx_private implement cls callback & visual_io
    uts: gfx_private bitmap framebuffer implementation
    uts: early start frame buffer console support
    uts: font functions should check the input char
    uts: font rendering should support 16/24/32bit depths
    uts: use smallest font as fallback default.
    uts: update terminal dimensions based on selected
    7834 uts: vgatext should use gfx_private
    uts: add spacing property to 8859-1.bdf
    terminfo: add underline for sun-color
    terminfo: sun-color has 16 colors
    uts: add font load callback type
    loader: do not repeat int13 calls with error 0x20 and
    8905 loader: add skein/edonr support
    8904 common/crypto: make skein and edonr loader
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Revert "NEX-16819 loader UEFI support"
This reverts commit ec06b9fc617b99234e538bf2e7e4d02a24993e0c.
Reverting due to failures in the zfs-tests and the sharefs-tests
NEX-16819 loader UEFI support
Includes work by Toomas Soome <tsoome@me.com>
Upstream commits:
    loader: pxe receive cleanup
    9475 libefi: Do not return only if ReceiveFilter
    installboot: should support efi system partition
    8931 boot1.efi: scan all display modes rather than
    loader: spinconsole updates
    loader: gfx experiment to try GOP Blt() function.
    sha1 build test
    loader: add sha1 hash calculation
    common/sha1: update for loader build
    loader: biosdisk rework
    uts: 32-bit kernel FB needs mapping in low memory
    uts: add diag-device
    uts: boot console mirror with diag-device
    uts: enable very early console on ttya
    kmdb: add diag-device as input/output device
    uts: test VGA memory exclusion from mapping
    uts: clear boot mapping and protect boot pages test
    uts: add dboot map debug printf
    uts: need to release FB pages in release_bootstrap()
    uts: add screenmap ioctl
    uts: update sys/queue.h
    loader: add illumos uts/common to include path
    loader: tem/gfx font cleanup
    loader: vbe checks
    uts: gfx_private set KD_TEXT when KD_RESETTEXT is
    uts: gfx 8-bit update
    loader: gfx 8-bit fix
    loader: always set media size from partition.
    uts: MB2 support for 32-bit kernel
    loader: x86 should have tem 80x25
    uts: x86 should have tem 80x25
    uts: font update
    loader: font update
    uts: tem attributes
    loader: tem.c comment added
    uts: use font module
    loader: add font module
    loader: build rules for new font setup
    uts: gfx_private update for new font structure
    uts: early boot update for new font structure
    uts: font update
    uts: font build rules update for new fonts
    uts: tem update to new font structure
    loader: module.c needs to include tem_impl.h
    uts: gfx_private 8x16 font rework
    uts: make font_lookup public
    loader: font rework
    uts: font rework
    libefi: efi_alloc_and_read should check for PMBR
    uts: tem utf-8 support
    loader: implement tem utf-8 support
    loader: tem should be able to display UTF-8
    7784 uts: console input should support utf-8
    7796 uts: ldterm default to utf-8
    uts: do not reset serial console
    uts: set up colors even if tem is not console
    uts: add type for early boot properties
    uts: gfx_private experiment with drm and vga
    uts: gfx_private should use setmode drm callback.
    uts: identify FB types and set up gfx_private based
    loader: replace gop and vesa with framebuffer
    uts: boot needs simple tem to support mdb
    uts: boot_keyboard should emit esc sequences for
    uts: gfx_private FB showuld be written by line
    kmdb: set terminal window size
    uts: gfx_private needs to keep track of early boot FB
    pnglite: move pnglite to usr/src/common
    loader: gfx_fb
    ficl-sys: add gfx primitives
    loader: add illumos.png logo
    ficl: add fb-putimage
    loader: add png support
    loader: add alpha blending for gfx_fb
    loader: use term-drawrect for menu frame
    ficl: add simple gfx words
    uts: provide fb_info via fbgattr dev_specific array.
    uts: gfx_private add alpha blending
    uts: update sys/ascii.h
    uts: tem OSC support (incomplete)
    uts: implement env module support and use data from
    uts: tem get colors from early boot data
    loader: use crc32 from libstand (libz)
    loader: optimize for size
    loader: pass tem info to the environment
    loader: import tem for loader console
    loader: UEFI loader needs to set ISADIR based on
    loader: need UEFI32 support
    8918 loader.efi: add vesa edid support
    uts: tem_safe_pix_clear_prom_output() should only
    uts: tem_safe_pix_clear_entire_screen() should use
    uts: tem_safe_check_first_time() should query cursor
    uts: tem implement cls callback & visual_io v4
    uts: gfx_vgatext use block cursor for vgatext
    uts: gfx_private implement cls callback & visual_io
    uts: gfx_private bitmap framebuffer implementation
    uts: early start frame buffer console support
    uts: font functions should check the input char
    uts: font rendering should support 16/24/32bit depths
    uts: use smallest font as fallback default.
    uts: update terminal dimensions based on selected
    7834 uts: vgatext should use gfx_private
    uts: add spacing property to 8859-1.bdf
    terminfo: add underline for sun-color
    terminfo: sun-color has 16 colors
    uts: add font load callback type
    loader: do not repeat int13 calls with error 0x20 and
    8905 loader: add skein/edonr support
    8904 common/crypto: make skein and edonr loader
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>


  10  * 2. Redistributions in binary form must reproduce the above copyright
  11  *    notice, this list of conditions and the following disclaimer in the
  12  *    documentation and/or other materials provided with the distribution.
  13  *
  14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  24  * SUCH DAMAGE.
  25  *
  26  * $FreeBSD$
  27  * From $NetBSD: stand.h,v 1.22 1997/06/26 19:17:40 drochner Exp $      
  28  */
  29 
  30 /*-
  31  * Copyright (c) 1993
  32  *      The Regents of the University of California.  All rights reserved.
  33  *
  34  * Redistribution and use in source and binary forms, with or without
  35  * modification, are permitted provided that the following conditions
  36  * are met:
  37  * 1. Redistributions of source code must retain the above copyright
  38  *    notice, this list of conditions and the following disclaimer.
  39  * 2. Redistributions in binary form must reproduce the above copyright
  40  *    notice, this list of conditions and the following disclaimer in the
  41  *    documentation and/or other materials provided with the distribution.
  42  * 4. Neither the name of the University nor the names of its contributors
  43  *    may be used to endorse or promote products derived from this software
  44  *    without specific prior written permission.
  45  *
  46  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  47  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  48  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  49  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  50  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL


  87 #define EUNLAB  (ELAST+7)       /* unlabeled disk */
  88 #define EOFFSET (ELAST+8)       /* relative seek not supported */
  89 #define ESALAST (ELAST+8)       /* */
  90 
  91 struct open_file;
  92 
  93 /*
  94  * This structure is used to define file system operations in a file system
  95  * independent way.
  96  *
  97  * XXX note that filesystem providers should export a pointer to their fs_ops
  98  *     struct, so that consumers can reference this and thus include the
  99  *     filesystems that they require.
 100  */
 101 struct fs_ops {
 102     const char  *fs_name;
 103     int         (*fo_open)(const char *path, struct open_file *f);
 104     int         (*fo_close)(struct open_file *f);
 105     int         (*fo_read)(struct open_file *f, void *buf,
 106                            size_t size, size_t *resid);
 107     int         (*fo_write)(struct open_file *f, void *buf,
 108                             size_t size, size_t *resid);
 109     off_t       (*fo_seek)(struct open_file *f, off_t offset, int where);
 110     int         (*fo_stat)(struct open_file *f, struct stat *sb);
 111     int         (*fo_readdir)(struct open_file *f, struct dirent *d);
 112 };
 113 
 114 /*
 115  * libstand-supplied filesystems
 116  */
 117 extern struct fs_ops ufs_fsops;
 118 extern struct fs_ops tftp_fsops;
 119 extern struct fs_ops nfs_fsops;
 120 extern struct fs_ops cd9660_fsops;
 121 extern struct fs_ops nandfs_fsops;
 122 extern struct fs_ops gzipfs_fsops;
 123 extern struct fs_ops bzipfs_fsops;
 124 extern struct fs_ops dosfs_fsops;
 125 extern struct fs_ops ext2fs_fsops;
 126 extern struct fs_ops splitfs_fsops;
 127 extern struct fs_ops pkgfs_fsops;


 265 extern int      asprintf(char **buf, const char *cfmt, ...) __printflike(2, 3);
 266 extern int      sprintf(char *buf, const char *cfmt, ...) __printflike(2, 3);
 267 extern int      snprintf(char *buf, size_t size, const char *cfmt, ...) __printflike(3, 4);
 268 extern void     vsprintf(char *buf, const char *cfmt, __va_list);
 269 extern void     vsnprintf(char *buf, size_t size, const char *cfmt, __va_list);
 270 
 271 extern void     twiddle(u_int callerdiv);
 272 extern void     twiddle_divisor(u_int globaldiv);
 273 
 274 extern void     ngets(char *, int);
 275 #define gets(x) ngets((x), 0)
 276 extern int      fgetstr(char *buf, int size, int fd);
 277 
 278 extern int      open(const char *, int);
 279 #define O_RDONLY        0x0
 280 #define O_WRONLY        0x1
 281 #define O_RDWR          0x2
 282 extern int      close(int);
 283 extern void     closeall(void);
 284 extern ssize_t  read(int, void *, size_t);
 285 extern ssize_t  write(int, void *, size_t);
 286 extern struct   dirent *readdirfd(int);
 287 
 288 extern void     srandom(u_long seed);
 289 extern u_long   random(void);
 290     
 291 /* imports from stdlib, locally modified */
 292 extern long     strtol(const char *, char **, int);
 293 extern unsigned long    strtoul(const char *, char **, int);
 294 extern char     *optarg;                        /* getopt(3) external variables */
 295 extern int      optind, opterr, optopt, optreset;
 296 extern int      getopt(int, char * const [], const char *);
 297 
 298 /* pager.c */
 299 extern void     pager_open(void);
 300 extern void     pager_close(void);
 301 extern int      pager_output(const char *lines);
 302 extern int      pager_file(const char *fname);
 303 
 304 /* No signal state to preserve */
 305 #define setjmp  _setjmp


 352 /* min/max (undocumented) */
 353 static __inline int imax(int a, int b) { return (a > b ? a : b); }
 354 static __inline int imin(int a, int b) { return (a < b ? a : b); }
 355 static __inline long lmax(long a, long b) { return (a > b ? a : b); }
 356 static __inline long lmin(long a, long b) { return (a < b ? a : b); }
 357 static __inline u_int max(u_int a, u_int b) { return (a > b ? a : b); }
 358 static __inline u_int min(u_int a, u_int b) { return (a < b ? a : b); }
 359 static __inline quad_t qmax(quad_t a, quad_t b) { return (a > b ? a : b); }
 360 static __inline quad_t qmin(quad_t a, quad_t b) { return (a < b ? a : b); }
 361 static __inline u_long ulmax(u_long a, u_long b) { return (a > b ? a : b); }
 362 static __inline u_long ulmin(u_long a, u_long b) { return (a < b ? a : b); }
 363 
 364 /* null functions for device/filesystem switches (undocumented) */
 365 extern int      nodev(void);
 366 extern int      noioctl(struct open_file *, u_long, void *);
 367 extern void     nullsys(void);
 368 
 369 extern int      null_open(const char *path, struct open_file *f);
 370 extern int      null_close(struct open_file *f);
 371 extern int      null_read(struct open_file *f, void *buf, size_t size, size_t *resid);
 372 extern int      null_write(struct open_file *f, void *buf, size_t size, size_t *resid);
 373 extern off_t    null_seek(struct open_file *f, off_t offset, int where);
 374 extern int      null_stat(struct open_file *f, struct stat *sb);
 375 extern int      null_readdir(struct open_file *f, struct dirent *d);
 376 
 377 
 378 /* 
 379  * Machine dependent functions and data, must be provided or stubbed by 
 380  * the consumer 
 381  */
 382 extern int              getchar(void);
 383 extern int              ischar(void);
 384 extern void             putchar(int);
 385 extern int              devopen(struct open_file *, const char *, const char **);
 386 extern int              devclose(struct open_file *f);
 387 extern void             panic(const char *, ...) __dead2 __printflike(1, 2);

 388 extern struct fs_ops    *file_system[];
 389 extern struct fs_ops    *exclusive_file_system;
 390 extern struct devsw     *devsw[];
 391 
 392 /*
 393  * Expose byteorder(3) functions.
 394  */
 395 #ifndef _BYTEORDER_PROTOTYPED
 396 #define _BYTEORDER_PROTOTYPED
 397 extern uint32_t         htonl(uint32_t);
 398 extern uint16_t         htons(uint16_t);
 399 extern uint32_t         ntohl(uint32_t);
 400 extern uint16_t         ntohs(uint16_t);
 401 #endif
 402 
 403 #ifndef _BYTEORDER_FUNC_DEFINED
 404 #define _BYTEORDER_FUNC_DEFINED
 405 #define htonl(x)        __htonl(x)
 406 #define htons(x)        __htons(x)
 407 #define ntohl(x)        __ntohl(x)




  10  * 2. Redistributions in binary form must reproduce the above copyright
  11  *    notice, this list of conditions and the following disclaimer in the
  12  *    documentation and/or other materials provided with the distribution.
  13  *
  14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  24  * SUCH DAMAGE.
  25  *
  26  * $FreeBSD$
  27  * From $NetBSD: stand.h,v 1.22 1997/06/26 19:17:40 drochner Exp $      
  28  */
  29 
  30 /*
  31  * Copyright (c) 1993
  32  *      The Regents of the University of California.  All rights reserved.
  33  *
  34  * Redistribution and use in source and binary forms, with or without
  35  * modification, are permitted provided that the following conditions
  36  * are met:
  37  * 1. Redistributions of source code must retain the above copyright
  38  *    notice, this list of conditions and the following disclaimer.
  39  * 2. Redistributions in binary form must reproduce the above copyright
  40  *    notice, this list of conditions and the following disclaimer in the
  41  *    documentation and/or other materials provided with the distribution.
  42  * 4. Neither the name of the University nor the names of its contributors
  43  *    may be used to endorse or promote products derived from this software
  44  *    without specific prior written permission.
  45  *
  46  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  47  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  48  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  49  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  50  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL


  87 #define EUNLAB  (ELAST+7)       /* unlabeled disk */
  88 #define EOFFSET (ELAST+8)       /* relative seek not supported */
  89 #define ESALAST (ELAST+8)       /* */
  90 
  91 struct open_file;
  92 
  93 /*
  94  * This structure is used to define file system operations in a file system
  95  * independent way.
  96  *
  97  * XXX note that filesystem providers should export a pointer to their fs_ops
  98  *     struct, so that consumers can reference this and thus include the
  99  *     filesystems that they require.
 100  */
 101 struct fs_ops {
 102     const char  *fs_name;
 103     int         (*fo_open)(const char *path, struct open_file *f);
 104     int         (*fo_close)(struct open_file *f);
 105     int         (*fo_read)(struct open_file *f, void *buf,
 106                            size_t size, size_t *resid);
 107     int         (*fo_write)(struct open_file *f, const void *buf,
 108                             size_t size, size_t *resid);
 109     off_t       (*fo_seek)(struct open_file *f, off_t offset, int where);
 110     int         (*fo_stat)(struct open_file *f, struct stat *sb);
 111     int         (*fo_readdir)(struct open_file *f, struct dirent *d);
 112 };
 113 
 114 /*
 115  * libstand-supplied filesystems
 116  */
 117 extern struct fs_ops ufs_fsops;
 118 extern struct fs_ops tftp_fsops;
 119 extern struct fs_ops nfs_fsops;
 120 extern struct fs_ops cd9660_fsops;
 121 extern struct fs_ops nandfs_fsops;
 122 extern struct fs_ops gzipfs_fsops;
 123 extern struct fs_ops bzipfs_fsops;
 124 extern struct fs_ops dosfs_fsops;
 125 extern struct fs_ops ext2fs_fsops;
 126 extern struct fs_ops splitfs_fsops;
 127 extern struct fs_ops pkgfs_fsops;


 265 extern int      asprintf(char **buf, const char *cfmt, ...) __printflike(2, 3);
 266 extern int      sprintf(char *buf, const char *cfmt, ...) __printflike(2, 3);
 267 extern int      snprintf(char *buf, size_t size, const char *cfmt, ...) __printflike(3, 4);
 268 extern void     vsprintf(char *buf, const char *cfmt, __va_list);
 269 extern void     vsnprintf(char *buf, size_t size, const char *cfmt, __va_list);
 270 
 271 extern void     twiddle(u_int callerdiv);
 272 extern void     twiddle_divisor(u_int globaldiv);
 273 
 274 extern void     ngets(char *, int);
 275 #define gets(x) ngets((x), 0)
 276 extern int      fgetstr(char *buf, int size, int fd);
 277 
 278 extern int      open(const char *, int);
 279 #define O_RDONLY        0x0
 280 #define O_WRONLY        0x1
 281 #define O_RDWR          0x2
 282 extern int      close(int);
 283 extern void     closeall(void);
 284 extern ssize_t  read(int, void *, size_t);
 285 extern ssize_t  write(int, const void *, size_t);
 286 extern struct   dirent *readdirfd(int);
 287 
 288 extern void     srandom(u_long seed);
 289 extern u_long   random(void);
 290     
 291 /* imports from stdlib, locally modified */
 292 extern long     strtol(const char *, char **, int);
 293 extern unsigned long    strtoul(const char *, char **, int);
 294 extern char     *optarg;                        /* getopt(3) external variables */
 295 extern int      optind, opterr, optopt, optreset;
 296 extern int      getopt(int, char * const [], const char *);
 297 
 298 /* pager.c */
 299 extern void     pager_open(void);
 300 extern void     pager_close(void);
 301 extern int      pager_output(const char *lines);
 302 extern int      pager_file(const char *fname);
 303 
 304 /* No signal state to preserve */
 305 #define setjmp  _setjmp


 352 /* min/max (undocumented) */
 353 static __inline int imax(int a, int b) { return (a > b ? a : b); }
 354 static __inline int imin(int a, int b) { return (a < b ? a : b); }
 355 static __inline long lmax(long a, long b) { return (a > b ? a : b); }
 356 static __inline long lmin(long a, long b) { return (a < b ? a : b); }
 357 static __inline u_int max(u_int a, u_int b) { return (a > b ? a : b); }
 358 static __inline u_int min(u_int a, u_int b) { return (a < b ? a : b); }
 359 static __inline quad_t qmax(quad_t a, quad_t b) { return (a > b ? a : b); }
 360 static __inline quad_t qmin(quad_t a, quad_t b) { return (a < b ? a : b); }
 361 static __inline u_long ulmax(u_long a, u_long b) { return (a > b ? a : b); }
 362 static __inline u_long ulmin(u_long a, u_long b) { return (a < b ? a : b); }
 363 
 364 /* null functions for device/filesystem switches (undocumented) */
 365 extern int      nodev(void);
 366 extern int      noioctl(struct open_file *, u_long, void *);
 367 extern void     nullsys(void);
 368 
 369 extern int      null_open(const char *path, struct open_file *f);
 370 extern int      null_close(struct open_file *f);
 371 extern int      null_read(struct open_file *f, void *buf, size_t size, size_t *resid);
 372 extern int      null_write(struct open_file *f, const void *buf, size_t size, size_t *resid);
 373 extern off_t    null_seek(struct open_file *f, off_t offset, int where);
 374 extern int      null_stat(struct open_file *f, struct stat *sb);
 375 extern int      null_readdir(struct open_file *f, struct dirent *d);
 376 
 377 
 378 /* 
 379  * Machine dependent functions and data, must be provided or stubbed by 
 380  * the consumer 
 381  */
 382 extern int              getchar(void);
 383 extern int              ischar(void);
 384 extern void             putchar(int);
 385 extern int              devopen(struct open_file *, const char *, const char **);
 386 extern int              devclose(struct open_file *f);
 387 extern void             panic(const char *, ...) __dead2 __printflike(1, 2);
 388 extern time_t           getsecs(void);
 389 extern struct fs_ops    *file_system[];
 390 extern struct fs_ops    *exclusive_file_system;
 391 extern struct devsw     *devsw[];
 392 
 393 /*
 394  * Expose byteorder(3) functions.
 395  */
 396 #ifndef _BYTEORDER_PROTOTYPED
 397 #define _BYTEORDER_PROTOTYPED
 398 extern uint32_t         htonl(uint32_t);
 399 extern uint16_t         htons(uint16_t);
 400 extern uint32_t         ntohl(uint32_t);
 401 extern uint16_t         ntohs(uint16_t);
 402 #endif
 403 
 404 #ifndef _BYTEORDER_FUNC_DEFINED
 405 #define _BYTEORDER_FUNC_DEFINED
 406 #define htonl(x)        __htonl(x)
 407 #define htons(x)        __htons(x)
 408 #define ntohl(x)        __ntohl(x)