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/kern/subr_debug.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 /*      $NetBSD: subr_debug.c,v 1.7 2008/04/30 20:20:53 ad Exp $        */
    2 
    3 /*-
    4  * Copyright (c) 2007, 2008 The NetBSD Foundation, Inc.
    5  * All rights reserved.
    6  *
    7  * This code is derived from software contributed to The NetBSD Foundation
    8  * by Andrew Doran.
    9  *
   10  * Redistribution and use in source and binary forms, with or without
   11  * modification, are permitted provided that the following conditions
   12  * are met:
   13  * 1. Redistributions of source code must retain the above copyright
   14  *    notice, this list of conditions and the following disclaimer.
   15  * 2. Redistributions in binary form must reproduce the above copyright
   16  *    notice, this list of conditions and the following disclaimer in the
   17  *    documentation and/or other materials provided with the distribution.
   18  *
   19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
   20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
   23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   29  * POSSIBILITY OF SUCH DAMAGE.
   30  */
   31 
   32 /*
   33  * Shared support code for kernels built with the DEBUG option.
   34  */
   35  
   36 #include <sys/cdefs.h>
   37 __KERNEL_RCSID(0, "$NetBSD: subr_debug.c,v 1.7 2008/04/30 20:20:53 ad Exp $");
   38 
   39 #include "opt_ddb.h"
   40 
   41 #include <sys/param.h>
   42 #include <sys/proc.h>
   43 #include <sys/systm.h>
   44 #include <sys/kmem.h>
   45 #include <sys/debug.h>
   46 #include <sys/atomic.h>
   47 #include <sys/cpu.h>
   48 
   49 #include <uvm/uvm_extern.h>
   50 
   51 #include <machine/lock.h>
   52 
   53 /*
   54  * Allocation/free validation by pointer address.  Introduces
   55  * significant overhead and is not enabled by default.  Patch
   56  * `debug_freecheck' to 1 at boot time to enable.
   57  */
   58 #define FREECHECK_BYTES         (8*1024*1024)
   59 
   60 typedef struct fcitem {
   61         void            *i_addr;
   62         struct fcitem   *i_next;
   63 } fcitem_t;
   64 
   65 fcitem_t                *freecheck_free;
   66 __cpu_simple_lock_t     freecheck_lock;
   67 u_int                   debug_freecheck;
   68 
   69 void
   70 debug_init(void)
   71 {
   72         size_t cnt;
   73         fcitem_t *i;
   74 
   75         __cpu_simple_lock_init(&freecheck_lock);
   76 
   77         if (debug_freecheck) {
   78                 i = (fcitem_t *)uvm_km_alloc(kernel_map, FREECHECK_BYTES, 0,
   79                     UVM_KMF_WIRED);
   80                 if (i == NULL) {
   81                         printf("freecheck_init: unable to allocate memory");
   82                         return;
   83                 }
   84 
   85                 for (cnt = FREECHECK_BYTES / sizeof(*i); cnt != 0; cnt--) {
   86                         i->i_next = freecheck_free;
   87                         freecheck_free = i++;
   88                 }
   89         }
   90 }
   91 
   92 void
   93 freecheck_out(void **head, void *addr)
   94 {
   95         fcitem_t *i;
   96         int s;
   97 
   98         if (!debug_freecheck)
   99                 return;
  100 
  101         s = splvm();
  102         __cpu_simple_lock(&freecheck_lock);
  103         for (i = *head; i != NULL; i = i->i_next) {
  104                 if (i->i_addr != addr)
  105                         continue;
  106                 __cpu_simple_unlock(&freecheck_lock);
  107                 splx(s);
  108                 panic("freecheck_out: %p already out", addr);
  109         }
  110         if ((i = freecheck_free) != NULL) {
  111                 freecheck_free = i->i_next;
  112                 i->i_addr = addr;
  113                 i->i_next = *head;
  114                 *head = i;
  115         }
  116         __cpu_simple_unlock(&freecheck_lock);
  117         splx(s);
  118 
  119         if (i == NULL) {
  120                 if (atomic_swap_uint(&debug_freecheck, 1) == 0)
  121                         printf("freecheck_out: no more slots\n");
  122         }
  123 }
  124 
  125 void
  126 freecheck_in(void **head, void *addr)
  127 {
  128         fcitem_t *i;
  129         void *pp;
  130         int s;
  131 
  132         if (!debug_freecheck)
  133                 return;
  134 
  135         s = splvm();
  136         __cpu_simple_lock(&freecheck_lock);
  137         for (i = *head, pp = head; i != NULL; pp = &i->i_next, i = i->i_next) {
  138                 if (i->i_addr == addr) {
  139                         *(fcitem_t **)pp = i->i_next;
  140                         i->i_next = freecheck_free;
  141                         freecheck_free = i;
  142                         break;
  143                 }
  144         }
  145         __cpu_simple_unlock(&freecheck_lock);
  146         splx(s);
  147 
  148         if (i != NULL)
  149                 return;
  150 
  151 #ifdef DDB
  152         printf("freecheck_in: %p not out\n", addr);
  153         Debugger();
  154 #else
  155         panic("freecheck_in: %p not out", addr);
  156 #endif
  157 }

Cache object: 617884589bc1e28a431397ed06b6b648


[ 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.