The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/boot/common/misc.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
    3  * All rights reserved.
    4  *
    5  * Redistribution and use in source and binary forms, with or without
    6  * modification, are permitted provided that the following conditions
    7  * are met:
    8  * 1. Redistributions of source code must retain the above copyright
    9  *    notice, this list of conditions and the following disclaimer.
   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 
   27 #include <sys/cdefs.h>
   28 __FBSDID("$FreeBSD: releng/8.2/sys/boot/common/misc.c 181278 2008-08-04 06:39:52Z cperciva $");
   29 
   30 #include <string.h>
   31 #include <stand.h>
   32 #include <bootstrap.h>
   33 
   34 /*
   35  * Concatenate the (argc) elements of (argv) into a single string, and return
   36  * a copy of same.
   37  */
   38 char *
   39 unargv(int argc, char *argv[])
   40 {
   41     size_t      hlong;
   42     int         i;
   43     char        *cp;
   44 
   45     for (i = 0, hlong = 0; i < argc; i++)
   46         hlong += strlen(argv[i]) + 2;
   47 
   48     if(hlong == 0)
   49         return(NULL);
   50 
   51     cp = malloc(hlong);
   52     cp[0] = 0;
   53     for (i = 0; i < argc; i++) {
   54         strcat(cp, argv[i]);
   55         if (i < (argc - 1))
   56           strcat(cp, " ");
   57     }
   58           
   59     return(cp);
   60 }
   61 
   62 /*
   63  * Get the length of a string in kernel space
   64  */
   65 size_t
   66 strlenout(vm_offset_t src)
   67 {
   68     char        c;
   69     size_t      len;
   70     
   71     for (len = 0; ; len++) {
   72         archsw.arch_copyout(src++, &c, 1);
   73         if (c == 0)
   74             break;
   75     }
   76     return(len);
   77 }
   78 
   79 /*
   80  * Make a duplicate copy of a string in kernel space
   81  */
   82 char *
   83 strdupout(vm_offset_t str)
   84 {
   85     char        *result, *cp;
   86     
   87     result = malloc(strlenout(str) + 1);
   88     for (cp = result; ;cp++) {
   89         archsw.arch_copyout(str++, cp, 1);
   90         if (*cp == 0)
   91             break;
   92     }
   93     return(result);
   94 }
   95 
   96 /* Zero a region in kernel space. */
   97 void
   98 kern_bzero(vm_offset_t dest, size_t len)
   99 {
  100         char buf[256];
  101         size_t chunk, resid;
  102 
  103         bzero(buf, sizeof(buf));
  104         resid = len;
  105         while (resid > 0) {
  106                 chunk = min(sizeof(buf), resid);
  107                 archsw.arch_copyin(buf, dest, chunk);
  108                 resid -= chunk;
  109                 dest += chunk;
  110         }
  111 }
  112 
  113 /*
  114  * Read the specified part of a file to kernel space.  Unlike regular
  115  * pread, the file pointer is advanced to the end of the read data,
  116  * and it just returns 0 if successful.
  117  */
  118 int
  119 kern_pread(int fd, vm_offset_t dest, size_t len, off_t off)
  120 {
  121         ssize_t nread;
  122 
  123         if (lseek(fd, off, SEEK_SET) == -1) {
  124                 printf("\nlseek failed\n");
  125                 return (-1);
  126         }
  127         nread = archsw.arch_readin(fd, dest, len);
  128         if (nread != len) {
  129                 printf("\nreadin failed\n");
  130                 return (-1);
  131         }
  132         return (0);
  133 }
  134 
  135 /*
  136  * Read the specified part of a file to a malloced buffer.  The file
  137  * pointer is advanced to the end of the read data.
  138  */
  139 void *
  140 alloc_pread(int fd, off_t off, size_t len)
  141 {
  142         void *buf;
  143         ssize_t nread;
  144 
  145         buf = malloc(len);
  146         if (buf == NULL) {
  147                 printf("\nmalloc(%d) failed\n", (int)len);
  148                 return (NULL);
  149         }
  150         if (lseek(fd, off, SEEK_SET) == -1) {
  151                 printf("\nlseek failed\n");
  152                 free(buf);
  153                 return (NULL);
  154         }
  155         nread = read(fd, buf, len);
  156         if (nread != len) {
  157                 printf("\nread failed\n");
  158                 free(buf);
  159                 return (NULL);
  160         }
  161         return (buf);
  162 }
  163 
  164 /*
  165  * Display a region in traditional hexdump format.
  166  */
  167 void
  168 hexdump(caddr_t region, size_t len)
  169 {
  170     caddr_t     line;
  171     int         x, c;
  172     char        lbuf[80];
  173 #define emit(fmt, args...)      {sprintf(lbuf, fmt , ## args); pager_output(lbuf);}
  174 
  175     pager_open();
  176     for (line = region; line < (region + len); line += 16) {
  177         emit("%08lx  ", (long) line);
  178         
  179         for (x = 0; x < 16; x++) {
  180             if ((line + x) < (region + len)) {
  181                 emit("%02x ", *(u_int8_t *)(line + x));
  182             } else {
  183                 emit("-- ");
  184             }
  185             if (x == 7)
  186                 emit(" ");
  187         }
  188         emit(" |");
  189         for (x = 0; x < 16; x++) {
  190             if ((line + x) < (region + len)) {
  191                 c = *(u_int8_t *)(line + x);
  192                 if ((c < ' ') || (c > '~'))     /* !isprint(c) */
  193                     c = '.';
  194                 emit("%c", c);
  195             } else {
  196                 emit(" ");
  197             }
  198         }
  199         emit("|\n");
  200     }
  201     pager_close();
  202 }
  203 
  204 void
  205 dev_cleanup(void)
  206 {
  207     int         i;
  208 
  209     /* Call cleanup routines */
  210     for (i = 0; devsw[i] != NULL; ++i)
  211         if (devsw[i]->dv_cleanup != NULL)
  212             (devsw[i]->dv_cleanup)();
  213 }

Cache object: e77e62ad21a54a0293d7ed043ad0eab7


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.