Home | History | Annotate | Line # | Download | only in intrctl
intrctl_io.c revision 1.3.12.1
      1  1.3.12.1  pgoyette /*	$NetBSD: intrctl_io.c,v 1.3.12.1 2018/06/25 07:26:12 pgoyette Exp $	*/
      2       1.1  knakahar 
      3       1.1  knakahar /*
      4       1.1  knakahar  * Copyright (c) 2015 Internet Initiative Japan Inc.
      5       1.1  knakahar  * All rights reserved.
      6       1.1  knakahar  *
      7       1.1  knakahar  * Redistribution and use in source and binary forms, with or without
      8       1.1  knakahar  * modification, are permitted provided that the following conditions
      9       1.1  knakahar  * are met:
     10       1.1  knakahar  * 1. Redistributions of source code must retain the above copyright
     11       1.1  knakahar  *    notice, this list of conditions and the following disclaimer.
     12       1.1  knakahar  * 2. Redistributions in binary form must reproduce the above copyright
     13       1.1  knakahar  *    notice, this list of conditions and the following disclaimer in the
     14       1.1  knakahar  *    documentation and/or other materials provided with the distribution.
     15       1.1  knakahar  *
     16       1.1  knakahar  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     17       1.1  knakahar  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     18       1.1  knakahar  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     19       1.1  knakahar  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     20       1.1  knakahar  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     21       1.1  knakahar  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     22       1.1  knakahar  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     23       1.1  knakahar  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     24       1.1  knakahar  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     25       1.1  knakahar  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     26       1.1  knakahar  * POSSIBILITY OF SUCH DAMAGE.
     27       1.1  knakahar  */
     28       1.1  knakahar 
     29       1.1  knakahar #include <sys/cdefs.h>
     30  1.3.12.1  pgoyette __RCSID("$NetBSD: intrctl_io.c,v 1.3.12.1 2018/06/25 07:26:12 pgoyette Exp $");
     31       1.1  knakahar 
     32       1.1  knakahar #include <sys/sysctl.h>
     33       1.1  knakahar #include <sys/intrio.h>
     34       1.1  knakahar 
     35       1.1  knakahar #include <errno.h>
     36       1.1  knakahar #include <stdio.h>
     37       1.1  knakahar #include <stdlib.h>
     38       1.1  knakahar 
     39       1.1  knakahar #include "intrctl_io.h"
     40       1.1  knakahar 
     41       1.1  knakahar /*
     42       1.1  knakahar  * To support increasing the number of interrupts (devices are dynamically
     43       1.1  knakahar  * attached), retry sysctl(3) "retry" times.
     44       1.1  knakahar  */
     45       1.1  knakahar void *
     46       1.1  knakahar intrctl_io_alloc(int retry)
     47       1.1  knakahar {
     48       1.1  knakahar 	size_t buf_size;
     49       1.1  knakahar 	int i, error;
     50       1.3  knakahar 	void *buf = NULL;
     51       1.1  knakahar 
     52       1.1  knakahar 	error = sysctlbyname("kern.intr.list", NULL, &buf_size, NULL, 0);
     53       1.1  knakahar 	if (error < 0) {
     54       1.3  knakahar 		goto error;
     55       1.1  knakahar 	}
     56       1.1  knakahar 
     57       1.1  knakahar 	buf = malloc(buf_size);
     58       1.1  knakahar 	if (buf == NULL) {
     59       1.3  knakahar 		goto error;
     60       1.1  knakahar 	}
     61       1.1  knakahar 
     62       1.1  knakahar 	for (i = 0; i < retry; i++) {
     63       1.1  knakahar 		error = sysctlbyname("kern.intr.list", buf, &buf_size, NULL, 0);
     64       1.1  knakahar 		if (error >= 0)
     65       1.1  knakahar 			return buf;
     66       1.2  knakahar 		else if (errno == ENOMEM) {
     67       1.1  knakahar 			void *temp;
     68       1.1  knakahar 
     69       1.1  knakahar 			temp = realloc(buf, buf_size);
     70       1.1  knakahar 			if (temp == NULL) {
     71       1.3  knakahar 				goto error;
     72       1.1  knakahar 			}
     73       1.1  knakahar 			buf = temp;
     74       1.1  knakahar 		} else {
     75       1.3  knakahar 			goto error;
     76       1.1  knakahar 		}
     77       1.1  knakahar 	}
     78       1.3  knakahar error:
     79       1.3  knakahar 	if (buf != NULL)
     80       1.3  knakahar 		free(buf);
     81       1.1  knakahar 	return NULL;
     82       1.1  knakahar }
     83       1.1  knakahar 
     84       1.1  knakahar void
     85       1.1  knakahar intrctl_io_free(void *handle)
     86       1.1  knakahar {
     87       1.1  knakahar 
     88       1.1  knakahar 	free(handle);
     89       1.1  knakahar }
     90       1.1  knakahar 
     91       1.1  knakahar int
     92       1.1  knakahar intrctl_io_ncpus(void *handle)
     93       1.1  knakahar {
     94       1.1  knakahar 	struct intrio_list *list = handle;
     95       1.1  knakahar 
     96       1.1  knakahar 	return list->il_ncpus;
     97       1.1  knakahar }
     98       1.1  knakahar 
     99       1.1  knakahar int
    100       1.1  knakahar intrctl_io_nintrs(void *handle)
    101       1.1  knakahar {
    102       1.1  knakahar 	struct intrio_list *list = handle;
    103       1.1  knakahar 
    104       1.1  knakahar 	return list->il_nintrs;
    105       1.1  knakahar }
    106       1.1  knakahar 
    107       1.1  knakahar struct intrio_list_line *
    108       1.1  knakahar intrctl_io_firstline(void *handle)
    109       1.1  knakahar {
    110       1.1  knakahar 	struct intrio_list *list = handle;
    111  1.3.12.1  pgoyette 	struct intrio_list_line *next;
    112  1.3.12.1  pgoyette 	char *buf_end;
    113       1.1  knakahar 
    114  1.3.12.1  pgoyette 	buf_end = (char *)list + list->il_bufsize;
    115  1.3.12.1  pgoyette 	next = (struct intrio_list_line *)((char *)list + list->il_lineoffset);
    116  1.3.12.1  pgoyette 	if ((char *)next >= buf_end)
    117  1.3.12.1  pgoyette 		return NULL;
    118  1.3.12.1  pgoyette 
    119  1.3.12.1  pgoyette 	return next;
    120       1.1  knakahar }
    121       1.1  knakahar 
    122       1.1  knakahar struct intrio_list_line *
    123       1.1  knakahar intrctl_io_nextline(void *handle, struct intrio_list_line *cur)
    124       1.1  knakahar {
    125       1.1  knakahar 	struct intrio_list *list;
    126       1.1  knakahar 	struct intrio_list_line *next;
    127       1.1  knakahar 	size_t line_size;
    128       1.1  knakahar 	char *buf_end;
    129       1.1  knakahar 
    130       1.1  knakahar 	list = handle;
    131       1.1  knakahar 	buf_end = (char *)list + list->il_bufsize;
    132       1.1  knakahar 
    133       1.1  knakahar 	line_size = list->il_linesize;
    134       1.1  knakahar 	next = (struct intrio_list_line *)((char *)cur + line_size);
    135       1.1  knakahar 	if ((char *)next >= buf_end)
    136       1.1  knakahar 		return NULL;
    137       1.1  knakahar 
    138       1.1  knakahar 	return next;
    139       1.1  knakahar }
    140