Merge ^/head r293036 through r293174.

This commit is contained in:
Dimitry Andric 2016-01-04 20:31:09 +00:00
commit 9b52dc8469
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/projects/clang380-import/; revision=293175
107 changed files with 1640 additions and 1059 deletions

View File

@ -439,12 +439,14 @@ find_command(const char *name, struct cmdentry *entry, int act,
int
find_builtin(const char *name, int *special)
{
const struct builtincmd *bp;
const unsigned char *bp;
size_t len;
for (bp = builtincmd ; bp->name ; bp++) {
if (*bp->name == *name && equal(bp->name, name)) {
*special = bp->special;
return bp->code;
len = strlen(name);
for (bp = builtincmd ; *bp ; bp += 2 + bp[0]) {
if (bp[0] == len && memcmp(bp + 2, name, len) == 0) {
*special = (bp[1] & BUILTIN_SPECIAL) != 0;
return bp[1] & ~BUILTIN_SPECIAL;
}
}
return -1;

View File

@ -62,17 +62,16 @@ echo 'int (*const builtinfunc[])(int, char **) = {'
awk '/^[^#]/ { printf "\t%s,\n", $1}' $temp
echo '};
const struct builtincmd builtincmd[] = {'
const unsigned char builtincmd[] = {'
awk '{ for (i = 2 ; i <= NF ; i++) {
if ($i == "-s") {
spc = 1;
} else {
printf "\t{ \"%s\", %d, %d },\n", $i, NR-1, spc
printf "\t\"\\%03o\\%03o%s\"\n", length($i), (spc ? 128 : 0) + NR-1, $i
spc = 0;
}
}}' $temp
echo ' { NULL, 0, 0 }
};'
echo '};'
exec > builtins.h
cat <<\!
@ -85,14 +84,10 @@ cat <<\!
tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ < $temp |
awk '{ printf "#define %s %d\n", $1, NR-1}'
echo '
struct builtincmd {
const char *name;
int code;
int special;
};
#define BUILTIN_SPECIAL 0x80
extern int (*const builtinfunc[])(int, char **);
extern const struct builtincmd builtincmd[];
extern const unsigned char builtincmd[];
'
awk '{ printf "int %s(int, char **);\n", $1}' $temp
rm -f $temp

View File

@ -94,6 +94,7 @@ FILES+= getopts5.0
FILES+= getopts6.0
FILES+= getopts7.0
FILES+= getopts8.0 getopts8.0.stdout
FILES+= getopts9.0 getopts9.0.stdout
FILES+= hash1.0 hash1.0.stdout
FILES+= hash2.0 hash2.0.stdout
FILES+= hash3.0 hash3.0.stdout

View File

@ -154,6 +154,9 @@ MTREE= BSD.debug.dist BSD.include.dist BSD.root.dist BSD.usr.dist BSD.var.dist
.if ${MK_LIB32} != "no"
MTREE+= BSD.lib32.dist
.endif
.if ${MK_LIBSOFT} != "no"
MTREE+= BSD.libsoft.dist
.endif
.if ${MK_TESTS} != "no"
MTREE+= BSD.tests.dist
.endif
@ -354,6 +357,10 @@ MTREES+= mtree/BSD.groff.dist /usr
MTREES+= mtree/BSD.lib32.dist /usr
MTREES+= mtree/BSD.lib32.dist /usr/lib/debug/usr
.endif
.if ${MK_LIBSOFT} != "no"
MTREES+= mtree/BSD.libsoft.dist /usr
MTREES+= mtree/BSD.libsoft.dist /usr/lib/debug/usr
.endif
.if ${MK_TESTS} != "no"
MTREES+= mtree/BSD.tests.dist ${TESTSBASE}
MTREES+= mtree/BSD.tests.dist /usr/lib/debug/${TESTSBASE}

View File

@ -0,0 +1,14 @@
# $FreeBSD$
#
# Please see the file src/etc/mtree/README before making changes to this file.
#
/set type=dir uname=root gname=wheel mode=0755
.
libsoft
dtrace
..
i18n
..
..
..

View File

@ -6,6 +6,7 @@ FILES= ${_BSD.debug.dist} \
BSD.include.dist \
BSD.root.dist \
${_BSD.lib32.dist} \
${_BSD.libsoft.dist} \
${_BSD.sendmail.dist} \
${_BSD.tests.dist} \
BSD.usr.dist \
@ -20,6 +21,9 @@ _BSD.groff.dist= BSD.groff.dist
.if ${MK_LIB32} != "no"
_BSD.lib32.dist= BSD.lib32.dist
.endif
.if ${MK_LIBSOFT} != "no"
_BSD.libsoft.dist= BSD.libsoft.dist
.endif
.if ${MK_SENDMAIL} != "no"
_BSD.sendmail.dist= BSD.sendmail.dist
.endif

View File

@ -1,119 +1,221 @@
#
# $FreeBSD$
#
# ATOMIC TIME.
# The Coordinated Universal Time (UTC) is the reference time scale derived
# from The "Temps Atomique International" (TAI) calculated by the Bureau
# International des Poids et Mesures (BIPM) using a worldwide network of atomic
# clocks. UTC differs from TAI by an integer number of seconds; it is the basis
# of all activities in the world.
# In the following text, the symbol '#' introduces
# a comment, which continues from that symbol until
# the end of the line. A plain comment line has a
# whitespace character following the comment indicator.
# There are also special comment lines defined below.
# A special comment will always have a non-whitespace
# character in column 2.
#
# A blank line should be ignored.
#
# ASTRONOMICAL TIME (UT1) is the time scale based on the rate of rotation of the earth.
# It is now mainly derived from Very Long Baseline Interferometry (VLBI). The various
# irregular fluctuations progressively detected in the rotation rate of the Earth lead
# in 1972 to the replacement of UT1 by UTC as the reference time scale.
# The following table shows the corrections that must
# be applied to compute International Atomic Time (TAI)
# from the Coordinated Universal Time (UTC) values that
# are transmitted by almost all time services.
#
# The first column shows an epoch as a number of seconds
# since 1900.0 and the second column shows the number of
# seconds that must be added to UTC to compute TAI for
# any timestamp at or after that epoch. The value on
# each line is valid from the indicated initial instant
# until the epoch given on the next one or indefinitely
# into the future if there is no next line.
# (The comment on each line shows the representation of
# the corresponding initial epoch in the usual
# day-month-year format. The epoch always begins at
# 00:00:00 UTC on the indicated day. See Note 5 below.)
#
# Important notes:
#
# LEAP SECOND
# Atomic clocks are more stable than the rate of the earth rotatiob since the later
# undergoes a full range of geophysical perturbations at various time scales (lunisolar
# and core-mantle torques,atmospheric and oceanic effetcs, ...)
# Leap seconds are needed to keep the two time scales in agreement, i.e. UT1-UTC smaller
# than 0.9 second. So, when necessary a "leap second" is introduced in UTC.
# Since the adoption of this system in 1972 it has been necessary to add 26 seconds to UTC,
# firstly due to the initial choice of the value of the second (1/86400 mean solar day of
# the year 1820) and secondly to the general slowing down of the Earth's rotation. It is
# theorically possible to have a negative leap second (a second removed from UTC), but so far,
# all leap seconds have been positive (a second has been added to UTC). Based on what we know about the earth's rotation,
# it is unlikely that we will ever have a negative leap second.
# 1. Coordinated Universal Time (UTC) is often referred to
# as Greenwich Mean Time (GMT). The GMT time scale is no
# longer used, and the use of GMT to designate UTC is
# discouraged.
#
# 2. The UTC time scale is realized by many national
# laboratories and timing centers. Each laboratory
# identifies its realization with its name: Thus
# UTC(NIST), UTC(USNO), etc. The differences among
# these different realizations are typically on the
# order of a few nanoseconds (i.e., 0.000 000 00x s)
# and can be ignored for many purposes. These differences
# are tabulated in Circular T, which is published monthly
# by the International Bureau of Weights and Measures
# (BIPM). See www.bipm.fr for more information.
#
# HISTORY
# The first leap second was added on June 30, 1972. Until 2000, it was necessary in average to add a leap second at a rate
# of 1 to 2 years. Since 2000, due to the fact that the earth rate of rotation is accelerating, leap seconds are introduced
# with an average frequency of 3 to 4 years.
# 3. The current defintion of the relationship between UTC
# and TAI dates from 1 January 1972. A number of different
# time scales were in use before than epoch, and it can be
# quite difficult to compute precise timestamps and time
# intervals in those "prehistoric" days. For more information,
# consult:
#
# The Explanatory Supplement to the Astronomical
# Ephemeris.
# or
# Terry Quinn, "The BIPM and the Accurate Measurement
# of Time," Proc. of the IEEE, Vol. 79, pp. 894-905,
# July, 1991.
#
# RESPONSABILITY OF THE DECISION TO INTRODUCE A LEAP SECOND IN UTC
# The decision to introduce a leap second in UTC is the responsibility of the Earth Orientation Center of
# the International Earth Rotation and reference System Service (IERS). This center is located at Paris
# Observatory. According to international agreements, leap second date have to occur at fixed date :
# first preference is given to the end of December and June, and second preference at the end of March
# and September. Since the system was introduced in 1972, only dates in June and December were used.
# 4. The insertion of leap seconds into UTC is currently the
# responsibility of the International Earth Rotation Service,
# which is located at the Paris Observatory:
#
# Questions or comments to:
# Daniel Gambis, daniel.gambis@obspm.fr
# Christian Bizouard: christian.bizouard@obspm.fr
# Earth orientation Center of the IERS
# Paris Observatory, France
#
# Central Bureau of IERS
# 61, Avenue de l'Observatoire
# 75014 Paris, France.
#
# Leap seconds are announced by the IERS in its Bulletin C
#
# VALIDITY OF THE FILE
# It is important to express the validity of the file. These next two dates are
# given in units of seconds since 1900.0.
# See hpiers.obspm.fr or www.iers.org for more details.
#
# 1) Last update of the file.
# All national laboratories and timing centers use the
# data from the BIPM and the IERS to construct their
# local realizations of UTC.
#
# Updated through IERS Bulletin C (ftp://hpiers.obspm.fr/iers/bul/bulc/bulletinc.dat)
# Although the definition also includes the possibility
# of dropping seconds ("negative" leap seconds), this has
# never been done and is unlikely to be necessary in the
# foreseeable future.
#
# The following line shows the last update of this file in NTP timestamp:
# 5. If your system keeps time as the number of seconds since
# some epoch (e.g., NTP timestamps), then the algorithm for
# assigning a UTC time stamp to an event that happens during a positive
# leap second is not well defined. The official name of that leap
# second is 23:59:60, but there is no way of representing that time
# in these systems.
# Many systems of this type effectively stop the system clock for
# one second during the leap second and use a time that is equivalent
# to 23:59:59 UTC twice. For these systems, the corresponding TAI
# timestamp would be obtained by advancing to the next entry in the
# following table when the time equivalent to 23:59:59 UTC
# is used for the second time. Thus the leap second which
# occurred on 30 June 1972 at 23:59:59 UTC would have TAI
# timestamps computed as follows:
#
#$ 3645216000
#
# 2) Expiration date of the file given on a semi-annual basis: last June or last December
# ...
# 30 June 1972 23:59:59 (2287785599, first time): TAI= UTC + 10 seconds
# 30 June 1972 23:59:60 (2287785599,second time): TAI= UTC + 11 seconds
# 1 July 1972 00:00:00 (2287785600) TAI= UTC + 11 seconds
# ...
#
# File expires on 28 December 2015
# If your system realizes the leap second by repeating 00:00:00 UTC twice
# (this is possible but not usual), then the advance to the next entry
# in the table must occur the second time that a time equivlent to
# 00:00:00 UTC is used. Thus, using the same example as above:
#
# Expire date in NTP timestamp:
# ...
# 30 June 1972 23:59:59 (2287785599): TAI= UTC + 10 seconds
# 30 June 1972 23:59:60 (2287785600, first time): TAI= UTC + 10 seconds
# 1 July 1972 00:00:00 (2287785600,second time): TAI= UTC + 11 seconds
# ...
#
#@ 3660249600
# in both cases the use of timestamps based on TAI produces a smooth
# time scale with no discontinuity in the time interval.
#
# This complexity would not be needed for negative leap seconds (if they
# are ever used). The UTC time would skip 23:59:59 and advance from
# 23:59:58 to 00:00:00 in that case. The TAI offset would decrease by
# 1 second at the same instant. This is a much easier situation to deal
# with, since the difficulty of unambiguously representing the epoch
# during the leap second does not arise.
#
# LIST OF LEAP SECONDS
# NTP timestamp (X parameter) is the number of seconds since 1900.0
# Questions or comments to:
# Jeff Prillaman
# Time Service Department
# US Naval Observatory
# Washington, DC
# jeffrey.prillaman@usno.navy.mil
#
# MJD: The Modified Julian Day number. MJD = X/86400 + 15020
# Last Update of leap second values: 31 Dec 2015
#
# DTAI: The difference DTAI= TAI-UTC in units of seconds
# It is the quantity to add to UTC to get the time in TAI
# The following line shows this last update date in NTP timestamp
# format. This is the date on which the most recent change to
# the leap second data was added to the file. This line can
# be identified by the unique pair of characters in the first two
# columns as shown below.
#
# Day Month Year : epoch in clear
#$ 3660508800
#
#NTP Time DTAI Day Month Year
# The data in this file will be updated periodically as new leap
# seconds are announced. In addition to being entered on the line
# above, the update time (in NTP format) will be added to the basic
# file name leap-seconds to form the name leap-seconds.<NTP TIME>.
# In addition, the generic name leap-seconds.list will always point to
# the most recent version of the file.
#
2272060800 10 # 1 Jan 1972
2287785600 11 # 1 Jul 1972
2303683200 12 # 1 Jan 1973
2335219200 13 # 1 Jan 1974
2366755200 14 # 1 Jan 1975
2398291200 15 # 1 Jan 1976
2429913600 16 # 1 Jan 1977
2461449600 17 # 1 Jan 1978
2492985600 18 # 1 Jan 1979
2524521600 19 # 1 Jan 1980
2571782400 20 # 1 Jul 1981
2603318400 21 # 1 Jul 1982
2634854400 22 # 1 Jul 1983
2698012800 23 # 1 Jul 1985
2776982400 24 # 1 Jan 1988
2840140800 25 # 1 Jan 1990
2871676800 26 # 1 Jan 1991
2918937600 27 # 1 Jul 1992
2950473600 28 # 1 Jul 1993
2982009600 29 # 1 Jul 1994
3029443200 30 # 1 Jan 1996
3076704000 31 # 1 Jul 1997
3124137600 32 # 1 Jan 1999
3345062400 33 # 1 Jan 2006
3439756800 34 # 1 Jan 2009
3550089600 35 # 1 Jul 2012
3644697600 36 # 1 Jul 2015
# This update procedure will be performed only when a new leap second
# is announced.
#
# In order to verify the integrity of this file, a hash code
# has been generated. For more information how to use
# this hash code, please consult the README file under the
# 'sha' repertory.
# The following entry specifies the expiration date of the data
# in this file in units of seconds since 1900.0. This expiration date
# will be changed at least twice per year whether or not a new leap
# second is announced. These semi-annual changes will be made no
# later than 1 June and 1 December of each year to indicate what
# action (if any) is to be taken on 30 June and 31 December,
# respectively. (These are the customary effective dates for new
# leap seconds.) This expiration date will be identified by a
# unique pair of characters in columns 1 and 2 as shown below.
# In the unlikely event that a leap second is announced with an
# effective date other than 30 June or 31 December, then this
# file will be edited to include that leap second as soon as it is
# announced or at least one month before the effective date
# (whichever is later).
# If an announcement by the IERS specifies that no leap second is
# scheduled, then only the expiration date of the file will
# be advanced to show that the information in the file is still
# current -- the update time stamp, the data and the name of the file
# will not change.
#
# Updated through IERS Bulletin C 50
# File expires on: 1 Jun 2016
#
#@ 3673728000
#
2272060800 10 # 1 Jan 1972
2287785600 11 # 1 Jul 1972
2303683200 12 # 1 Jan 1973
2335219200 13 # 1 Jan 1974
2366755200 14 # 1 Jan 1975
2398291200 15 # 1 Jan 1976
2429913600 16 # 1 Jan 1977
2461449600 17 # 1 Jan 1978
2492985600 18 # 1 Jan 1979
2524521600 19 # 1 Jan 1980
2571782400 20 # 1 Jul 1981
2603318400 21 # 1 Jul 1982
2634854400 22 # 1 Jul 1983
2698012800 23 # 1 Jul 1985
2776982400 24 # 1 Jan 1988
2840140800 25 # 1 Jan 1990
2871676800 26 # 1 Jan 1991
2918937600 27 # 1 Jul 1992
2950473600 28 # 1 Jul 1993
2982009600 29 # 1 Jul 1994
3029443200 30 # 1 Jan 1996
3076704000 31 # 1 Jul 1997
3124137600 32 # 1 Jan 1999
3345062400 33 # 1 Jan 2006
3439756800 34 # 1 Jan 2009
3550089600 35 # 1 Jul 2012
3644697600 36 # 1 Jul 2015
#
# the following special comment contains the
# hash value of the data in this file computed
# use the secure hash algorithm as specified
# by FIPS 180-1. See the files in ~/sha for
# the details of how this hash value is
# computed. Note that the hash computation
# ignores comments and whitespace characters
# in data lines. It includes the NTP values
# of both the last modification time and the
# expiration time of the file, but not the
# white space on those lines.
# the hash line is also ignored in the
# computation.
#
#h 44a44c49 35b22601 a9c7054c 8c56cf57 9b6f6ed5
#
#h 620ba8af 37900668 95ac09ba d77640f9 6fd75493

7
etc/rc
View File

@ -131,11 +131,14 @@ done
# Remove the firstboot sentinel, and reboot if it was requested.
if [ -e ${firstboot_sentinel} ]; then
rm ${firstboot_sentinel}
[ ${root_rw_mount} = "yes" ] || mount -uw /
/bin/rm ${firstboot_sentinel}
if [ -e ${firstboot_sentinel}-reboot ]; then
rm ${firstboot_sentinel}-reboot
/bin/rm ${firstboot_sentinel}-reboot
[ ${root_rw_mount} = "yes" ] || mount -ur /
kill -INT 1
fi
[ ${root_rw_mount} = "yes" ] || mount -ur /
fi
echo ''

View File

@ -32,15 +32,25 @@
OM_uint32
gss_release_oid_set(OM_uint32 *minor_status,
gss_OID_set *set)
gss_OID_set *setp)
{
gss_OID_set set;
gss_OID o;
size_t i;
*minor_status = 0;
if (set && *set) {
if ((*set)->elements)
free((*set)->elements);
free(*set);
*set = GSS_C_NO_OID_SET;
if (setp) {
set = *setp;
if (set) {
for (i = 0; i < set->count; i++) {
o = &set->elements[i];
if (o->elements)
free(o->elements);
}
free(set->elements);
free(set);
*setp = GSS_C_NO_OID_SET;
}
}
return (GSS_S_COMPLETE);
}

View File

@ -27,6 +27,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <sys/types.h>
#include <sys/dnv.h>
#include <sys/nv.h>

View File

@ -27,8 +27,9 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <sys/nv.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/nv.h>
#include <sys/socket.h>
#include <atf-c++.hpp>
@ -50,7 +51,7 @@ ATF_TEST_CASE_BODY(nvlist_bool_array__basic)
const bool *const_result;
bool *result;
nvlist_t *nvl;
size_t nitems;
size_t num_items;
unsigned int i;
const char *key;
@ -69,16 +70,16 @@ ATF_TEST_CASE_BODY(nvlist_bool_array__basic)
ATF_REQUIRE(nvlist_exists_bool_array(nvl, key));
ATF_REQUIRE(nvlist_exists_bool_array(nvl, "nvl/bool"));
const_result = nvlist_get_bool_array(nvl, key, &nitems);
ATF_REQUIRE_EQ(nitems, 16);
const_result = nvlist_get_bool_array(nvl, key, &num_items);
ATF_REQUIRE_EQ(num_items, 16);
ATF_REQUIRE(const_result != NULL);
for (i = 0; i < nitems; i++)
for (i = 0; i < num_items; i++)
ATF_REQUIRE_EQ(const_result[i], testbool[i]);
result = nvlist_take_bool_array(nvl, key, &nitems);
ATF_REQUIRE_EQ(nitems, 16);
result = nvlist_take_bool_array(nvl, key, &num_items);
ATF_REQUIRE_EQ(num_items, 16);
ATF_REQUIRE(const_result != NULL);
for (i = 0; i < nitems; i++)
for (i = 0; i < num_items; i++)
ATF_REQUIRE_EQ(result[i], testbool[i]);
ATF_REQUIRE(!nvlist_exists_bool_array(nvl, key));
@ -95,10 +96,10 @@ ATF_TEST_CASE_BODY(nvlist_string_array__basic)
const char * const *const_result;
char **result;
nvlist_t *nvl;
size_t nitems;
size_t num_items;
unsigned int i;
const char *key;
const char *string[8] = { "a", "b", "kot", "foo",
const char *string_arr[8] = { "a", "b", "kot", "foo",
"tests", "nice test", "", "abcdef" };
key = "nvl/string";
@ -107,32 +108,33 @@ ATF_TEST_CASE_BODY(nvlist_string_array__basic)
ATF_REQUIRE(nvlist_empty(nvl));
ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
nvlist_add_string_array(nvl, key, string, 8);
nvlist_add_string_array(nvl, key, string_arr, nitems(string_arr));
ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
ATF_REQUIRE(!nvlist_empty(nvl));
ATF_REQUIRE(nvlist_exists_string_array(nvl, key));
ATF_REQUIRE(nvlist_exists_string_array(nvl, "nvl/string"));
const_result = nvlist_get_string_array(nvl, key, &nitems);
const_result = nvlist_get_string_array(nvl, key, &num_items);
ATF_REQUIRE(!nvlist_empty(nvl));
ATF_REQUIRE(const_result != NULL);
ATF_REQUIRE(nitems == 8);
for (i = 0; i < nitems; i++) {
if (string[i] != NULL) {
ATF_REQUIRE(strcmp(const_result[i], string[i]) == 0);
ATF_REQUIRE(num_items == nitems(string_arr));
for (i = 0; i < num_items; i++) {
if (string_arr[i] != NULL) {
ATF_REQUIRE(strcmp(const_result[i],
string_arr[i]) == 0);
} else {
ATF_REQUIRE(const_result[i] == string[i]);
ATF_REQUIRE(const_result[i] == string_arr[i]);
}
}
result = nvlist_take_string_array(nvl, key, &nitems);
result = nvlist_take_string_array(nvl, key, &num_items);
ATF_REQUIRE(result != NULL);
ATF_REQUIRE_EQ(nitems, 8);
for (i = 0; i < nitems; i++) {
if (string[i] != NULL) {
ATF_REQUIRE_EQ(strcmp(result[i], string[i]), 0);
ATF_REQUIRE_EQ(num_items, nitems(string_arr));
for (i = 0; i < num_items; i++) {
if (string_arr[i] != NULL) {
ATF_REQUIRE_EQ(strcmp(result[i], string_arr[i]), 0);
} else {
ATF_REQUIRE_EQ(result[i], string[i]);
ATF_REQUIRE_EQ(result[i], string_arr[i]);
}
}
@ -140,7 +142,7 @@ ATF_TEST_CASE_BODY(nvlist_string_array__basic)
ATF_REQUIRE(nvlist_empty(nvl));
ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
for (i = 0; i < 8; i++)
for (i = 0; i < num_items; i++)
free(result[i]);
free(result);
nvlist_destroy(nvl);
@ -152,11 +154,11 @@ ATF_TEST_CASE_BODY(nvlist_descriptor_array__basic)
int fd[32], *result;
const int *const_result;
nvlist_t *nvl;
size_t nitems;
size_t num_items;
unsigned int i;
const char *key;
for (i = 0; i < 32; i++) {
for (i = 0; i < nitems(fd); i++) {
fd[i] = dup(STDERR_FILENO);
ATF_REQUIRE(fd_is_valid(fd[i]));
}
@ -167,26 +169,26 @@ ATF_TEST_CASE_BODY(nvlist_descriptor_array__basic)
ATF_REQUIRE(nvlist_empty(nvl));
ATF_REQUIRE(!nvlist_exists_descriptor_array(nvl, key));
nvlist_add_descriptor_array(nvl, key, fd, 32);
nvlist_add_descriptor_array(nvl, key, fd, nitems(fd));
ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
ATF_REQUIRE(!nvlist_empty(nvl));
ATF_REQUIRE(nvlist_exists_descriptor_array(nvl, key));
ATF_REQUIRE(nvlist_exists_descriptor_array(nvl, "nvl/descriptor"));
const_result = nvlist_get_descriptor_array(nvl, key, &nitems);
const_result = nvlist_get_descriptor_array(nvl, key, &num_items);
ATF_REQUIRE(!nvlist_empty(nvl));
ATF_REQUIRE(const_result != NULL);
ATF_REQUIRE(nitems == 32);
for (i = 0; i < nitems; i++) {
ATF_REQUIRE(num_items == nitems(fd));
for (i = 0; i < num_items; i++) {
ATF_REQUIRE(fd_is_valid(const_result[i]));
if (i > 0)
ATF_REQUIRE(const_result[i] != const_result[i - 1]);
}
result = nvlist_take_descriptor_array(nvl, key, &nitems);
result = nvlist_take_descriptor_array(nvl, key, &num_items);
ATF_REQUIRE(result != NULL);
ATF_REQUIRE_EQ(nitems, 32);
for (i = 0; i < nitems; i++) {
ATF_REQUIRE_EQ(num_items, nitems(fd));
for (i = 0; i < num_items; i++) {
ATF_REQUIRE(fd_is_valid(result[i]));
if (i > 0)
ATF_REQUIRE(const_result[i] != const_result[i - 1]);
@ -196,7 +198,7 @@ ATF_TEST_CASE_BODY(nvlist_descriptor_array__basic)
ATF_REQUIRE(nvlist_empty(nvl));
ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
for (i = 0; i < nitems; i++) {
for (i = 0; i < num_items; i++) {
close(result[i]);
close(fd[i]);
}
@ -210,7 +212,7 @@ ATF_TEST_CASE_BODY(nvlist_number_array__basic)
const uint64_t *const_result;
uint64_t *result;
nvlist_t *nvl;
size_t nitems;
size_t num_items;
unsigned int i;
const char *key;
const uint64_t number[8] = { 0, UINT_MAX, 7, 123, 90,
@ -222,23 +224,23 @@ ATF_TEST_CASE_BODY(nvlist_number_array__basic)
ATF_REQUIRE(nvlist_empty(nvl));
ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
nvlist_add_number_array(nvl, key, number, 8);
nvlist_add_number_array(nvl, key, number, nitems(number));
ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
ATF_REQUIRE(!nvlist_empty(nvl));
ATF_REQUIRE(nvlist_exists_number_array(nvl, key));
ATF_REQUIRE(nvlist_exists_number_array(nvl, "nvl/number"));
const_result = nvlist_get_number_array(nvl, key, &nitems);
const_result = nvlist_get_number_array(nvl, key, &num_items);
ATF_REQUIRE(!nvlist_empty(nvl));
ATF_REQUIRE(const_result != NULL);
ATF_REQUIRE(nitems == 8);
for (i = 0; i < nitems; i++)
ATF_REQUIRE(num_items == nitems(number));
for (i = 0; i < num_items; i++)
ATF_REQUIRE_EQ(const_result[i], number[i]);
result = nvlist_take_number_array(nvl, key, &nitems);
result = nvlist_take_number_array(nvl, key, &num_items);
ATF_REQUIRE(result != NULL);
ATF_REQUIRE_EQ(nitems, 8);
for (i = 0; i < nitems; i++)
ATF_REQUIRE_EQ(num_items, nitems(number));
for (i = 0; i < num_items; i++)
ATF_REQUIRE_EQ(result[i], number[i]);
ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
@ -256,7 +258,7 @@ ATF_TEST_CASE_BODY(nvlist_nvlist_array__basic)
const nvlist_t * const *const_result;
nvlist_t **result;
nvlist_t *nvl;
size_t nitems;
size_t num_items;
unsigned int i;
const char *somestr[8] = { "a", "b", "c", "d", "e", "f", "g", "h" };
const char *key;
@ -282,14 +284,14 @@ ATF_TEST_CASE_BODY(nvlist_nvlist_array__basic)
ATF_REQUIRE(nvlist_exists_nvlist_array(nvl, key));
ATF_REQUIRE(nvlist_exists_nvlist_array(nvl, "nvl/nvlist"));
const_result = nvlist_get_nvlist_array(nvl, key, &nitems);
const_result = nvlist_get_nvlist_array(nvl, key, &num_items);
ATF_REQUIRE(!nvlist_empty(nvl));
ATF_REQUIRE(const_result != NULL);
ATF_REQUIRE(nitems == 8);
ATF_REQUIRE(num_items == nitems(testnvl));
for (i = 0; i < nitems; i++) {
for (i = 0; i < num_items; i++) {
ATF_REQUIRE_EQ(nvlist_error(const_result[i]), 0);
if (i < nitems - 1) {
if (i < num_items - 1) {
ATF_REQUIRE(nvlist_get_array_next(const_result[i]) ==
const_result[i + 1]);
} else {
@ -304,10 +306,10 @@ ATF_TEST_CASE_BODY(nvlist_nvlist_array__basic)
"nvl/string"), somestr[i]) == 0);
}
result = nvlist_take_nvlist_array(nvl, key, &nitems);
result = nvlist_take_nvlist_array(nvl, key, &num_items);
ATF_REQUIRE(result != NULL);
ATF_REQUIRE_EQ(nitems, 8);
for (i = 0; i < nitems; i++) {
ATF_REQUIRE_EQ(num_items, 8);
for (i = 0; i < num_items; i++) {
ATF_REQUIRE_EQ(nvlist_error(result[i]), 0);
ATF_REQUIRE(nvlist_get_array_next(result[i]) == NULL);
ATF_REQUIRE(nvlist_get_array_next(const_result[i]) == NULL);
@ -335,19 +337,19 @@ ATF_TEST_CASE_BODY(nvlist_clone_array)
const nvlist_t *nvl;
bool testbool[16];
int testfd[16];
size_t i, nitems;
const char *string[8] = { "a", "b", "kot", "foo",
size_t i, num_items;
const char *string_arr[8] = { "a", "b", "kot", "foo",
"tests", "nice test", "", "abcdef" };
const char *somestr[8] = { "a", "b", "c", "d", "e", "f", "g", "h" };
const uint64_t number[8] = { 0, UINT_MAX, 7, 123, 90,
100000, 8, 1 };
for (i = 0; i < 16; i++) {
for (i = 0; i < nitems(testfd); i++) {
testbool[i] = (i % 2 == 0);
testfd[i] = dup(STDERR_FILENO);
ATF_REQUIRE(fd_is_valid(testfd[i]));
}
for (i = 0; i < 8; i++) {
for (i = 0; i < nitems(testnvl); i++) {
testnvl[i] = nvlist_create(0);
ATF_REQUIRE(nvlist_error(testnvl[i]) == 0);
nvlist_add_string(testnvl[i], "nvl/nvl/teststr", somestr[i]);
@ -358,28 +360,30 @@ ATF_TEST_CASE_BODY(nvlist_clone_array)
ATF_REQUIRE(nvlist_error(src) == 0);
ATF_REQUIRE(!nvlist_exists_bool_array(src, "nvl/bool"));
nvlist_add_bool_array(src, "nvl/bool", testbool, 16);
nvlist_add_bool_array(src, "nvl/bool", testbool, nitems(testbool));
ATF_REQUIRE_EQ(nvlist_error(src), 0);
ATF_REQUIRE(nvlist_exists_bool_array(src, "nvl/bool"));
ATF_REQUIRE(!nvlist_exists_string_array(src, "nvl/string"));
nvlist_add_string_array(src, "nvl/string", string, 8);
nvlist_add_string_array(src, "nvl/string", string_arr,
nitems(string_arr));
ATF_REQUIRE_EQ(nvlist_error(src), 0);
ATF_REQUIRE(nvlist_exists_string_array(src, "nvl/string"));
ATF_REQUIRE(!nvlist_exists_descriptor_array(src, "nvl/fd"));
nvlist_add_descriptor_array(src, "nvl/fd", testfd, 16);
nvlist_add_descriptor_array(src, "nvl/fd", testfd, nitems(testfd));
ATF_REQUIRE_EQ(nvlist_error(src), 0);
ATF_REQUIRE(nvlist_exists_descriptor_array(src, "nvl/fd"));
ATF_REQUIRE(!nvlist_exists_number_array(src, "nvl/number"));
nvlist_add_number_array(src, "nvl/number", number, 8);
nvlist_add_number_array(src, "nvl/number", number,
nitems(number));
ATF_REQUIRE_EQ(nvlist_error(src), 0);
ATF_REQUIRE(nvlist_exists_number_array(src, "nvl/number"));
ATF_REQUIRE(!nvlist_exists_nvlist_array(src, "nvl/array"));
nvlist_add_nvlist_array(src, "nvl/array",
(const nvlist_t * const *)testnvl, 8);
(const nvlist_t * const *)testnvl, nitems(testnvl));
ATF_REQUIRE_EQ(nvlist_error(src), 0);
ATF_REQUIRE(nvlist_exists_nvlist_array(src, "nvl/array"));
@ -387,62 +391,62 @@ ATF_TEST_CASE_BODY(nvlist_clone_array)
ATF_REQUIRE(dst != NULL);
ATF_REQUIRE(nvlist_exists_bool_array(dst, "nvl/bool"));
(void) nvlist_get_bool_array(dst, "nvl/bool", &nitems);
ATF_REQUIRE_EQ(nitems, 16);
for (i = 0; i < nitems; i++) {
(void) nvlist_get_bool_array(dst, "nvl/bool", &num_items);
ATF_REQUIRE_EQ(num_items, nitems(testbool));
for (i = 0; i < num_items; i++) {
ATF_REQUIRE(
nvlist_get_bool_array(dst, "nvl/bool", &nitems)[i] ==
nvlist_get_bool_array(src, "nvl/bool", &nitems)[i]);
nvlist_get_bool_array(dst, "nvl/bool", &num_items)[i] ==
nvlist_get_bool_array(src, "nvl/bool", &num_items)[i]);
}
ATF_REQUIRE(nvlist_exists_string_array(dst, "nvl/string"));
(void) nvlist_get_string_array(dst, "nvl/string", &nitems);
ATF_REQUIRE_EQ(nitems, 8);
for (i = 0; i < nitems; i++) {
(void) nvlist_get_string_array(dst, "nvl/string", &num_items);
ATF_REQUIRE_EQ(num_items, nitems(string_arr));
for (i = 0; i < num_items; i++) {
if (nvlist_get_string_array(dst, "nvl/string",
&nitems)[i] == NULL) {
&num_items)[i] == NULL) {
ATF_REQUIRE(nvlist_get_string_array(dst, "nvl/string",
&nitems)[i] == nvlist_get_string_array(src,
"nvl/string", &nitems)[i]);
&num_items)[i] == nvlist_get_string_array(src,
"nvl/string", &num_items)[i]);
} else {
ATF_REQUIRE(strcmp(nvlist_get_string_array(dst,
"nvl/string", &nitems)[i], nvlist_get_string_array(
src, "nvl/string", &nitems)[i]) == 0);
"nvl/string", &num_items)[i], nvlist_get_string_array(
src, "nvl/string", &num_items)[i]) == 0);
}
}
ATF_REQUIRE(nvlist_exists_descriptor_array(dst, "nvl/fd"));
(void) nvlist_get_descriptor_array(dst, "nvl/fd", &nitems);
ATF_REQUIRE_EQ(nitems, 16);
for (i = 0; i < nitems; i++) {
(void) nvlist_get_descriptor_array(dst, "nvl/fd", &num_items);
ATF_REQUIRE_EQ(num_items, nitems(testfd));
for (i = 0; i < num_items; i++) {
ATF_REQUIRE(fd_is_valid(
nvlist_get_descriptor_array(dst, "nvl/fd", &nitems)[i]));
nvlist_get_descriptor_array(dst, "nvl/fd", &num_items)[i]));
}
ATF_REQUIRE(nvlist_exists_number_array(dst, "nvl/number"));
(void) nvlist_get_number_array(dst, "nvl/number", &nitems);
ATF_REQUIRE_EQ(nitems, 8);
(void) nvlist_get_number_array(dst, "nvl/number", &num_items);
ATF_REQUIRE_EQ(num_items, nitems(number));
for (i = 0; i < nitems; i++) {
for (i = 0; i < num_items; i++) {
ATF_REQUIRE(
nvlist_get_number_array(dst, "nvl/number", &nitems)[i] ==
nvlist_get_number_array(src, "nvl/number", &nitems)[i]);
nvlist_get_number_array(dst, "nvl/number", &num_items)[i] ==
nvlist_get_number_array(src, "nvl/number", &num_items)[i]);
}
ATF_REQUIRE(nvlist_exists_nvlist_array(dst, "nvl/array"));
(void) nvlist_get_nvlist_array(dst, "nvl/array", &nitems);
ATF_REQUIRE_EQ(nitems, 8);
for (i = 0; i < nitems; i++) {
nvl = nvlist_get_nvlist_array(dst, "nvl/array", &nitems)[i];
(void) nvlist_get_nvlist_array(dst, "nvl/array", &num_items);
ATF_REQUIRE_EQ(num_items, nitems(testnvl));
for (i = 0; i < num_items; i++) {
nvl = nvlist_get_nvlist_array(dst, "nvl/array", &num_items)[i];
ATF_REQUIRE(nvlist_exists_string(nvl, "nvl/nvl/teststr"));
ATF_REQUIRE(strcmp(nvlist_get_string(nvl, "nvl/nvl/teststr"),
somestr[i]) == 0);
}
for (i = 0; i < 16; i++) {
for (i = 0; i < nitems(testfd); i++) {
close(testfd[i]);
if (i < 8) {
nvlist_destroy(testnvl[i]);
}
}
for (i = 0; i < nitems(testnvl); i++) {
nvlist_destroy(testnvl[i]);
}
nvlist_destroy(src);
nvlist_destroy(dst);
@ -454,7 +458,7 @@ ATF_TEST_CASE_BODY(nvlist_bool_array__move)
bool *testbool;
const bool *const_result;
nvlist_t *nvl;
size_t nitems, count;
size_t num_items, count;
unsigned int i;
const char *key;
@ -475,11 +479,11 @@ ATF_TEST_CASE_BODY(nvlist_bool_array__move)
ATF_REQUIRE(!nvlist_empty(nvl));
ATF_REQUIRE(nvlist_exists_bool_array(nvl, key));
const_result = nvlist_get_bool_array(nvl, key, &nitems);
ATF_REQUIRE_EQ(nitems, count);
const_result = nvlist_get_bool_array(nvl, key, &num_items);
ATF_REQUIRE_EQ(num_items, count);
ATF_REQUIRE(const_result != NULL);
ATF_REQUIRE(const_result == testbool);
for (i = 0; i < nitems; i++)
for (i = 0; i < num_items; i++)
ATF_REQUIRE_EQ(const_result[i], (i % 2 == 0));
nvlist_destroy(nvl);
@ -491,7 +495,7 @@ ATF_TEST_CASE_BODY(nvlist_string_array__move)
char **teststr;
const char * const *const_result;
nvlist_t *nvl;
size_t nitems, count;
size_t num_items, count;
unsigned int i;
const char *key;
@ -516,11 +520,11 @@ ATF_TEST_CASE_BODY(nvlist_string_array__move)
ATF_REQUIRE(!nvlist_empty(nvl));
ATF_REQUIRE(nvlist_exists_string_array(nvl, key));
const_result = nvlist_get_string_array(nvl, key, &nitems);
ATF_REQUIRE_EQ(nitems, count);
const_result = nvlist_get_string_array(nvl, key, &num_items);
ATF_REQUIRE_EQ(num_items, count);
ATF_REQUIRE(const_result != NULL);
ATF_REQUIRE((intptr_t)const_result == (intptr_t)teststr);
for (i = 0; i < nitems; i++) {
for (i = 0; i < num_items; i++) {
ATF_REQUIRE_EQ(const_result[i][0], (char)('a' + i));
ATF_REQUIRE_EQ(const_result[i][1], '\0');
}
@ -534,7 +538,7 @@ ATF_TEST_CASE_BODY(nvlist_nvlist_array__move)
nvlist **testnv;
const nvlist * const *const_result;
nvlist_t *nvl;
size_t nitems, count;
size_t num_items, count;
unsigned int i;
const char *key;
@ -557,14 +561,14 @@ ATF_TEST_CASE_BODY(nvlist_nvlist_array__move)
ATF_REQUIRE(!nvlist_empty(nvl));
ATF_REQUIRE(nvlist_exists_nvlist_array(nvl, key));
const_result = nvlist_get_nvlist_array(nvl, key, &nitems);
ATF_REQUIRE_EQ(nitems, count);
const_result = nvlist_get_nvlist_array(nvl, key, &num_items);
ATF_REQUIRE_EQ(num_items, count);
ATF_REQUIRE(const_result != NULL);
ATF_REQUIRE((intptr_t)const_result == (intptr_t)testnv);
for (i = 0; i < nitems; i++) {
for (i = 0; i < num_items; i++) {
ATF_REQUIRE_EQ(nvlist_error(const_result[i]), 0);
ATF_REQUIRE(nvlist_empty(const_result[i]));
if (i < nitems - 1) {
if (i < num_items - 1) {
ATF_REQUIRE(nvlist_get_array_next(const_result[i]) ==
const_result[i + 1]);
} else {
@ -584,7 +588,7 @@ ATF_TEST_CASE_BODY(nvlist_number_array__move)
uint64_t *testnumber;
const uint64_t *const_result;
nvlist_t *nvl;
size_t nitems, count;
size_t num_items, count;
unsigned int i;
const char *key;
@ -605,11 +609,11 @@ ATF_TEST_CASE_BODY(nvlist_number_array__move)
ATF_REQUIRE(!nvlist_empty(nvl));
ATF_REQUIRE(nvlist_exists_number_array(nvl, key));
const_result = nvlist_get_number_array(nvl, key, &nitems);
ATF_REQUIRE_EQ(nitems, count);
const_result = nvlist_get_number_array(nvl, key, &num_items);
ATF_REQUIRE_EQ(num_items, count);
ATF_REQUIRE(const_result != NULL);
ATF_REQUIRE(const_result == testnumber);
for (i = 0; i < nitems; i++)
for (i = 0; i < num_items; i++)
ATF_REQUIRE_EQ(const_result[i], i);
nvlist_destroy(nvl);
@ -621,7 +625,7 @@ ATF_TEST_CASE_BODY(nvlist_descriptor_array__move)
int *testfd;
const int *const_result;
nvlist_t *nvl;
size_t nitems, count;
size_t num_items, count;
unsigned int i;
const char *key;
@ -644,11 +648,11 @@ ATF_TEST_CASE_BODY(nvlist_descriptor_array__move)
ATF_REQUIRE(!nvlist_empty(nvl));
ATF_REQUIRE(nvlist_exists_descriptor_array(nvl, key));
const_result = nvlist_get_descriptor_array(nvl, key, &nitems);
ATF_REQUIRE_EQ(nitems, count);
const_result = nvlist_get_descriptor_array(nvl, key, &num_items);
ATF_REQUIRE_EQ(num_items, count);
ATF_REQUIRE(const_result != NULL);
ATF_REQUIRE(const_result == testfd);
for (i = 0; i < nitems; i++)
for (i = 0; i < num_items; i++)
ATF_REQUIRE(fd_is_valid(const_result[i]));
nvlist_destroy(nvl);
@ -764,11 +768,12 @@ ATF_TEST_CASE_BODY(nvlist_nvlist_array__travel)
{
nvlist_t *nvl, *test[5], *nasted;
const nvlist_t *travel;
void *cookie;
int index, i, type;
const char *name;
void *cookie;
int type;
unsigned int i, index;
for (i = 0; i < 5; i++) {
for (i = 0; i < nitems(test); i++) {
test[i] = nvlist_create(0);
ATF_REQUIRE(test[i] != NULL);
nvlist_add_number(test[i], "nvl/number", i);
@ -776,11 +781,12 @@ ATF_TEST_CASE_BODY(nvlist_nvlist_array__travel)
}
nvl = nvlist_create(0);
ATF_REQUIRE(nvl != NULL);
nvlist_add_nvlist_array(nvl, "nvl/nvlist_array", test, 5);
nvlist_add_nvlist_array(nvl, "nvl/nvlist_array", test, nitems(test));
ATF_REQUIRE(nvlist_error(nvl) == 0);
nasted = nvlist_create(0);
ATF_REQUIRE(nasted != NULL);
nvlist_add_nvlist_array(nasted, "nvl/nvl/nvlist_array", test, 5);
nvlist_add_nvlist_array(nasted, "nvl/nvl/nvlist_array", test,
nitems(test));
ATF_REQUIRE(nvlist_error(nasted) == 0);
nvlist_move_nvlist(nvl, "nvl/nvl", nasted);
ATF_REQUIRE(nvlist_error(nvl) == 0);
@ -794,15 +800,16 @@ ATF_TEST_CASE_BODY(nvlist_nvlist_array__travel)
while ((name = nvlist_next(travel, &type, &cookie)) != NULL) {
if (index == 0) {
ATF_REQUIRE(type == NV_TYPE_NVLIST_ARRAY);
} else if (index >= 1 && index <= 5) {
} else if (index >= 1 && index <= nitems(test)) {
ATF_REQUIRE(type == NV_TYPE_NUMBER);
} else if (index == 6) {
} else if (index == nitems(test) + 1) {
ATF_REQUIRE(type == NV_TYPE_NVLIST);
} else if (index == 7) {
} else if (index == nitems(test) + 2) {
ATF_REQUIRE(type == NV_TYPE_NVLIST_ARRAY);
} else if (index >= 8 && index <= 12) {
} else if (index >= nitems(test) + 3 &&
index <= 2 * nitems(test) + 2) {
ATF_REQUIRE(type == NV_TYPE_NUMBER);
} else if (index == 13) {
} else if (index == 2 * nitems(test) + 3) {
ATF_REQUIRE(type == NV_TYPE_STRING);
}
@ -818,7 +825,7 @@ ATF_TEST_CASE_BODY(nvlist_nvlist_array__travel)
}
} while ((travel = nvlist_get_pararr(travel, &cookie)) != NULL);
for (i = 0; i < 5; i++)
for (i = 0; i < nitems(test); i++)
nvlist_destroy(test[i]);
nvlist_destroy(nvl);
@ -908,7 +915,7 @@ ATF_TEST_CASE_BODY(nvlist_bool_array__pack)
const bool *const_result;
bool testbool[16];
for (i = 0; i < 16; i++)
for (i = 0; i < nitems(testbool); i++)
testbool[i] = (i % 2 == 0);
key = "nvl/bool";
@ -917,7 +924,7 @@ ATF_TEST_CASE_BODY(nvlist_bool_array__pack)
ATF_REQUIRE(nvlist_empty(nvl));
ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
nvlist_add_bool_array(nvl, key, testbool, 16);
nvlist_add_bool_array(nvl, key, testbool, nitems(testbool));
ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
ATF_REQUIRE(!nvlist_empty(nvl));
ATF_REQUIRE(nvlist_exists_bool_array(nvl, key));
@ -931,7 +938,7 @@ ATF_TEST_CASE_BODY(nvlist_bool_array__pack)
ATF_REQUIRE(nvlist_exists_bool_array(unpacked, key));
const_result = nvlist_get_bool_array(unpacked, key, &count);
ATF_REQUIRE_EQ(count, 16);
ATF_REQUIRE_EQ(count, nitems(testbool));
for (i = 0; i < count; i++) {
ATF_REQUIRE_EQ(testbool[i], const_result[i]);
}
@ -973,7 +980,7 @@ ATF_TEST_CASE_BODY(nvlist_number_array__pack)
ATF_REQUIRE(nvlist_exists_number_array(unpacked, key));
const_result = nvlist_get_number_array(unpacked, key, &count);
ATF_REQUIRE_EQ(count, 8);
ATF_REQUIRE_EQ(count, nitems(number));
for (i = 0; i < count; i++) {
ATF_REQUIRE_EQ(number[i], const_result[i]);
}
@ -988,7 +995,7 @@ ATF_TEST_CASE_BODY(nvlist_descriptor_array__pack)
{
nvlist_t *nvl;
const char *key;
size_t nitems;
size_t num_items;
unsigned int i;
const int *const_result;
int desc[32], fd, socks[2];
@ -1004,7 +1011,7 @@ ATF_TEST_CASE_BODY(nvlist_descriptor_array__pack)
/* Child. */
fd = socks[0];
close(socks[1]);
for (i = 0; i < 32; i++) {
for (i = 0; i < nitems(desc); i++) {
desc[i] = dup(STDERR_FILENO);
ATF_REQUIRE(fd_is_valid(desc[i]));
}
@ -1014,14 +1021,14 @@ ATF_TEST_CASE_BODY(nvlist_descriptor_array__pack)
ATF_REQUIRE(nvlist_empty(nvl));
ATF_REQUIRE(!nvlist_exists_descriptor_array(nvl, key));
nvlist_add_descriptor_array(nvl, key, desc, 32);
nvlist_add_descriptor_array(nvl, key, desc, nitems(desc));
ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
ATF_REQUIRE(!nvlist_empty(nvl));
ATF_REQUIRE(nvlist_exists_descriptor_array(nvl, key));
ATF_REQUIRE(nvlist_send(fd, nvl) >= 0);
for (i = 0; i < nitems; i++)
for (i = 0; i < nitems(desc); i++)
close(desc[i]);
} else {
/* Parent */
@ -1034,10 +1041,10 @@ ATF_TEST_CASE_BODY(nvlist_descriptor_array__pack)
ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
ATF_REQUIRE(nvlist_exists_descriptor_array(nvl, key));
const_result = nvlist_get_descriptor_array(nvl, key, &nitems);
const_result = nvlist_get_descriptor_array(nvl, key, &num_items);
ATF_REQUIRE(const_result != NULL);
ATF_REQUIRE_EQ(nitems, 32);
for (i = 0; i < nitems; i++)
ATF_REQUIRE_EQ(num_items, nitems(desc));
for (i = 0; i < num_items; i++)
ATF_REQUIRE(fd_is_valid(const_result[i]));
atf::utils::wait(pid, 0, "", "");
@ -1056,7 +1063,7 @@ ATF_TEST_CASE_BODY(nvlist_string_array__pack)
void *packed;
unsigned int i;
const char * const *const_result;
const char *string[8] = { "a", "b", "kot", "foo",
const char *string_arr[8] = { "a", "b", "kot", "foo",
"tests", "nice test", "", "abcdef" };
key = "nvl/string";
@ -1065,7 +1072,7 @@ ATF_TEST_CASE_BODY(nvlist_string_array__pack)
ATF_REQUIRE(nvlist_empty(nvl));
ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
nvlist_add_string_array(nvl, key, string, 8);
nvlist_add_string_array(nvl, key, string_arr, nitems(string_arr));
ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
ATF_REQUIRE(!nvlist_empty(nvl));
ATF_REQUIRE(nvlist_exists_string_array(nvl, key));
@ -1079,9 +1086,9 @@ ATF_TEST_CASE_BODY(nvlist_string_array__pack)
ATF_REQUIRE(nvlist_exists_string_array(unpacked, key));
const_result = nvlist_get_string_array(unpacked, key, &count);
ATF_REQUIRE_EQ(count, 8);
ATF_REQUIRE_EQ(count, nitems(string_arr));
for (i = 0; i < count; i++) {
ATF_REQUIRE_EQ(strcmp(string[i], const_result[i]), 0);
ATF_REQUIRE_EQ(strcmp(string_arr[i], const_result[i]), 0);
}
nvlist_destroy(nvl);
@ -1094,15 +1101,14 @@ ATF_TEST_CASE_BODY(nvlist_nvlist_array__pack)
{
nvlist_t *testnvl[8], *unpacked;
const nvlist_t * const *const_result;
nvlist_t **result;
nvlist_t *nvl;
size_t nitems, packed_size;
size_t num_items, packed_size;
unsigned int i;
void *packed;
const char *somestr[8] = { "a", "b", "c", "d", "e", "f", "g", "h" };
const char *key;
for (i = 0; i < 8; i++) {
for (i = 0; i < nitems(testnvl); i++) {
testnvl[i] = nvlist_create(0);
ATF_REQUIRE(testnvl[i] != NULL);
ATF_REQUIRE_EQ(nvlist_error(testnvl[i]), 0);
@ -1130,12 +1136,12 @@ ATF_TEST_CASE_BODY(nvlist_nvlist_array__pack)
ATF_REQUIRE_EQ(nvlist_error(unpacked), 0);
ATF_REQUIRE(nvlist_exists_nvlist_array(unpacked, key));
const_result = nvlist_get_nvlist_array(unpacked, key, &nitems);
const_result = nvlist_get_nvlist_array(unpacked, key, &num_items);
ATF_REQUIRE(const_result != NULL);
ATF_REQUIRE_EQ(nitems, 8);
for (i = 0; i < nitems; i++) {
ATF_REQUIRE_EQ(num_items, nitems(testnvl));
for (i = 0; i < num_items; i++) {
ATF_REQUIRE_EQ(nvlist_error(const_result[i]), 0);
if (i < nitems - 1) {
if (i < num_items - 1) {
ATF_REQUIRE(nvlist_get_array_next(const_result[i]) ==
const_result[i + 1]);
} else {
@ -1150,9 +1156,8 @@ ATF_TEST_CASE_BODY(nvlist_nvlist_array__pack)
"nvl/string"), somestr[i]) == 0);
}
for (i = 0; i < 8; i++)
for (i = 0; i < nitems(testnvl); i++)
nvlist_destroy(testnvl[i]);
free(result);
nvlist_destroy(nvl);
nvlist_destroy(unpacked);
free(packed);

View File

@ -11,13 +11,14 @@ MK_SSP= no
.include <src.opts.mk>
LIBSTAND_SRC= ${.CURDIR}
LIBSTAND_SRC?= ${.CURDIR}
LIBSTAND_CPUARCH?=${MACHINE_CPUARCH}
LIBC_SRC= ${LIBSTAND_SRC}/../libc
LIB= stand
NO_PIC=
INCS= stand.h
MAN= libstand.3
MAN?= libstand.3
WARNS?= 0
@ -78,7 +79,7 @@ SRCS+= syncicache.c
SRCS+= uuid_create_nil.c uuid_equal.c uuid_from_string.c uuid_is_nil.c uuid_to_string.c
# _setjmp/_longjmp
.PATH: ${LIBSTAND_SRC}/${MACHINE_CPUARCH}
.PATH: ${LIBSTAND_SRC}/${LIBSTAND_CPUARCH}
SRCS+= _setjmp.S
# decompression functionality from libbz2

View File

@ -80,4 +80,6 @@ extern void *__tls_get_addr(tls_index *ti);
#define RTLD_DEFAULT_STACK_PF_EXEC PF_X
#define RTLD_DEFAULT_STACK_EXEC PROT_EXEC
#define md_abi_variant_hook(x)
#endif

View File

@ -79,4 +79,6 @@ void *__tls_get_addr(tls_index *ti) __exported;
#define RTLD_DEFAULT_STACK_PF_EXEC PF_X
#define RTLD_DEFAULT_STACK_EXEC PROT_EXEC
#define md_abi_variant_hook(x)
#endif

View File

@ -17,6 +17,41 @@ __FBSDID("$FreeBSD$");
#include "rtld.h"
#include "paths.h"
void
arm_abi_variant_hook(Elf_Auxinfo **aux_info)
{
Elf_Word ehdr;
/*
* If we're running an old kernel that doesn't provide any data fail
* safe by doing nothing.
*/
if (aux_info[AT_EHDRFLAGS] == NULL)
return;
ehdr = aux_info[AT_EHDRFLAGS]->a_un.a_val;
/*
* Hard float ABI binaries are the default, and use the default paths
* and such.
*/
if ((ehdr & EF_ARM_VFP_FLOAT) != 0)
return;
/*
* This is a soft float ABI binary. We need to use the soft float
* settings. For the moment, the standard library path includes the hard
* float paths as well. When upgrading, we need to execute the wrong
* kind of binary until we've installed the new binaries. We could go
* off whether or not /libsoft exists, but the simplicity of having it
* in the path wins.
*/
ld_elf_hints_default = _PATH_SOFT_ELF_HINTS;
ld_path_libmap_conf = _PATH_SOFT_LIBMAP_CONF;
ld_path_rtld = _PATH_SOFT_RTLD;
ld_standard_library_path = SOFT_STANDARD_LIBRARY_PATH;
ld_env_prefix = LD_SOFT_;
}
void
init_pltgot(Obj_Entry *obj)
{

View File

@ -75,4 +75,9 @@ extern void *__tls_get_addr(tls_index *ti);
#define RTLD_DEFAULT_STACK_PF_EXEC PF_X
#define RTLD_DEFAULT_STACK_EXEC PROT_EXEC
extern void arm_abi_variant_hook(Elf_Auxinfo **);
#define md_abi_variant_hook(x) arm_abi_variant_hook(x)
#define RTLD_VARIANT_ENV_NAMES
#endif

View File

@ -80,4 +80,6 @@ void *__tls_get_addr(tls_index *ti) __exported;
#define RTLD_DEFAULT_STACK_PF_EXEC PF_X
#define RTLD_DEFAULT_STACK_EXEC PROT_EXEC
#define md_abi_variant_hook(x)
#endif

View File

@ -75,4 +75,6 @@ extern void *__tls_get_addr(tls_index *ti);
#define RTLD_DEFAULT_STACK_PF_EXEC PF_X
#define RTLD_DEFAULT_STACK_EXEC PROT_EXEC
#define md_abi_variant_hook(x)
#endif

View File

@ -1,8 +1,6 @@
/*-
* Copyright 1996, 1997, 1998, 1999, 2000 John D. Polstra.
* Copyright 2003 Alexander Kabaev <kan@FreeBSD.ORG>.
* Copyright 2009-2012 Konstantin Belousov <kib@FreeBSD.ORG>.
* Copyright 2012 John Marino <draco@marino.st>.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -61,7 +59,13 @@
#define LD_ "LD_"
#endif
extern char *ld_path_elf_hints;
#define _PATH_SOFT_ELF_HINTS "/var/run/ld-elf-soft.so.hints"
#define _PATH_SOFT_LIBMAP_CONF "/etc/libmap-soft.conf"
#define _PATH_SOFT_RTLD "/libexec/ld-elf.so.1"
#define SOFT_STANDARD_LIBRARY_PATH "/libsoft:/usr/libsoft:/lib:/usr/lib"
#define LD_SOFT_ "LD_SOFT_"
extern char *ld_elf_hints_default;
extern char *ld_path_libmap_conf;
extern char *ld_path_rtld;
extern char *ld_standard_library_path;

View File

@ -90,4 +90,6 @@ extern void *__tls_get_addr(tls_index* ti);
#define RTLD_DEFAULT_STACK_PF_EXEC PF_X
#define RTLD_DEFAULT_STACK_EXEC PROT_EXEC
#define md_abi_variant_hook(x)
#endif

View File

@ -82,4 +82,6 @@ extern void *__tls_get_addr(tls_index* ti);
#define RTLD_DEFAULT_STACK_PF_EXEC PF_X
#define RTLD_DEFAULT_STACK_EXEC PROT_EXEC
#define md_abi_variant_hook(x)
#endif

View File

@ -204,8 +204,6 @@ extern Elf_Dyn _DYNAMIC;
#define RTLD_IS_DYNAMIC() (&_DYNAMIC != NULL)
#endif
#define _LD(x) LD_ x
int dlclose(void *) __exported;
char *dlerror(void) __exported;
void *dlopen(const char *, int) __exported;
@ -325,6 +323,24 @@ ld_utrace_log(int event, void *handle, void *mapbase, size_t mapsize,
utrace(&ut, sizeof(ut));
}
#ifdef RTLD_VARIANT_ENV_NAMES
/*
* construct the env variable based on the type of binary that's
* running.
*/
static inline const char *
_LD(const char *var)
{
static char buffer[128];
strlcpy(buffer, ld_env_prefix, sizeof(buffer));
strlcat(buffer, var, sizeof(buffer));
return (buffer);
}
#else
#define _LD(x) LD_ x
#endif
/*
* Main entry point for dynamic linking. The first argument is the
* stack pointer. The stack is expected to be laid out as described
@ -419,6 +435,8 @@ _rtld(Elf_Addr *sp, func_ptr_type *exit_proc, Obj_Entry **objp)
trust = !issetugid();
md_abi_variant_hook(aux_info);
ld_bind_now = getenv(_LD("BIND_NOW"));
/*
* If the process is tainted, then we un-set the dangerous environment

View File

@ -71,4 +71,6 @@ extern void *__tls_get_addr(tls_index *ti);
#define RTLD_DEFAULT_STACK_PF_EXEC 0
#define RTLD_DEFAULT_STACK_EXEC 0
#define md_abi_variant_hook(x)
#endif

View File

@ -281,7 +281,7 @@ ftp: packagesystem
cp *.txz MANIFEST ftp
release: real-release vm-release cloudware-release
touch ${.TARGET}
touch ${.OBJDIR}/${.TARGET}
real-release:
${MAKE} -C ${.CURDIR} ${.MAKEFLAGS} obj

View File

@ -1017,6 +1017,9 @@
&hwlist.rsu;
<para>Realtek RTL8188CE based PCIe IEEE 802.11b/g/n wireless network
adapters (&man.rtwn.4; driver)</para>
&hwlist.rum;
&hwlist.run;

View File

@ -180,6 +180,7 @@ __DEFAULT_NO_OPTIONS = \
DTRACE_TESTS \
EISA \
HESIOD \
LIBSOFT \
NAND \
OFED \
OPENLDAP \
@ -248,6 +249,10 @@ __DEFAULT_NO_OPTIONS+=LLDB
.if ${__T} == "arm" || ${__T} == "armeb"
BROKEN_OPTIONS+=LLDB
.endif
# Only doing soft float API stuff on armv6
.if ${__T} != "armv6"
BROKEN_OPTIONS+=LIBSOFT
.endif
.include <bsd.mkopt.mk>

View File

@ -18,7 +18,7 @@
009 '8' '*' nop nop '8' '*' nop nop O
010 '9' '(' nop nop '9' '(' nop nop O
011 '0' ')' nop nop '0' ')' nop nop O
012 '-' '_' ns ns '-' '_' ns ns O
012 '-' '_' us us '-' '_' us us O
013 '=' '+' nop nop '=' '+' nop nop O
014 bs bs del del bs bs del del O
015 ht btab nop nop ht btab nop nop O
@ -90,7 +90,7 @@
081 fkey59 '3' '3' '3' '3' '3' '3' '3' N
082 fkey60 '0' '0' '0' '0' '0' '0' '0' N
083 del '.' '.' '.' '.' '.' boot boot N
084 ns ns ns ns ns ns ns ns O
084 us us us us us us us us O
085 nop nop nop nop nop nop nop nop O
086 '\' '|' nop nop '\' '|' nop nop O
087 fkey11 fkey23 fkey35 fkey47 scr11 scr11 scr11 scr11 O
@ -148,7 +148,7 @@
137 '8' '*' nop nop '8' '*' nop nop O
138 '9' '(' nop nop '9' '(' nop nop O
139 '0' ')' nop nop '0' ')' nop nop O
140 '-' '_' ns ns '-' '_' ns ns O
140 '-' '_' us us '-' '_' us us O
141 '=' '+' nop nop '=' '+' nop nop O
142 bs bs del del bs bs del del O
143 ht btab nop nop ht btab nop nop O
@ -220,7 +220,7 @@
209 fkey59 '3' '3' '3' '3' '3' '3' '3' N
210 fkey60 '0' '0' '0' '0' '0' '0' '0' N
211 del '.' '.' '.' '.' '.' boot boot N
212 ns ns ns ns ns ns ns ns O
212 us us us us us us us us O
213 nop nop nop nop nop nop nop nop O
214 '\' '|' nop nop '\' '|' nop nop O
215 fkey11 fkey23 fkey35 fkey47 scr11 scr11 scr11 scr11 O

View File

@ -18,7 +18,7 @@
009 '8' '*' nop nop '8' '*' nop nop O
010 '9' '(' nop nop '9' '(' nop nop O
011 '0' ')' nop nop '0' ')' nop nop O
012 '-' '_' ns ns '-' '_' ns ns O
012 '-' '_' us us '-' '_' us us O
013 '=' '+' nop nop '=' '+' nop nop O
014 bs bs del del bs bs del del O
015 ht btab nop nop ht btab nop nop O
@ -90,7 +90,7 @@
081 fkey59 '3' '3' '3' '3' '3' '3' '3' N
082 fkey60 '0' '0' '0' '0' '0' '0' '0' N
083 del '.' '.' '.' '.' '.' boot boot N
084 ns ns ns ns ns ns ns ns O
084 us us us us us us us us O
085 nop nop nop nop nop nop nop nop O
086 '\' '|' nop nop '\' '|' nop nop O
087 fkey11 fkey23 fkey35 fkey47 scr11 scr11 scr11 scr11 O
@ -148,7 +148,7 @@
137 '8' '*' nop nop '8' '*' nop nop O
138 '9' '(' nop nop '9' '(' nop nop O
139 '0' ')' nop nop '0' ')' nop nop O
140 '-' '_' ns ns '-' '_' ns ns O
140 '-' '_' us us '-' '_' us us O
141 '=' '+' nop nop '=' '+' nop nop O
142 bs bs del del bs bs del del O
143 ht btab nop nop ht btab nop nop O
@ -220,7 +220,7 @@
209 fkey59 '3' '3' '3' '3' '3' '3' '3' N
210 fkey60 '0' '0' '0' '0' '0' '0' '0' N
211 del '.' '.' '.' '.' '.' boot boot N
212 ns ns ns ns ns ns ns ns O
212 us us us us us us us us O
213 nop nop nop nop nop nop nop nop O
214 '\' '|' nop nop '\' '|' nop nop O
215 fkey11 fkey23 fkey35 fkey47 scr11 scr11 scr11 scr11 O

View File

@ -46,7 +46,7 @@
009 '8' '*' nop nop '8' '*' nop nop O
010 '9' '(' nop nop '9' '(' nop nop O
011 '0' ')' nop nop 0xf6 0xd6 nop nop O
012 '-' '_' ns ns 0xfc 0xdc ns ns C
012 '-' '_' us us 0xfc 0xdc us us C
013 '=' '+' nop nop 0xf3 0xd3 nop nop C
014 bs bs del del bs bs del del O
015 ht btab nop nop ht btab nop nop O
@ -175,7 +175,7 @@
137 '8' '*' nop nop '8' '*' nop nop O
138 '9' '(' nop nop '9' '(' nop nop O
139 0xf6 0xd6 nop nop '0' ')' nop nop O
140 0xfc 0xdc ns ns '-' '_' ns ns C
140 0xfc 0xdc us us '-' '_' us us C
141 0xf3 0xd3 nop nop '=' '+' nop nop C
142 bs bs del del bs bs del del O
143 ht btab nop nop ht btab nop nop O

View File

@ -60,7 +60,7 @@
050 'm' 'M' cr cr '<' nop cr cr C
051 ',' '?' nop nop ';' nop nop nop O
052 '.' ':' nop nop '>' nop nop nop O
053 '-' '_' ns ns '*' nop nop nop O
053 '-' '_' us us '*' nop nop nop O
054 rshift rshift rshift rshift rshift rshift rshift rshift O
055 '*' '*' '*' '*' '*' '*' '*' '*' O
056 lalt lalt lalt lalt lalt lalt lalt lalt O

View File

@ -15,7 +15,7 @@
009 '8' '*' nop nop 0x016b 0x0172 nop nop O
010 '9' '(' nop nop '9' '(' nop nop O
011 '0' ')' nop nop '0' ')' nop nop O
012 '-' '_' ns ns '-' '_' ns ns O
012 '-' '_' us us '-' '_' us us O
013 '=' '+' nop nop 0x017e 0x017d nop nop O
014 bs bs del del bs bs del del O
015 ht btab nop nop ht btab nop nop O
@ -87,7 +87,7 @@
081 fkey59 '3' '3' '3' '3' '3' '3' '3' N
082 fkey60 '0' '0' '0' '0' '0' '0' '0' N
083 del '.' ',' ',' del ',' boot boot N
084 ns ns ns ns ns ns ns ns O
084 us us us us us us us us O
085 nop nop nop nop nop nop nop nop O
086 ralt ralt ralt ralt ralt ralt ralt ralt O
087 fkey11 fkey23 fkey35 fkey47 scr11 scr11 scr11 scr11 O
@ -143,7 +143,7 @@
137 0x016b 0x016a nop nop '8' '*' nop nop C
138 '9' '(' nop nop '9' '(' nop nop O
139 '0' ')' nop nop '0' ')' nop nop O
140 '-' '_' ns ns '-' '_' ns ns O
140 '-' '_' us us '-' '_' us us O
141 0x017e 0x017d nop nop '=' '+' nop nop C
142 bs bs del del bs bs del del O
143 ht btab nop nop ht btab nop nop O
@ -215,7 +215,7 @@
209 fkey59 '3' '3' '3' '3' '3' '3' '3' N
210 fkey60 '0' '0' '0' '0' '0' '0' '0' N
211 del ',' '.' '.' del '.' boot boot N
212 ns ns ns ns ns ns ns ns O
212 us us us us us us us us O
213 nop nop nop nop nop nop nop nop O
214 ralt ralt ralt ralt ralt ralt ralt ralt O
215 fkey11 fkey23 fkey35 fkey47 scr11 scr11 scr11 scr11 O

View File

@ -17,7 +17,7 @@
009 '8' '(' nop nop '[' '*' nop nop O
010 '9' ')' nop nop ']' '(' nop nop O
011 '0' '=' nop nop '}' ')' nop nop O
012 ''' '?' ns ns '-' '_' ns ns O
012 ''' '?' us us '-' '_' us us O
013 '=' '+' nop nop '=' '+' nop nop O
014 bs bs del del bs bs del del O
015 ht btab nop nop ht btab nop nop O

View File

@ -17,7 +17,7 @@
009 '8' '(' nop nop '[' '*' nop nop O
010 '9' ')' nop nop ']' '(' nop nop O
011 '0' '=' nop nop '}' ')' nop nop O
012 ''' '?' ns ns '-' '_' ns ns O
012 ''' '?' us us '-' '_' us us O
013 '=' '+' nop nop '=' '+' nop nop O
014 bs bs del del bs bs del del O
015 ht btab nop nop ht btab nop nop O

View File

@ -15,7 +15,7 @@
009 '8' '*' nop nop '8' ';' nop nop O
010 '9' '(' nop nop '9' '?' nop nop O
011 '0' ')' nop nop '0' '%' nop nop O
012 '-' '_' ns ns '-' '_' ns ns O
012 '-' '_' us us '-' '_' us us O
013 '=' '+' nop nop '=' '+' nop nop O
014 bs bs del del bs bs del del O
015 ht btab nop nop btab btab nop nop O
@ -144,7 +144,7 @@
137 '8' ';' nop nop '8' '*' nop nop O
138 '9' '?' nop nop '9' '(' nop nop O
139 '0' '%' nop nop '0' ')' nop nop O
140 '-' '_' ns ns '-' '_' ns ns O
140 '-' '_' us us '-' '_' us us O
141 '=' '+' nop nop '=' '+' nop nop O
142 bs bs del del bs bs del del O
143 ht btab nop nop btab btab nop nop O

View File

@ -27,7 +27,7 @@
009 '8' '*' nop nop '8' '*' nop nop O
010 '9' '(' nop nop '9' '(' nop nop O
011 '0' ')' nop nop '0' ')' nop nop O
012 '-' '_' ns ns 0x0456 0x0406 0xf7 0xf7 O
012 '-' '_' us us 0x0456 0x0406 0xf7 0xf7 O
013 '=' '+' nop nop 0x0454 0x0404 nop nop O
014 bs bs del del bs bs 0x042a 0x042a O
015 ht btab nop nop ht btab nop nop O
@ -155,7 +155,7 @@
137 '8' '*' nop nop '8' '*' nop nop O
138 '9' '(' nop nop '9' '(' nop nop O
139 '0' ')' nop nop '0' ')' nop nop O
140 0x0456 0x0406 ns ns '-' '_' 0xf7 0xf7 O
140 0x0456 0x0406 us us '-' '_' 0xf7 0xf7 O
141 0x0454 0x0404 nop nop '=' '+' nop nop O
142 bs bs del del bs bs 0x042a 0x042a O
143 ht btab nop nop ht btab nop nop O

View File

@ -1484,6 +1484,7 @@ static caddr_t
native_parse_preload_data(u_int64_t modulep)
{
caddr_t kmdp;
char *envp;
#ifdef DDB
vm_offset_t ksym_start;
vm_offset_t ksym_end;
@ -1495,7 +1496,10 @@ native_parse_preload_data(u_int64_t modulep)
if (kmdp == NULL)
kmdp = preload_search_by_type("elf64 kernel");
boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int);
kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *) + KERNBASE;
envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *);
if (envp != NULL)
envp += KERNBASE;
init_static_kenv(envp, 0);
#ifdef DDB
ksym_start = MD_FETCH(kmdp, MODINFOMD_SSYM, uintptr_t);
ksym_end = MD_FETCH(kmdp, MODINFOMD_ESYM, uintptr_t);

View File

@ -194,6 +194,8 @@ int _min_bzero_size = 0;
extern int *end;
#ifdef FDT
static char *loader_envp;
vm_paddr_t pmap_pa;
#ifdef ARM_NEW_PMAP
@ -1002,6 +1004,8 @@ fake_preload_metadata(struct arm_boot_params *abp __unused)
fake_preload[i] = 0;
preload_metadata = (void *)fake_preload;
init_static_kenv(NULL, 0);
return (lastaddr);
}
@ -1074,6 +1078,8 @@ linux_parse_boot_param(struct arm_boot_params *abp)
bcopy(atag_list, atags,
(char *)walker - (char *)atag_list + ATAG_SIZE(walker));
init_static_kenv(NULL, 0);
return fake_preload_metadata(abp);
}
#endif
@ -1106,7 +1112,8 @@ freebsd_parse_boot_param(struct arm_boot_params *abp)
return 0;
boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int);
kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *);
loader_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *);
init_static_kenv(loader_envp, 0);
lastaddr = MD_FETCH(kmdp, MODINFOMD_KERNEND, vm_offset_t);
#ifdef DDB
ksym_start = MD_FETCH(kmdp, MODINFOMD_SSYM, uintptr_t);
@ -1429,13 +1436,13 @@ print_kenv(void)
char *cp;
debugf("loader passed (static) kenv:\n");
if (kern_envp == NULL) {
if (loader_envp == NULL) {
debugf(" no env, null ptr\n");
return;
}
debugf(" kern_envp = 0x%08x\n", (uint32_t)kern_envp);
debugf(" loader_envp = 0x%08x\n", (uint32_t)loader_envp);
for (cp = kern_envp; cp != NULL; cp = kenv_next(cp))
for (cp = loader_envp; cp != NULL; cp = kenv_next(cp))
debugf(" %x %s\n", (uint32_t)cp, cp);
}

View File

@ -161,7 +161,7 @@ static size_t
regions_to_avail(vm_paddr_t *avail, uint32_t exflags, long *pavail)
{
size_t acnt, exi, hwi;
vm_paddr_t end, start, xend, xstart;
uint64_t end, start, xend, xstart;
long availmem;
const struct region *exp, *hwp;
@ -171,7 +171,7 @@ regions_to_avail(vm_paddr_t *avail, uint32_t exflags, long *pavail)
for (hwi = 0, hwp = hwregions; hwi < hwcnt; ++hwi, ++hwp) {
start = hwp->addr;
end = hwp->size + start;
realmem += arm32_btop(end - start);
realmem += arm32_btop((vm_offset_t)(end - start));
for (exi = 0, exp = exregions; exi < excnt; ++exi, ++exp) {
/*
* If the excluded region does not match given flags,
@ -212,9 +212,10 @@ regions_to_avail(vm_paddr_t *avail, uint32_t exflags, long *pavail)
* could affect the remainder of this hw region.
*/
if ((xstart > start) && (xend < end)) {
avail[acnt++] = start;
avail[acnt++] = xstart;
availmem += arm32_btop(xstart - start);
avail[acnt++] = (vm_paddr_t)start;
avail[acnt++] = (vm_paddr_t)xstart;
availmem +=
arm32_btop((vm_offset_t)(xstart - start));
start = xend;
continue;
}
@ -233,9 +234,9 @@ regions_to_avail(vm_paddr_t *avail, uint32_t exflags, long *pavail)
* available entry for it.
*/
if (end > start) {
avail[acnt++] = start;
avail[acnt++] = end;
availmem += arm32_btop(end - start);
avail[acnt++] = (vm_paddr_t)start;
avail[acnt++] = (vm_paddr_t)end;
availmem += arm32_btop((vm_offset_t)(end - start));
}
if (acnt >= MAX_AVAIL_ENTRIES)
panic("Not enough space in the dump/phys_avail arrays");
@ -279,10 +280,22 @@ arm_physmem_hardware_region(vm_paddr_t pa, vm_size_t sz)
/*
* Filter out the page at PA 0x00000000. The VM can't handle it, as
* pmap_extract() == 0 means failure.
*
* Also filter out the page at the end of the physical address space --
* if addr is non-zero and addr+size is zero we wrapped to the next byte
* beyond what vm_paddr_t can express. That leads to a NULL pointer
* deref early in startup; work around it by leaving the last page out.
*
* XXX This just in: subtract out a whole megabyte, not just 1 page.
* Reducing the size by anything less than 1MB results in the NULL
* pointer deref in _vm_map_lock_read(). Better to give up a megabyte
* than leave some folks with an unusable system while we investigate.
*/
if (pa == 0) {
pa = PAGE_SIZE;
sz -= PAGE_SIZE;
} else if (pa + sz == 0) {
sz -= 1024 * 1024;
}
/*

View File

@ -225,8 +225,8 @@ initarm(struct arm_boot_params *abp)
pcpu_init(pcpup, 0, sizeof(struct pcpu));
PCPU_SET(curthread, &thread0);
if (envmode == 1)
kern_envp = static_env;
init_static_kenv(NULL, 0);
/* Do basic tuning, hz etc */
init_param1();
@ -426,10 +426,6 @@ initarm(struct arm_boot_params *abp)
init_param2(physmem);
kdb_init();
/* use static kernel environment if so configured */
if (envmode == 1)
kern_envp = static_env;
return ((void *)(kernelstack.pv_va + USPACE_SVC_STACK_TOP -
sizeof(struct pcb)));
#undef next_page

View File

@ -820,7 +820,7 @@ initarm(struct arm64_bootparams *abp)
kmdp = preload_search_by_type("elf64 kernel");
boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int);
kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *);
init_static_kenv(MD_FETCH(kmdp, MODINFOMD_ENVP, char *), 0);
#ifdef FDT
try_load_dtb(kmdp);

View File

@ -0,0 +1,54 @@
/*-
* Copyright (c) 2015 Ian Lepore <ian@freebsd.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/bus.h>
#include <machine/bus.h>
#include <dev/ofw/openfirm.h>
#include <dev/ofw/ofw_subr.h>
extern struct bus_space memmap_bus;
int
OF_decode_addr(phandle_t dev, int regno, bus_space_tag_t *tag,
bus_space_handle_t *handle)
{
bus_addr_t addr;
bus_size_t size;
int err;
err = ofw_reg_to_paddr(dev, regno, &addr, &size, NULL);
if (err != 0)
return (err);
*tag = &memmap_bus;
return (bus_space_map(*tag, addr, size, 0, handle));
}

View File

@ -41,7 +41,4 @@ struct mem_region {
vm_size_t mr_size;
};
/* FDT follows ePAPR */
#define OFW_EPAPR
#endif /* _MACHINE_OFW_MACHDEP_H_ */

View File

@ -359,10 +359,11 @@ command_mode(int argc, char *argv[])
return (CMD_OK);
}
for (i = 0; ; i++) {
printf("Current mode: %d\n", conout->Mode->Mode);
for (i = 0; i <= conout->Mode->MaxMode; i++) {
status = conout->QueryMode(conout, i, &cols, &rows);
if (EFI_ERROR(status))
break;
continue;
printf("Mode %d: %u columns, %u rows\n", i, (unsigned)cols,
(unsigned)rows);
}

View File

@ -1,151 +1,23 @@
# $FreeBSD$
# Originally from $NetBSD: Makefile,v 1.21 1997/10/26 22:08:38 lukem Exp $
#
# Notes:
# - We don't use the libc strerror/sys_errlist because the string table is
# quite large.
#
MAN=
.include <src.opts.mk>
MK_SSP= no
LIBSTAND_SRC= ${.CURDIR}/../../../lib/libstand
.if ${MACHINE_CPUARCH} == "amd64"
LIBSTAND_CPUARCH=i386
.else
LIBSTAND_CPUARCH=${MACHINE_CPUARCH}
.endif
LIBC_SRC= ${LIBSTAND_SRC}/../libc
.PATH: ${LIBSTAND_SRC}
LIB= stand
INTERNALLIB=
MK_PROFILE= no
NO_PIC=
MAN=
.PATH: ${LIBSTAND_SRC}
.if ${MACHINE_ARCH} == "amd64" || ${MACHINE_ARCH} == "powerpc64"
CFLAGS+= -m32 -I.
.endif
WARNS?= 0
# standalone components and stuff we have modified locally
SRCS+= gzguts.h zutil.h __main.c assert.c bcd.c bswap.c environment.c getopt.c gets.c \
globals.c pager.c printf.c strdup.c strerror.c strtol.c strtoul.c random.c \
sbrk.c twiddle.c zalloc.c zalloc_malloc.c
# private (pruned) versions of libc string functions
SRCS+= strcasecmp.c
.PATH: ${LIBC_SRC}/net
SRCS+= ntoh.c
# string functions from libc
.PATH: ${LIBC_SRC}/string
SRCS+= bcmp.c bcopy.c bzero.c ffs.c memccpy.c memchr.c memcmp.c memcpy.c \
memmove.c memset.c qdivrem.c strcat.c strchr.c strcmp.c strcpy.c \
strcspn.c strlcat.c strlcpy.c strlen.c strncat.c strncmp.c strncpy.c \
strpbrk.c strrchr.c strsep.c strspn.c strstr.c strtok.c swab.c
.if ${MACHINE_CPUARCH} == "arm"
.PATH: ${LIBC_SRC}/arm/gen
# Compiler support functions
.PATH: ${LIBSTAND_SRC}/../../contrib/compiler-rt/lib/builtins/
# __clzsi2 and ctzsi2 for various builtin functions
SRCS+= clzsi2.c ctzsi2.c
# Divide and modulus functions called by the compiler
SRCS+= divmoddi4.c divmodsi4.c divdi3.c divsi3.c moddi3.c modsi3.c
SRCS+= udivmoddi4.c udivmodsi4.c udivdi3.c udivsi3.c umoddi3.c umodsi3.c
.PATH: ${LIBSTAND_SRC}/../../contrib/compiler-rt/lib/builtins/arm/
SRCS+= aeabi_idivmod.S aeabi_ldivmod.S aeabi_uidivmod.S aeabi_uldivmod.S
SRCS+= aeabi_memcmp.S aeabi_memcpy.S aeabi_memmove.S aeabi_memset.S
.endif
.if ${MACHINE_CPUARCH} == "powerpc"
.PATH: ${LIBC_SRC}/quad
SRCS+= ashldi3.c ashrdi3.c
SRCS+= syncicache.c
.endif
# uuid functions from libc
.PATH: ${LIBC_SRC}/uuid
SRCS+= uuid_equal.c uuid_is_nil.c
# _setjmp/_longjmp
.if ${MACHINE_CPUARCH} == "amd64"
.PATH: ${LIBSTAND_SRC}/i386
.else
.PATH: ${LIBSTAND_SRC}/${MACHINE_CPUARCH}
.endif
SRCS+= _setjmp.S
# decompression functionality from libbz2
# NOTE: to actually test this functionality after libbz2 upgrade compile
# loader(8) with LOADER_BZIP2_SUPPORT defined
.PATH: ${LIBSTAND_SRC}/../../contrib/bzip2
CFLAGS+= -DBZ_NO_STDIO -DBZ_NO_COMPRESS
SRCS+= libstand_bzlib_private.h
.for file in bzlib.c crctable.c decompress.c huffman.c randtable.c
SRCS+= _${file}
CLEANFILES+= _${file}
_${file}: ${file}
sed "s|bzlib_private\.h|libstand_bzlib_private.h|" \
${.ALLSRC} > ${.TARGET}
.endfor
CLEANFILES+= libstand_bzlib_private.h
libstand_bzlib_private.h: bzlib_private.h
sed -e 's|<stdlib.h>|"stand.h"|' \
${.ALLSRC} > ${.TARGET}
# decompression functionality from libz
.PATH: ${LIBSTAND_SRC}/../libz
CFLAGS+=-DHAVE_MEMCPY -I${LIBSTAND_SRC}/../libz
SRCS+= adler32.c crc32.c libstand_zutil.h libstand_gzguts.h
.for file in infback.c inffast.c inflate.c inftrees.c zutil.c
SRCS+= _${file}
CLEANFILES+= _${file}
_${file}: ${file}
sed -e "s|zutil\.h|libstand_zutil.h|" \
-e "s|gzguts\.h|libstand_gzguts.h|" \
${.ALLSRC} > ${.TARGET}
.endfor
# depend on stand.h being able to be included multiple times
.for file in zutil.h gzguts.h
CLEANFILES+= libstand_${file}
libstand_${file}: ${file}
sed -e 's|<fcntl.h>|"stand.h"|' \
-e 's|<stddef.h>|"stand.h"|' \
-e 's|<string.h>|"stand.h"|' \
-e 's|<stdio.h>|"stand.h"|' \
-e 's|<stdlib.h>|"stand.h"|' \
${.ALLSRC} > ${.TARGET}
.endfor
# io routines
SRCS+= closeall.c dev.c ioctl.c nullfs.c stat.c \
fstat.c close.c lseek.c open.c read.c write.c readdir.c
# network routines
SRCS+= arp.c ether.c inet_ntoa.c in_cksum.c net.c udp.c netif.c rpc.c
# network info services:
SRCS+= bootp.c rarp.c bootparam.c
# boot filesystems
SRCS+= ufs.c nfs.c cd9660.c tftp.c gzipfs.c bzipfs.c
SRCS+= dosfs.c ext2fs.c
SRCS+= splitfs.c
SRCS+= pkgfs.c
.if ${MK_NAND} != "no"
SRCS+= nandfs.c
.endif
.include <bsd.stand.mk>
.include <bsd.lib.mk>
.include "${LIBSTAND_SRC}/Makefile"
.if ${MACHINE_CPUARCH} == "amd64"
CLEANFILES+= machine

View File

@ -69,11 +69,11 @@ uint64_t
uboot_loadaddr(u_int type, void *data, uint64_t addr)
{
struct sys_info *si;
uintptr_t sblock, eblock, subldr, eubldr;
uintptr_t biggest_block, this_block;
size_t biggest_size, this_size;
uint64_t sblock, eblock, subldr, eubldr;
uint64_t biggest_block, this_block;
uint64_t biggest_size, this_size;
int i;
char * envstr;
char *envstr;
if (addr == 0) {
/*
@ -100,14 +100,15 @@ uboot_loadaddr(u_int type, void *data, uint64_t addr)
biggest_block = 0;
biggest_size = 0;
subldr = rounddown2((uintptr_t)_start, KERN_ALIGN);
eubldr = roundup2(uboot_heap_end, KERN_ALIGN);
subldr = rounddown2((uint64_t)(uintptr_t)_start, KERN_ALIGN);
eubldr = roundup2((uint64_t)uboot_heap_end, KERN_ALIGN);
for (i = 0; i < si->mr_no; i++) {
if (si->mr[i].flags != MR_ATTR_DRAM)
continue;
sblock = roundup2(si->mr[i].start, KERN_ALIGN);
eblock = rounddown2(si->mr[i].start + si->mr[i].size,
sblock = roundup2((uint64_t)si->mr[i].start,
KERN_ALIGN);
eblock = rounddown2((uint64_t)si->mr[i].start +
si->mr[i].size, KERN_ALIGN);
if (biggest_size == 0)
sblock += KERN_MINADDR;
if (subldr >= sblock && subldr < eblock) {
@ -134,9 +135,10 @@ uboot_loadaddr(u_int type, void *data, uint64_t addr)
if (biggest_size == 0)
panic("Not enough DRAM to load kernel\n");
#if 0
printf("Loading kernel into region 0x%08x-0x%08x (%u MiB)\n",
biggest_block, biggest_block + biggest_size - 1,
biggest_size / 1024 / 1024);
printf("Loading kernel into region 0x%08jx-0x%08jx (%ju MiB)\n",
(uintmax_t)biggest_block,
(uintmax_t)biggest_block + biggest_size - 1,
(uintmax_t)biggest_size / 1024 / 1024);
#endif
return (biggest_block);
}

View File

@ -38,6 +38,7 @@ arm64/arm64/mem.c standard
arm64/arm64/minidump_machdep.c standard
arm64/arm64/mp_machdep.c optional smp
arm64/arm64/nexus.c standard
arm64/arm64/ofw_machdep.c optional fdt
arm64/arm64/pic_if.m standard
arm64/arm64/pmap.c standard
arm64/arm64/stack_machdep.c optional ddb | stack

View File

@ -270,12 +270,14 @@ ath_hal_reg_write(struct ath_hal *ah, u_int32_t reg, u_int32_t val)
bus_space_tag_t tag = BUSTAG(ah);
bus_space_handle_t h = ah->ah_sh;
#ifdef AH_DEBUG
/* Debug - complain if we haven't fully waken things up */
if (! ath_hal_reg_whilst_asleep(ah, reg) &&
ah->ah_powerMode != HAL_PM_AWAKE) {
ath_hal_printf(ah, "%s: reg=0x%08x, val=0x%08x, pm=%d\n",
__func__, reg, val, ah->ah_powerMode);
}
#endif
if (ath_hal_alq) {
struct ale *ale = ath_hal_alq_get(ah);
@ -291,6 +293,7 @@ ath_hal_reg_write(struct ath_hal *ah, u_int32_t reg, u_int32_t val)
if (ah->ah_config.ah_serialise_reg_war)
mtx_lock_spin(&ah_regser_mtx);
bus_space_write_4(tag, h, reg, val);
OS_BUS_BARRIER_REG(ah, reg, OS_BUS_BARRIER_WRITE);
if (ah->ah_config.ah_serialise_reg_war)
mtx_unlock_spin(&ah_regser_mtx);
}
@ -302,15 +305,18 @@ ath_hal_reg_read(struct ath_hal *ah, u_int32_t reg)
bus_space_handle_t h = ah->ah_sh;
u_int32_t val;
#ifdef AH_DEBUG
/* Debug - complain if we haven't fully waken things up */
if (! ath_hal_reg_whilst_asleep(ah, reg) &&
ah->ah_powerMode != HAL_PM_AWAKE) {
ath_hal_printf(ah, "%s: reg=0x%08x, pm=%d\n",
__func__, reg, ah->ah_powerMode);
}
#endif
if (ah->ah_config.ah_serialise_reg_war)
mtx_lock_spin(&ah_regser_mtx);
OS_BUS_BARRIER_REG(ah, reg, OS_BUS_BARRIER_READ);
val = bus_space_read_4(tag, h, reg);
if (ah->ah_config.ah_serialise_reg_war)
mtx_unlock_spin(&ah_regser_mtx);
@ -343,7 +349,8 @@ OS_MARK(struct ath_hal *ah, u_int id, u_int32_t v)
}
}
}
#elif defined(AH_DEBUG) || defined(AH_REGOPS_FUNC)
#else /* AH_DEBUG_ALQ */
/*
* Memory-mapped device register read/write. These are here
* as routines when debugging support is enabled and/or when
@ -361,16 +368,19 @@ ath_hal_reg_write(struct ath_hal *ah, u_int32_t reg, u_int32_t val)
bus_space_tag_t tag = BUSTAG(ah);
bus_space_handle_t h = ah->ah_sh;
#ifdef AH_DEBUG
/* Debug - complain if we haven't fully waken things up */
if (! ath_hal_reg_whilst_asleep(ah, reg) &&
ah->ah_powerMode != HAL_PM_AWAKE) {
ath_hal_printf(ah, "%s: reg=0x%08x, val=0x%08x, pm=%d\n",
__func__, reg, val, ah->ah_powerMode);
}
#endif
if (ah->ah_config.ah_serialise_reg_war)
mtx_lock_spin(&ah_regser_mtx);
bus_space_write_4(tag, h, reg, val);
OS_BUS_BARRIER_REG(ah, reg, OS_BUS_BARRIER_WRITE);
if (ah->ah_config.ah_serialise_reg_war)
mtx_unlock_spin(&ah_regser_mtx);
}
@ -382,21 +392,24 @@ ath_hal_reg_read(struct ath_hal *ah, u_int32_t reg)
bus_space_handle_t h = ah->ah_sh;
u_int32_t val;
#ifdef AH_DEBUG
/* Debug - complain if we haven't fully waken things up */
if (! ath_hal_reg_whilst_asleep(ah, reg) &&
ah->ah_powerMode != HAL_PM_AWAKE) {
ath_hal_printf(ah, "%s: reg=0x%08x, pm=%d\n",
__func__, reg, ah->ah_powerMode);
}
#endif
if (ah->ah_config.ah_serialise_reg_war)
mtx_lock_spin(&ah_regser_mtx);
OS_BUS_BARRIER_REG(ah, reg, OS_BUS_BARRIER_READ);
val = bus_space_read_4(tag, h, reg);
if (ah->ah_config.ah_serialise_reg_war)
mtx_unlock_spin(&ah_regser_mtx);
return val;
}
#endif /* AH_DEBUG || AH_REGOPS_FUNC */
#endif /* AH_DEBUG_ALQ */
#ifdef AH_ASSERT
void

View File

@ -110,25 +110,35 @@ struct ath_hal;
do { } while (0)
/*
* Register read/write operations are either handled through
* platform-dependent routines (or when debugging is enabled
* with AH_DEBUG); or they are inline expanded using the macros
* defined below.
* Read and write barriers. Some platforms require more strongly ordered
* operations and unfortunately most of the HAL is written assuming everything
* is either an x86 or the bus layer will do the barriers for you.
*
* Read barriers should occur before each read, and write barriers
* occur after each write.
*
* Later on for SDIO/USB parts we will methodize this and make them no-ops;
* register accesses will go via USB commands.
*/
#define OS_BUS_BARRIER_READ BUS_SPACE_BARRIER_READ
#define OS_BUS_BARRIER_WRITE BUS_SPACE_BARRIER_WRITE
#define OS_BUS_BARRIER_RW \
(BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE)
#define OS_BUS_BARRIER(_ah, _start, _len, _t) \
bus_space_barrier((bus_space_tag_t)(_ah)->ah_st, \
(bus_space_handle_t)(_ah)->ah_sh, (_start), (_len), (_t))
#define OS_BUS_BARRIER_REG(_ah, _reg, _t) \
OS_BUS_BARRIER((_ah), (_reg), 4, (_t))
/*
* Register read/write operations are handled through
* platform-dependent routines.
*/
#if defined(AH_DEBUG) || defined(AH_REGOPS_FUNC) || defined(AH_DEBUG_ALQ)
#define OS_REG_WRITE(_ah, _reg, _val) ath_hal_reg_write(_ah, _reg, _val)
#define OS_REG_READ(_ah, _reg) ath_hal_reg_read(_ah, _reg)
extern void ath_hal_reg_write(struct ath_hal *ah, u_int reg, u_int32_t val);
extern u_int32_t ath_hal_reg_read(struct ath_hal *ah, u_int reg);
#else
#define OS_REG_WRITE(_ah, _reg, _val) \
bus_space_write_4((bus_space_tag_t)(_ah)->ah_st, \
(bus_space_handle_t)(_ah)->ah_sh, (_reg), (_val))
#define OS_REG_READ(_ah, _reg) \
bus_space_read_4((bus_space_tag_t)(_ah)->ah_st, \
(bus_space_handle_t)(_ah)->ah_sh, (_reg))
#endif
#ifdef AH_DEBUG_ALQ
extern void OS_MARK(struct ath_hal *, u_int id, u_int32_t value);

View File

@ -270,7 +270,7 @@ static void iwm_mvm_rx_rx_phy_cmd(struct iwm_softc *,
static int iwm_get_noise(const struct iwm_mvm_statistics_rx_non_phy *);
static void iwm_mvm_rx_rx_mpdu(struct iwm_softc *, struct iwm_rx_packet *,
struct iwm_rx_data *);
static void iwm_mvm_rx_tx_cmd_single(struct iwm_softc *,
static int iwm_mvm_rx_tx_cmd_single(struct iwm_softc *,
struct iwm_rx_packet *,
struct iwm_node *);
static void iwm_mvm_rx_tx_cmd(struct iwm_softc *, struct iwm_rx_packet *,
@ -956,7 +956,7 @@ iwm_alloc_tx_ring(struct iwm_softc *sc, struct iwm_tx_ring *ring, int qid)
error = bus_dma_tag_create(sc->sc_dmat, 1, 0,
BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, MCLBYTES,
IWM_MAX_SCATTER - 1, MCLBYTES, 0, NULL, NULL, &ring->data_dmat);
IWM_MAX_SCATTER - 2, MCLBYTES, 0, NULL, NULL, &ring->data_dmat);
if (error != 0) {
device_printf(sc->sc_dev, "could not create TX buf DMA tag\n");
goto fail;
@ -2400,12 +2400,13 @@ iwm_mvm_rx_rx_mpdu(struct iwm_softc *sc,
IWM_LOCK(sc);
}
static void
static int
iwm_mvm_rx_tx_cmd_single(struct iwm_softc *sc, struct iwm_rx_packet *pkt,
struct iwm_node *in)
{
struct iwm_mvm_tx_resp *tx_resp = (void *)pkt->data;
struct ieee80211vap *vap = in->in_ni.ni_vap;
struct ieee80211_node *ni = &in->in_ni;
struct ieee80211vap *vap = ni->ni_vap;
int status = le16toh(tx_resp->status.status) & IWM_TX_STATUS_MSK;
int failack = tx_resp->failure_frame;
@ -2414,14 +2415,13 @@ iwm_mvm_rx_tx_cmd_single(struct iwm_softc *sc, struct iwm_rx_packet *pkt,
/* Update rate control statistics. */
if (status != IWM_TX_STATUS_SUCCESS &&
status != IWM_TX_STATUS_DIRECT_DONE) {
if_inc_counter(vap->iv_ifp, IFCOUNTER_OERRORS, 1);
ieee80211_ratectl_tx_complete(vap, &in->in_ni,
ieee80211_ratectl_tx_complete(vap, ni,
IEEE80211_RATECTL_TX_FAILURE, &failack, NULL);
return (1);
} else {
if_inc_counter(vap->iv_ifp, IFCOUNTER_OPACKETS, 1);
ieee80211_ratectl_tx_complete(vap, &in->in_ni,
ieee80211_ratectl_tx_complete(vap, ni,
IEEE80211_RATECTL_TX_SUCCESS, &failack, NULL);
return (0);
}
}
@ -2435,33 +2435,30 @@ iwm_mvm_rx_tx_cmd(struct iwm_softc *sc,
struct iwm_tx_ring *ring = &sc->txq[qid];
struct iwm_tx_data *txd = &ring->data[idx];
struct iwm_node *in = txd->in;
struct mbuf *m = txd->m;
int status;
KASSERT(txd->done == 0, ("txd not done"));
KASSERT(txd->in != NULL, ("txd without node"));
KASSERT(txd->m != NULL, ("txd without mbuf"));
if (txd->done) {
device_printf(sc->sc_dev,
"%s: got tx interrupt that's already been handled!\n",
__func__);
return;
}
bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_POSTREAD);
sc->sc_tx_timer = 0;
iwm_mvm_rx_tx_cmd_single(sc, pkt, in);
status = iwm_mvm_rx_tx_cmd_single(sc, pkt, in);
/* Unmap and free mbuf. */
bus_dmamap_sync(ring->data_dmat, txd->map, BUS_DMASYNC_POSTWRITE);
bus_dmamap_unload(ring->data_dmat, txd->map);
m_freem(txd->m);
IWM_DPRINTF(sc, IWM_DEBUG_XMIT,
"free txd %p, in %p\n", txd, txd->in);
KASSERT(txd->done == 0, ("txd not done"));
txd->done = 1;
KASSERT(txd->in, ("txd without node"));
txd->m = NULL;
txd->in = NULL;
ieee80211_free_node((struct ieee80211_node *)in);
ieee80211_tx_complete(&in->in_ni, m, status);
if (--ring->queued < IWM_TX_RING_LOMARK) {
sc->qfullmsk &= ~(1 << ring->qid);
@ -2649,7 +2646,7 @@ iwm_tx(struct iwm_softc *sc, struct mbuf *m, struct ieee80211_node *ni, int ac)
{
struct ieee80211com *ic = &sc->sc_ic;
struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
struct iwm_node *in = (struct iwm_node *)ni;
struct iwm_node *in = IWM_NODE(ni);
struct iwm_tx_ring *ring;
struct iwm_tx_data *data;
struct iwm_tfd *desc;
@ -2706,7 +2703,6 @@ iwm_tx(struct iwm_softc *sc, struct mbuf *m, struct ieee80211_node *ni, int ac)
tap->wt_chan_freq = htole16(ni->ni_chan->ic_freq);
tap->wt_chan_flags = htole16(ni->ni_chan->ic_flags);
tap->wt_rate = rinfo->rate;
tap->wt_hwqueue = ac;
if (k != NULL)
tap->wt_flags |= IEEE80211_RADIOTAP_F_WEP;
ieee80211_radiotap_tx(vap, m);
@ -2782,23 +2778,15 @@ iwm_tx(struct iwm_softc *sc, struct mbuf *m, struct ieee80211_node *ni, int ac)
return error;
}
/* Too many DMA segments, linearize mbuf. */
MGETHDR(m1, M_NOWAIT, MT_DATA);
m1 = m_collapse(m, M_NOWAIT, IWM_MAX_SCATTER - 2);
if (m1 == NULL) {
device_printf(sc->sc_dev,
"%s: could not defrag mbuf\n", __func__);
m_freem(m);
return ENOBUFS;
return (ENOBUFS);
}
if (m->m_pkthdr.len > MHLEN) {
MCLGET(m1, M_NOWAIT);
if (!(m1->m_flags & M_EXT)) {
m_freem(m);
m_freem(m1);
return ENOBUFS;
}
}
m_copydata(m, 0, m->m_pkthdr.len, mtod(m1, void *));
m1->m_pkthdr.len = m1->m_len = m->m_pkthdr.len;
m_freem(m);
m = m1;
error = bus_dmamap_load_mbuf_sg(ring->data_dmat, data->map, m,
segs, &nsegs, BUS_DMA_NOWAIT);
if (error != 0) {
@ -3182,7 +3170,7 @@ iwm_auth(struct ieee80211vap *vap, struct iwm_softc *sc)
* freed from underneath us. Grr.
*/
ni = ieee80211_ref_node(vap->iv_bss);
in = (struct iwm_node *) ni;
in = IWM_NODE(ni);
IWM_DPRINTF(sc, IWM_DEBUG_RESET | IWM_DEBUG_STATE,
"%s: called; vap=%p, bss ni=%p\n",
__func__,
@ -3289,7 +3277,7 @@ iwm_auth(struct ieee80211vap *vap, struct iwm_softc *sc)
static int
iwm_assoc(struct ieee80211vap *vap, struct iwm_softc *sc)
{
struct iwm_node *in = (struct iwm_node *)vap->iv_bss;
struct iwm_node *in = IWM_NODE(vap->iv_bss);
int error;
if ((error = iwm_mvm_update_sta(sc, in)) != 0) {
@ -3515,7 +3503,7 @@ iwm_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
if (vap->iv_state == IEEE80211_S_RUN && nstate != vap->iv_state) {
iwm_mvm_disable_beacon_filter(sc);
if (((in = (void *)vap->iv_bss) != NULL))
if (((in = IWM_NODE(vap->iv_bss)) != NULL))
in->in_assoc = 0;
iwm_release(sc, NULL);
@ -3591,7 +3579,7 @@ iwm_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
break;
}
in = (struct iwm_node *)vap->iv_bss;
in = IWM_NODE(vap->iv_bss);
iwm_mvm_power_mac_update_mode(sc, in);
iwm_mvm_enable_beacon_filter(sc, in);
iwm_mvm_update_quotas(sc, in);
@ -4596,7 +4584,7 @@ iwm_attach(device_t dev)
int txq_i, i;
sc->sc_dev = dev;
mtx_init(&sc->sc_mtx, "iwm_mtx", MTX_DEF, 0);
IWM_LOCK_INIT(sc);
mbufq_init(&sc->sc_snd, ifqmaxlen);
callout_init_mtx(&sc->sc_watchdog_to, &sc->sc_mtx, 0);
TASK_INIT(&sc->sc_es_task, 0, iwm_endscan_cb, sc);
@ -4985,7 +4973,7 @@ iwm_detach_local(struct iwm_softc *sc, int do_net80211)
iwm_pci_detach(dev);
mbufq_drain(&sc->sc_snd);
mtx_destroy(&sc->sc_mtx);
IWM_LOCK_DESTROY(sc);
return (0);
}

View File

@ -426,7 +426,7 @@ iwm_mvm_mac_ctxt_cmd_station(struct iwm_softc *sc, struct ieee80211vap *vap,
uint32_t action)
{
struct ieee80211_node *ni = vap->iv_bss;
struct iwm_node *in = (struct iwm_node *) ni;
struct iwm_node *in = IWM_NODE(ni);
struct iwm_mac_ctx_cmd cmd;
IWM_DPRINTF(sc, IWM_DEBUG_RESET,

View File

@ -129,7 +129,6 @@ struct iwm_tx_radiotap_header {
uint8_t wt_rate;
uint16_t wt_chan_freq;
uint16_t wt_chan_flags;
uint8_t wt_hwqueue;
} __packed;
#define IWM_TX_RADIOTAP_PRESENT \
@ -152,9 +151,6 @@ struct iwm_tx_radiotap_header {
#define IWM_FW_STATUS_INPROGRESS 1
#define IWM_FW_STATUS_DONE 2
#define IWM_LOCK(_sc) mtx_lock(&sc->sc_mtx)
#define IWM_UNLOCK(_sc) mtx_unlock(&sc->sc_mtx)
enum iwm_ucode_type {
IWM_UCODE_TYPE_INIT,
IWM_UCODE_TYPE_REGULAR,
@ -244,12 +240,12 @@ struct iwm_dma_info {
#define IWM_TX_RING_HIMARK 224
struct iwm_tx_data {
bus_dmamap_t map;
bus_addr_t cmd_paddr;
bus_addr_t scratch_paddr;
struct mbuf *m;
struct iwm_node *in;
int done;
bus_dmamap_t map;
bus_addr_t cmd_paddr;
bus_addr_t scratch_paddr;
struct mbuf *m;
struct iwm_node *in;
int done;
};
struct iwm_tx_ring {
@ -295,12 +291,6 @@ struct iwm_rx_ring {
int cur;
};
#define IWM_FLAG_USE_ICT 0x01
#define IWM_FLAG_HW_INITED 0x02
#define IWM_FLAG_STOPPED 0x04
#define IWM_FLAG_RFKILL 0x08
#define IWM_FLAG_BUSY 0x10
struct iwm_ucode_status {
uint32_t uc_error_event_table;
uint32_t uc_log_event_table;
@ -371,68 +361,97 @@ struct iwm_bf_data {
};
struct iwm_vap {
struct ieee80211vap iv_vap;
uint8_t macaddr[IEEE80211_ADDR_LEN];
int is_uploaded;
struct ieee80211vap iv_vap;
int is_uploaded;
int (*iv_newstate)(struct ieee80211vap *, enum ieee80211_state, int);
int (*iv_newstate)(struct ieee80211vap *,
enum ieee80211_state, int);
};
#define IWM_VAP(_vap) ((struct iwm_vap *)(_vap))
#define IWM_VAP(_vap) ((struct iwm_vap *)(_vap))
struct iwm_node {
struct ieee80211_node in_ni;
struct iwm_mvm_phy_ctxt *in_phyctxt;
/* status "bits" */
int in_assoc;
struct iwm_lq_cmd in_lq;
uint8_t in_ridx[IEEE80211_RATE_MAXSIZE];
};
#define IWM_NODE(_ni) ((struct iwm_node *)(_ni))
#define IWM_STATION_ID 0
#define IWM_DEFAULT_MACID 0
#define IWM_DEFAULT_COLOR 0
#define IWM_DEFAULT_TSFID 0
#define IWM_ICT_SIZE 4096
#define IWM_ICT_COUNT (IWM_ICT_SIZE / sizeof (uint32_t))
#define IWM_ICT_PADDR_SHIFT 12
struct iwm_softc {
device_t sc_dev;
uint32_t sc_debug;
struct mtx sc_mtx;
struct mbufq sc_snd;
struct ieee80211com sc_ic;
device_t sc_dev;
int sc_flags;
#define IWM_FLAG_USE_ICT (1 << 0)
#define IWM_FLAG_HW_INITED (1 << 1)
#define IWM_FLAG_STOPPED (1 << 2)
#define IWM_FLAG_RFKILL (1 << 3)
#define IWM_FLAG_BUSY (1 << 4)
struct intr_config_hook sc_preinit_hook;
struct callout sc_watchdog_to;
struct callout sc_watchdog_to;
struct task init_task;
struct resource *sc_irq;
struct resource *sc_mem;
bus_space_tag_t sc_st;
bus_space_handle_t sc_sh;
bus_size_t sc_sz;
bus_dma_tag_t sc_dmat;
void *sc_ih;
struct resource *sc_irq;
struct resource *sc_mem;
bus_space_tag_t sc_st;
bus_space_handle_t sc_sh;
bus_size_t sc_sz;
bus_dma_tag_t sc_dmat;
void *sc_ih;
/* TX scheduler rings. */
struct iwm_dma_info sched_dma;
uint32_t sched_base;
struct iwm_dma_info sched_dma;
uint32_t sched_base;
/* TX/RX rings. */
struct iwm_tx_ring txq[IWM_MVM_MAX_QUEUES];
struct iwm_rx_ring rxq;
int qfullmsk;
struct iwm_tx_ring txq[IWM_MVM_MAX_QUEUES];
struct iwm_rx_ring rxq;
int qfullmsk;
int sc_sf_state;
int sc_sf_state;
/* ICT table. */
struct iwm_dma_info ict_dma;
int ict_cur;
int sc_hw_rev;
int sc_hw_id;
int sc_hw_rev;
int sc_hw_id;
struct iwm_dma_info kw_dma;
struct iwm_dma_info fw_dma;
struct iwm_dma_info kw_dma;
struct iwm_dma_info fw_dma;
int sc_fw_chunk_done;
int sc_init_complete;
int sc_fw_chunk_done;
int sc_init_complete;
struct iwm_ucode_status sc_uc;
enum iwm_ucode_type sc_uc_current;
int sc_fwver;
struct iwm_ucode_status sc_uc;
enum iwm_ucode_type sc_uc_current;
int sc_fwver;
int sc_capaflags;
int sc_capa_max_probe_len;
int sc_capaflags;
int sc_capa_max_probe_len;
int sc_intmask;
int sc_flags;
uint32_t sc_debug;
int sc_intmask;
/*
* So why do we need a separate stopped flag and a generation?
@ -443,86 +462,63 @@ struct iwm_softc {
* the device from interrupt context when it craps out, so we
* don't have the luxury of waiting for quiescense.
*/
int sc_generation;
int sc_generation;
const char *sc_fwname;
bus_size_t sc_fwdmasegsz;
struct iwm_fw_info sc_fw;
int sc_fw_phy_config;
const char *sc_fwname;
bus_size_t sc_fwdmasegsz;
struct iwm_fw_info sc_fw;
int sc_fw_phy_config;
struct iwm_tlv_calib_ctrl sc_default_calib[IWM_UCODE_TYPE_MAX];
struct iwm_nvm_data sc_nvm;
struct iwm_phy_db sc_phy_db;
struct iwm_nvm_data sc_nvm;
struct iwm_phy_db sc_phy_db;
struct iwm_bf_data sc_bf;
struct iwm_bf_data sc_bf;
int sc_tx_timer;
int sc_tx_timer;
struct iwm_scan_cmd *sc_scan_cmd;
size_t sc_scan_cmd_len;
int sc_scan_last_antenna;
int sc_scanband;
struct iwm_scan_cmd *sc_scan_cmd;
size_t sc_scan_cmd_len;
int sc_scan_last_antenna;
int sc_scanband;
int sc_auth_prot;
int sc_auth_prot;
int sc_fixed_ridx;
int sc_fixed_ridx;
int sc_staid;
int sc_nodecolor;
int sc_staid;
int sc_nodecolor;
uint8_t sc_cmd_resp[IWM_CMD_RESP_MAX];
int sc_wantresp;
uint8_t sc_cmd_resp[IWM_CMD_RESP_MAX];
int sc_wantresp;
struct taskqueue *sc_tq;
struct task sc_es_task;
struct taskqueue *sc_tq;
struct task sc_es_task;
struct iwm_rx_phy_info sc_last_phy_info;
int sc_ampdu_ref;
struct iwm_rx_phy_info sc_last_phy_info;
int sc_ampdu_ref;
struct iwm_int_sta sc_aux_sta;
struct iwm_int_sta sc_aux_sta;
/* phy contexts. we only use the first one */
struct iwm_mvm_phy_ctxt sc_phyctxt[IWM_NUM_PHY_CTX];
struct iwm_mvm_phy_ctxt sc_phyctxt[IWM_NUM_PHY_CTX];
struct iwm_notif_statistics sc_stats;
int sc_noise;
int sc_noise;
int host_interrupt_operation_mode;
int host_interrupt_operation_mode;
caddr_t sc_drvbpf;
union {
struct iwm_rx_radiotap_header th;
uint8_t pad[IEEE80211_RADIOTAP_HDRLEN];
} sc_rxtapu;
#define sc_rxtap sc_rxtapu.th
struct iwm_rx_radiotap_header sc_rxtap;
struct iwm_tx_radiotap_header sc_txtap;
union {
struct iwm_tx_radiotap_header th;
uint8_t pad[IEEE80211_RADIOTAP_HDRLEN];
} sc_txtapu;
#define sc_txtap sc_txtapu.th
int sc_max_rssi;
int sc_max_rssi;
};
#define IWM_DEFAULT_MACID 0
#define IWM_DEFAULT_COLOR 0
#define IWM_DEFAULT_TSFID 0
struct iwm_node {
struct ieee80211_node in_ni;
struct iwm_mvm_phy_ctxt *in_phyctxt;
/* status "bits" */
int in_assoc;
struct iwm_lq_cmd in_lq;
uint8_t in_ridx[IEEE80211_RATE_MAXSIZE];
};
#define IWM_STATION_ID 0
#define IWM_ICT_SIZE 4096
#define IWM_ICT_COUNT (IWM_ICT_SIZE / sizeof (uint32_t))
#define IWM_ICT_PADDR_SHIFT 12
#define IWM_LOCK_INIT(_sc) \
mtx_init(&(_sc)->sc_mtx, device_get_nameunit((_sc)->sc_dev), \
MTX_NETWORK_LOCK, MTX_DEF);
#define IWM_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx)
#define IWM_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx)
#define IWM_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->sc_mtx)

View File

@ -6606,7 +6606,11 @@ ixl_iov_uninit(device_t dev)
pf->veb_seid = 0;
}
#if __FreeBSD_version > 1100022
if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) == 0)
#else
if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
#endif
ixl_disable_intr(vsi);
vfs = pf->vfs;

View File

@ -361,10 +361,11 @@ ofw_bus_search_intrmap(void *intr, int intrsz, void *regs, int physsz,
paddrsz = 0;
while (i > 0) {
bcopy(mptr + physsz + intrsz, &parent, sizeof(parent));
#ifdef OFW_EPAPR
#ifndef OFW_IMAP_NO_IPARENT_ADDR_CELLS
/*
* Find if we need to read the parent address data. Sparc64
* uses a different encoding that doesn't include this data.
* Find if we need to read the parent address data.
* CHRP-derived OF bindings, including ePAPR-compliant FDTs,
* use this as an optional part of the specifier.
*/
if (OF_getencprop(OF_node_from_xref(parent),
"#address-cells", &paddrsz, sizeof(paddrsz)) == -1)

View File

@ -227,20 +227,6 @@ macaddr_atoi(const char *str, uint8_t *mac)
}
#ifdef USE_GENERATED_MAC_ADDRESS
static char *
kernenv_next(char *cp)
{
if (cp != NULL) {
while (*cp != 0)
cp++;
cp++;
if (*cp == 0)
cp = NULL;
}
return (cp);
}
/*
* generate_mac(uin8_t *mac)
* This is MAC address generator for cases when real device MAC address
@ -259,14 +245,8 @@ generate_mac(uint8_t *mac)
uint32_t crc = 0xffffffff;
/* Generate CRC32 on kenv */
if (dynamic_kenv) {
for (cp = kenvp[0]; cp != NULL; cp = kenvp[++i]) {
crc = calculate_crc32c(crc, cp, strlen(cp) + 1);
}
} else {
for (cp = kern_envp; cp != NULL; cp = kernenv_next(cp)) {
crc = calculate_crc32c(crc, cp, strlen(cp) + 1);
}
for (cp = kenvp[0]; cp != NULL; cp = kenvp[++i]) {
crc = calculate_crc32c(crc, cp, strlen(cp) + 1);
}
crc = ~crc;

View File

@ -44,6 +44,7 @@ __FBSDID("$FreeBSD$");
#include <sys/random.h>
#include <sys/rman.h>
#include <machine/_inttypes.h>
#include <machine/bus.h>
#include <machine/resource.h>
@ -235,7 +236,7 @@ sec_probe(device_t dev)
sc->sc_version = 3;
break;
default:
device_printf(dev, "unknown SEC ID 0x%016llx!\n", id);
device_printf(dev, "unknown SEC ID 0x%016"PRIx64"!\n", id);
return (ENXIO);
}

View File

@ -71,41 +71,65 @@ fp16_sqrt(fp16_t x)
return (y);
}
static fp16_t fp16_cos_table[256] = {
65536, 65534, 65531, 65524, 65516, 65505, 65491, 65475,
65457, 65436, 65412, 65386, 65358, 65327, 65294, 65258,
65220, 65179, 65136, 65091, 65043, 64992, 64939, 64884,
64826, 64766, 64703, 64638, 64571, 64501, 64428, 64353,
64276, 64197, 64115, 64030, 63943, 63854, 63762, 63668,
63571, 63473, 63371, 63268, 63162, 63053, 62942, 62829,
62714, 62596, 62475, 62353, 62228, 62100, 61971, 61839,
61705, 61568, 61429, 61288, 61144, 60998, 60850, 60700,
60547, 60392, 60235, 60075, 59913, 59749, 59583, 59414,
59243, 59070, 58895, 58718, 58538, 58356, 58172, 57986,
57797, 57606, 57414, 57219, 57022, 56822, 56621, 56417,
56212, 56004, 55794, 55582, 55368, 55152, 54933, 54713,
54491, 54266, 54040, 53811, 53581, 53348, 53114, 52877,
52639, 52398, 52155, 51911, 51665, 51416, 51166, 50914,
50660, 50403, 50146, 49886, 49624, 49360, 49095, 48828,
48558, 48288, 48015, 47740, 47464, 47186, 46906, 46624,
46340, 46055, 45768, 45480, 45189, 44897, 44603, 44308,
44011, 43712, 43412, 43110, 42806, 42501, 42194, 41885,
41575, 41263, 40950, 40636, 40319, 40002, 39682, 39362,
39039, 38716, 38390, 38064, 37736, 37406, 37075, 36743,
36409, 36074, 35738, 35400, 35061, 34721, 34379, 34036,
33692, 33346, 32999, 32651, 32302, 31952, 31600, 31247,
30893, 30538, 30181, 29824, 29465, 29105, 28745, 28383,
28020, 27656, 27291, 26925, 26557, 26189, 25820, 25450,
25079, 24707, 24334, 23960, 23586, 23210, 22833, 22456,
22078, 21699, 21319, 20938, 20557, 20175, 19792, 19408,
19024, 18638, 18253, 17866, 17479, 17091, 16702, 16313,
15923, 15533, 15142, 14751, 14359, 13966, 13573, 13179,
12785, 12390, 11995, 11600, 11204, 10807, 10410, 10013,
9616, 9218, 8819, 8421, 8022, 7623, 7223, 6823,
6423, 6023, 5622, 5222, 4821, 4420, 4018, 3617,
3215, 2814, 2412, 2010, 1608, 1206, 804, 402,
static fp16_t fp16_sin_table[256] = {
0, 402, 804, 1206, 1608, 2010, 2412, 2814,
3215, 3617, 4018, 4420, 4821, 5222, 5622, 6023,
6423, 6823, 7223, 7623, 8022, 8421, 8819, 9218,
9616, 10013, 10410, 10807, 11204, 11600, 11995, 12390,
12785, 13179, 13573, 13966, 14359, 14751, 15142, 15533,
15923, 16313, 16702, 17091, 17479, 17866, 18253, 18638,
19024, 19408, 19792, 20175, 20557, 20938, 21319, 21699,
22078, 22456, 22833, 23210, 23586, 23960, 24334, 24707,
25079, 25450, 25820, 26189, 26557, 26925, 27291, 27656,
28020, 28383, 28745, 29105, 29465, 29824, 30181, 30538,
30893, 31247, 31600, 31952, 32302, 32651, 32999, 33346,
33692, 34036, 34379, 34721, 35061, 35400, 35738, 36074,
36409, 36743, 37075, 37406, 37736, 38064, 38390, 38716,
39039, 39362, 39682, 40002, 40319, 40636, 40950, 41263,
41575, 41885, 42194, 42501, 42806, 43110, 43412, 43712,
44011, 44308, 44603, 44897, 45189, 45480, 45768, 46055,
46340, 46624, 46906, 47186, 47464, 47740, 48015, 48288,
48558, 48828, 49095, 49360, 49624, 49886, 50146, 50403,
50660, 50914, 51166, 51416, 51665, 51911, 52155, 52398,
52639, 52877, 53114, 53348, 53581, 53811, 54040, 54266,
54491, 54713, 54933, 55152, 55368, 55582, 55794, 56004,
56212, 56417, 56621, 56822, 57022, 57219, 57414, 57606,
57797, 57986, 58172, 58356, 58538, 58718, 58895, 59070,
59243, 59414, 59583, 59749, 59913, 60075, 60235, 60392,
60547, 60700, 60850, 60998, 61144, 61288, 61429, 61568,
61705, 61839, 61971, 62100, 62228, 62353, 62475, 62596,
62714, 62829, 62942, 63053, 63162, 63268, 63371, 63473,
63571, 63668, 63762, 63854, 63943, 64030, 64115, 64197,
64276, 64353, 64428, 64501, 64571, 64638, 64703, 64766,
64826, 64884, 64939, 64992, 65043, 65091, 65136, 65179,
65220, 65258, 65294, 65327, 65358, 65386, 65412, 65436,
65457, 65475, 65491, 65505, 65516, 65524, 65531, 65534,
};
/*
* Compute the sine of theta.
*/
fp16_t
fp16_sin(fp16_t theta)
{
unsigned int i;
i = 1024 * (theta % FP16_2PI) / FP16_2PI;
switch (i / 256) {
case 0:
return (fp16_sin_table[i % 256]);
case 1:
return (fp16_sin_table[255 - i % 256]);
case 2:
return (-fp16_sin_table[i % 256]);
case 3:
return (-fp16_sin_table[255 - i % 256]);
default:
/* inconceivable! */
return (0);
}
}
/*
* Compute the cosine of theta.
*/
@ -117,13 +141,13 @@ fp16_cos(fp16_t theta)
i = 1024 * (theta % FP16_2PI) / FP16_2PI;
switch (i / 256) {
case 0:
return (fp16_cos_table[i % 256]);
return (fp16_sin_table[255 - i % 256]);
case 1:
return (-fp16_cos_table[255 - i % 256]);
return (-fp16_sin_table[i % 256]);
case 2:
return (-fp16_cos_table[i % 256]);
return (-fp16_sin_table[255 - i % 256]);
case 3:
return (fp16_cos_table[255 - i % 256]);
return (fp16_sin_table[i % 256]);
default:
/* inconceivable! */
return (0);

View File

@ -78,7 +78,8 @@ fp16_t fp16_sqrt(fp16_t);
#define FP16_PI_2 102943
#define FP16_PI_4 51471
/* cosine */
/* sine and cosine */
fp16_t fp16_sin(fp16_t);
fp16_t fp16_cos(fp16_t);
#endif

View File

@ -104,7 +104,7 @@ plasma_update(video_adapter_t *adp)
sqd = ItoFP16(dx * dx + dy * dy);
d = fp16_sqrt(sqd);
/* divide by 4 to stretch out the pattern */
m = fp16_add(m, fp16_cos(d / 4));
m = fp16_sub(m, fp16_cos(d / 4));
}
/*
* m is now in the range +/- FOCI, but we need a

View File

@ -561,7 +561,7 @@ tsec_set_mac_address(struct tsec_softc *sc)
TSEC_GLOBAL_LOCK_ASSERT(sc);
KASSERT((ETHER_ADDR_LEN <= sizeof(macbuf)),
("tsec_set_mac_address: (%d <= %d", ETHER_ADDR_LEN,
("tsec_set_mac_address: (%d <= %zd", ETHER_ADDR_LEN,
sizeof(macbuf)));
macbufp = (char *)macbuf;

View File

@ -244,18 +244,18 @@ devfs_populate_vp(struct vnode *vp)
if (DEVFS_DMP_DROP(dmp)) {
sx_xunlock(&dmp->dm_lock);
devfs_unmount_final(dmp);
return (EBADF);
return (ERESTART);
}
if ((vp->v_iflag & VI_DOOMED) != 0) {
sx_xunlock(&dmp->dm_lock);
return (EBADF);
return (ERESTART);
}
de = vp->v_data;
KASSERT(de != NULL,
("devfs_populate_vp: vp->v_data == NULL but vnode not doomed"));
if ((de->de_flags & DE_DOOMED) != 0) {
sx_xunlock(&dmp->dm_lock);
return (EBADF);
return (ERESTART);
}
return (0);
@ -1147,7 +1147,7 @@ devfs_open(struct vop_open_args *ap)
error = dsw->d_fdopen(dev, ap->a_mode, td, fp);
else
error = dsw->d_open(dev, ap->a_mode, S_IFCHR, td);
/* cleanup any cdevpriv upon error */
/* Clean up any cdevpriv upon error. */
if (error != 0)
devfs_clear_cdevpriv();
td->td_fpop = fpop;

View File

@ -2462,10 +2462,11 @@ init386(first)
} else {
metadata_missing = 1;
}
if (envmode == 1)
kern_envp = static_env;
else if (bootinfo.bi_envp)
kern_envp = (caddr_t)bootinfo.bi_envp + KERNBASE;
if (bootinfo.bi_envp)
init_static_kenv((caddr_t)bootinfo.bi_envp + KERNBASE, 0);
else
init_static_kenv(NULL, 0);
/* Init basic tunables, hz etc */
init_param1();

View File

@ -210,12 +210,44 @@ sys_kenv(td, uap)
return (error);
}
/*
* Populate the initial kernel environment.
*
* This is called very early in MD startup, either to provide a copy of the
* environment obtained from a boot loader, or to provide an empty buffer into
* which MD code can store an initial environment using kern_setenv() calls.
*
* If the global envmode is 1, the environment is initialized from the global
* static_env[], regardless of the arguments passed. This implements the env
* keyword described in config(5). In this case env_pos is set to env_len,
* causing kern_setenv() to return -1 (if len > 0) or panic (if len == 0) until
* the dynamic environment is available. The envmode and static_env variables
* are defined in env.c which is generated by config(8).
*
* If len is non-zero, the caller is providing an empty buffer. The caller will
* subsequently use kern_setenv() to add up to len bytes of initial environment
* before the dynamic environment is available.
*
* If len is zero, the caller is providing a pre-loaded buffer containing
* environment strings. Additional strings cannot be added until the dynamic
* environment is available. The memory pointed to must remain stable at least
* until sysinit runs init_dynamic_kenv(). If no initial environment is
* available from the boot loader, passing a NULL pointer allows the static_env
* to be installed if it is configured.
*/
void
init_static_kenv(char *buf, size_t len)
{
kern_envp = buf;
env_len = len;
env_pos = 0;
if (envmode == 1) {
kern_envp = static_env;
env_len = len;
env_pos = len;
} else {
kern_envp = buf;
env_len = len;
env_pos = 0;
}
}
/*

View File

@ -105,14 +105,17 @@ sys_gssd_syscall(struct thread *td, struct gssd_syscall_args *uap)
if (error)
return (error);
sun.sun_family = AF_LOCAL;
strcpy(sun.sun_path, path);
sun.sun_len = SUN_LEN(&sun);
nconf = getnetconfigent("local");
cl = clnt_reconnect_create(nconf,
(struct sockaddr *) &sun, GSSD, GSSDVERS,
RPC_MAXDATASIZE, RPC_MAXDATASIZE);
if (path[0] != '\0') {
sun.sun_family = AF_LOCAL;
strcpy(sun.sun_path, path);
sun.sun_len = SUN_LEN(&sun);
nconf = getnetconfigent("local");
cl = clnt_reconnect_create(nconf,
(struct sockaddr *) &sun, GSSD, GSSDVERS,
RPC_MAXDATASIZE, RPC_MAXDATASIZE);
} else
cl = NULL;
mtx_lock(&kgss_gssd_lock);
oldcl = kgss_gssd_handle;

View File

@ -273,7 +273,7 @@ platform_start(__register_t a0, __register_t a1, __register_t a2,
* Configure more boot-time parameters passed in by loader.
*/
boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int);
kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *);
init_static_kenv(MD_FETCH(kmdp, MODINFOMD_ENVP, char *), 0);
/*
* Get bootargs from FDT if specified.

View File

@ -312,7 +312,7 @@ SUBDIR= \
reiserfs \
rl \
rtwn \
rtwnfw \
${_rtwnfw} \
${_s3} \
${_safe} \
${_sbni} \
@ -484,6 +484,7 @@ _fxp= fxp
_ispfw= ispfw
_mwlfw= mwlfw
_ralfw= ralfw
_rtwnfw= rtwnfw
_sf= sf
_ti= ti
_txp= txp

View File

@ -147,6 +147,8 @@ static void rt_notifydelete(struct rtentry *rt, struct rt_addrinfo *info);
static struct radix_node *rt_mpath_unlink(struct radix_node_head *rnh,
struct rt_addrinfo *info, struct rtentry *rto, int *perror);
#endif
static int rt_exportinfo(struct rtentry *rt, struct rt_addrinfo *info,
int flags);
struct if_mtuinfo
{
@ -831,6 +833,147 @@ rtrequest_fib(int req,
}
/*
* Copy most of @rt data into @info.
*
* If @flags contains NHR_COPY, copies dst,netmask and gw to the
* pointers specified by @info structure. Assume such pointers
* are zeroed sockaddr-like structures with sa_len field initialized
* to reflect size of the provided buffer. if no NHR_COPY is specified,
* point dst,netmask and gw @info fields to appropriate @rt values.
*
* if @flags contains NHR_REF, do refcouting on rt_ifp.
*
* Returns 0 on success.
*/
int
rt_exportinfo(struct rtentry *rt, struct rt_addrinfo *info, int flags)
{
struct rt_metrics *rmx;
struct sockaddr *src, *dst;
int sa_len;
if (flags & NHR_COPY) {
/* Copy destination if dst is non-zero */
src = rt_key(rt);
dst = info->rti_info[RTAX_DST];
sa_len = src->sa_len;
if (src != NULL && dst != NULL) {
if (src->sa_len > dst->sa_len)
return (ENOMEM);
memcpy(dst, src, src->sa_len);
info->rti_addrs |= RTA_DST;
}
/* Copy mask if set && dst is non-zero */
src = rt_mask(rt);
dst = info->rti_info[RTAX_NETMASK];
if (src != NULL && dst != NULL) {
/*
* Radix stores different value in sa_len,
* assume rt_mask() to have the same length
* as rt_key()
*/
if (sa_len > dst->sa_len)
return (ENOMEM);
memcpy(dst, src, src->sa_len);
info->rti_addrs |= RTA_NETMASK;
}
/* Copy gateway is set && dst is non-zero */
src = rt->rt_gateway;
dst = info->rti_info[RTAX_GATEWAY];
if ((rt->rt_flags & RTF_GATEWAY) && src != NULL && dst != NULL){
if (src->sa_len > dst->sa_len)
return (ENOMEM);
memcpy(dst, src, src->sa_len);
info->rti_addrs |= RTA_GATEWAY;
}
} else {
info->rti_info[RTAX_DST] = rt_key(rt);
info->rti_addrs |= RTA_DST;
if (rt_mask(rt) != NULL) {
info->rti_info[RTAX_NETMASK] = rt_mask(rt);
info->rti_addrs |= RTA_NETMASK;
}
if (rt->rt_flags & RTF_GATEWAY) {
info->rti_info[RTAX_GATEWAY] = rt->rt_gateway;
info->rti_addrs |= RTA_GATEWAY;
}
}
rmx = info->rti_rmx;
if (rmx != NULL) {
info->rti_mflags |= RTV_MTU;
rmx->rmx_mtu = rt->rt_mtu;
}
info->rti_flags = rt->rt_flags;
info->rti_ifp = rt->rt_ifp;
info->rti_ifa = rt->rt_ifa;
if (flags & NHR_REF) {
/* Do 'traditional' refcouting */
if_ref(info->rti_ifp);
}
return (0);
}
/*
* Lookups up route entry for @dst in RIB database for fib @fibnum.
* Exports entry data to @info using rt_exportinfo().
*
* if @flags contains NHR_REF, refcouting is performed on rt_ifp.
* All references can be released later by calling rib_free_info()
*
* Returns 0 on success.
* Returns ENOENT for lookup failure, ENOMEM for export failure.
*/
int
rib_lookup_info(uint32_t fibnum, const struct sockaddr *dst, uint32_t flags,
uint32_t flowid, struct rt_addrinfo *info)
{
struct radix_node_head *rh;
struct radix_node *rn;
struct rtentry *rt;
int error;
KASSERT((fibnum < rt_numfibs), ("rib_lookup_rte: bad fibnum"));
rh = rt_tables_get_rnh(fibnum, dst->sa_family);
if (rh == NULL)
return (ENOENT);
RADIX_NODE_HEAD_RLOCK(rh);
rn = rh->rnh_matchaddr(__DECONST(void *, dst), rh);
if (rn != NULL && ((rn->rn_flags & RNF_ROOT) == 0)) {
rt = RNTORT(rn);
/* Ensure route & ifp is UP */
if (RT_LINK_IS_UP(rt->rt_ifp)) {
flags = (flags & NHR_REF) | NHR_COPY;
error = rt_exportinfo(rt, info, flags);
RADIX_NODE_HEAD_RUNLOCK(rh);
return (error);
}
}
RADIX_NODE_HEAD_RUNLOCK(rh);
return (ENOENT);
}
/*
* Releases all references acquired by rib_lookup_info() when
* called with NHR_REF flags.
*/
void
rib_free_info(struct rt_addrinfo *info)
{
if_rele(info->rti_ifp);
}
/*
* Iterates over all existing fibs in system calling
* @setwa_f function prior to traversing each fib.

View File

@ -44,16 +44,17 @@
*/
/*
* A route consists of a destination address, a reference
* to a routing entry, and a reference to an llentry.
* These are often held by protocols in their control
* blocks, e.g. inpcb.
* Struct route consiste of a destination address,
* a route entry pointer, link-layer prepend data pointer along
* with its length.
*/
struct route {
struct rtentry *ro_rt;
char *ro_prepend;
uint16_t ro_plen;
uint16_t ro_flags;
uint16_t ro_mtu; /* saved ro_rt mtu */
uint16_t spare;
struct sockaddr ro_dst;
};
@ -196,6 +197,9 @@ struct rtentry {
#define NHR_IFAIF 0x01 /* Return ifa_ifp interface */
#define NHR_REF 0x02 /* For future use */
/* Control plane route request flags */
#define NHR_COPY 0x100 /* Copy rte data */
/* rte<>nhop translation */
static inline uint16_t
fib_rte_to_nh_flags(int rt_flags)
@ -459,6 +463,9 @@ void rtredirect_fib(struct sockaddr *, struct sockaddr *,
int rtrequest_fib(int, struct sockaddr *,
struct sockaddr *, struct sockaddr *, int, struct rtentry **, u_int);
int rtrequest1_fib(int, struct rt_addrinfo *, struct rtentry **, u_int);
int rib_lookup_info(uint32_t, const struct sockaddr *, uint32_t, uint32_t,
struct rt_addrinfo *);
void rib_free_info(struct rt_addrinfo *info);
#include <sys/eventhandler.h>
typedef void (*rtevent_redirect_fn)(void *, struct rtentry *, struct rtentry *, struct sockaddr *);

View File

@ -614,11 +614,16 @@ route_output(struct mbuf *m, struct socket *so, ...)
*/
if (info.rti_info[RTAX_GATEWAY] != NULL &&
info.rti_info[RTAX_GATEWAY]->sa_family != AF_LINK) {
struct route gw_ro;
struct rt_addrinfo ginfo;
struct sockaddr *gdst;
bzero(&ginfo, sizeof(ginfo));
bzero(&ss, sizeof(ss));
ss.ss_len = sizeof(ss);
ginfo.rti_info[RTAX_GATEWAY] = (struct sockaddr *)&ss;
gdst = info.rti_info[RTAX_GATEWAY];
bzero(&gw_ro, sizeof(gw_ro));
gw_ro.ro_dst = *info.rti_info[RTAX_GATEWAY];
rtalloc_ign_fib(&gw_ro, 0, fibnum);
/*
* A host route through the loopback interface is
* installed for each interface adddress. In pre 8.0
@ -629,14 +634,14 @@ route_output(struct mbuf *m, struct socket *so, ...)
* AF_LINK sa_family type of the rt_gateway, and the
* rt_ifp has the IFF_LOOPBACK flag set.
*/
if (gw_ro.ro_rt != NULL &&
gw_ro.ro_rt->rt_gateway->sa_family == AF_LINK &&
gw_ro.ro_rt->rt_ifp->if_flags & IFF_LOOPBACK) {
info.rti_flags &= ~RTF_GATEWAY;
info.rti_flags |= RTF_GWFLAG_COMPAT;
if (rib_lookup_info(fibnum, gdst, NHR_REF, 0, &ginfo) == 0) {
if (ss.ss_family == AF_LINK &&
ginfo.rti_ifp->if_flags & IFF_LOOPBACK) {
info.rti_flags &= ~RTF_GATEWAY;
info.rti_flags |= RTF_GWFLAG_COMPAT;
}
rib_free_info(&ginfo);
}
if (gw_ro.ro_rt != NULL)
RTFREE(gw_ro.ro_rt);
}
switch (rtm->rtm_type) {

View File

@ -359,7 +359,7 @@ ieee80211_swscan_bg_scan(const struct ieee80211_scanner *scan,
duration = IEEE80211_SCAN_OFFCHANNEL;
IEEE80211_DPRINTF(vap, IEEE80211_MSG_SCAN,
"%s: %s scan, ticks %u duration %lu\n", __func__,
"%s: %s scan, ticks %u duration %u\n", __func__,
ss->ss_flags & IEEE80211_SCAN_ACTIVE ? "active" : "passive",
ticks, duration);

View File

@ -451,7 +451,7 @@ hash6_insert(priv_p priv, struct flow_hash_entry *hsh6, struct flow6_rec *r,
}
}
if ((flags & NG_NETFLOW_CONF_NODSTLOOKUP) == 0) {
if ((flags & NG_NETFLOW_CONF_NOSRCLOOKUP) == 0) {
/* Do route lookup on source address, to fill in src_mask. */
bzero(&rin6, sizeof(struct route_in6));
src = (struct sockaddr_in6 *)&rin6.ro_dst;

View File

@ -1106,34 +1106,48 @@ in_lltable_free_entry(struct lltable *llt, struct llentry *lle)
static int
in_lltable_rtcheck(struct ifnet *ifp, u_int flags, const struct sockaddr *l3addr)
{
struct rtentry *rt;
struct rt_addrinfo info;
struct sockaddr_in rt_key, rt_mask;
struct sockaddr rt_gateway;
int rt_flags;
KASSERT(l3addr->sa_family == AF_INET,
("sin_family %d", l3addr->sa_family));
/* XXX rtalloc1_fib should take a const param */
rt = rtalloc1_fib(__DECONST(struct sockaddr *, l3addr), 0, 0,
ifp->if_fib);
bzero(&rt_key, sizeof(rt_key));
rt_key.sin_len = sizeof(rt_key);
bzero(&rt_mask, sizeof(rt_mask));
rt_mask.sin_len = sizeof(rt_mask);
bzero(&rt_gateway, sizeof(rt_gateway));
rt_gateway.sa_len = sizeof(rt_gateway);
if (rt == NULL)
bzero(&info, sizeof(info));
info.rti_info[RTAX_DST] = (struct sockaddr *)&rt_key;
info.rti_info[RTAX_NETMASK] = (struct sockaddr *)&rt_mask;
info.rti_info[RTAX_GATEWAY] = (struct sockaddr *)&rt_gateway;
if (rib_lookup_info(ifp->if_fib, l3addr, NHR_REF, 0, &info) != 0)
return (EINVAL);
rt_flags = info.rti_flags;
/*
* If the gateway for an existing host route matches the target L3
* address, which is a special route inserted by some implementation
* such as MANET, and the interface is of the correct type, then
* allow for ARP to proceed.
*/
if (rt->rt_flags & RTF_GATEWAY) {
if (!(rt->rt_flags & RTF_HOST) || !rt->rt_ifp ||
rt->rt_ifp->if_type != IFT_ETHER ||
(rt->rt_ifp->if_flags & (IFF_NOARP | IFF_STATICARP)) != 0 ||
memcmp(rt->rt_gateway->sa_data, l3addr->sa_data,
if (rt_flags & RTF_GATEWAY) {
if (!(rt_flags & RTF_HOST) || !info.rti_ifp ||
info.rti_ifp->if_type != IFT_ETHER ||
(info.rti_ifp->if_flags & (IFF_NOARP | IFF_STATICARP)) != 0 ||
memcmp(rt_gateway.sa_data, l3addr->sa_data,
sizeof(in_addr_t)) != 0) {
RTFREE_LOCKED(rt);
rib_free_info(&info);
return (EINVAL);
}
}
rib_free_info(&info);
/*
* Make sure that at least the destination address is covered
@ -1142,21 +1156,19 @@ in_lltable_rtcheck(struct ifnet *ifp, u_int flags, const struct sockaddr *l3addr
* on one interface and the corresponding outgoing packet leaves
* another interface.
*/
if (!(rt->rt_flags & RTF_HOST) && rt->rt_ifp != ifp) {
if (!(rt_flags & RTF_HOST) && info.rti_ifp != ifp) {
const char *sa, *mask, *addr, *lim;
int len;
mask = (const char *)rt_mask(rt);
mask = (const char *)&rt_mask;
/*
* Just being extra cautious to avoid some custom
* code getting into trouble.
*/
if (mask == NULL) {
RTFREE_LOCKED(rt);
if ((info.rti_addrs & RTA_NETMASK) == 0)
return (EINVAL);
}
sa = (const char *)rt_key(rt);
sa = (const char *)&rt_key;
addr = (const char *)l3addr;
len = ((const struct sockaddr_in *)l3addr)->sin_len;
lim = addr + len;
@ -1167,13 +1179,11 @@ in_lltable_rtcheck(struct ifnet *ifp, u_int flags, const struct sockaddr *l3addr
log(LOG_INFO, "IPv4 address: \"%s\" is not on the network\n",
inet_ntoa(((const struct sockaddr_in *)l3addr)->sin_addr));
#endif
RTFREE_LOCKED(rt);
return (EINVAL);
}
}
}
RTFREE_LOCKED(rt);
return (0);
}

View File

@ -97,7 +97,10 @@ fib4_rte_to_nh_extended(struct rtentry *rte, struct in_addr dst,
struct sockaddr_in *gw;
struct in_ifaddr *ia;
pnh4->nh_ifp = rte->rt_ifa->ifa_ifp;
if ((flags & NHR_IFAIF) != 0)
pnh4->nh_ifp = rte->rt_ifa->ifa_ifp;
else
pnh4->nh_ifp = rte->rt_ifp;
pnh4->nh_mtu = min(rte->rt_mtu, rte->rt_ifp->if_mtu);
if (rte->rt_flags & RTF_GATEWAY) {
gw = (struct sockaddr_in *)rte->rt_gateway;
@ -175,8 +178,8 @@ fib4_lookup_nh_basic(uint32_t fibnum, struct in_addr dst, uint32_t flags,
* - howewer mtu from "transmit" interface will be returned.
*/
int
fib4_lookup_nh_ext(uint32_t fibnum, struct in_addr dst, uint32_t flowid,
uint32_t flags, struct nhop4_extended *pnh4)
fib4_lookup_nh_ext(uint32_t fibnum, struct in_addr dst, uint32_t flags,
uint32_t flowid, struct nhop4_extended *pnh4)
{
struct radix_node_head *rh;
struct radix_node *rn;

View File

@ -2184,7 +2184,6 @@ icmp6_reflect(struct mbuf *m, size_t off)
if (srcp == NULL) {
int e;
struct sockaddr_in6 sin6;
struct route_in6 ro;
/*
* This case matches to multicasts, our anycast, or unicasts
@ -2196,10 +2195,7 @@ icmp6_reflect(struct mbuf *m, size_t off)
sin6.sin6_len = sizeof(sin6);
sin6.sin6_addr = ip6->ip6_dst; /* zone ID should be embedded */
bzero(&ro, sizeof(ro));
e = in6_selectsrc(&sin6, NULL, NULL, &ro, NULL, &outif, &src);
if (ro.ro_rt)
RTFREE(ro.ro_rt); /* XXX: we could use this */
e = in6_selectsrc(&sin6, NULL, NULL, NULL, &outif, &src);
if (e) {
char ip6buf[INET6_ADDRSTRLEN];
nd6log((LOG_DEBUG,

View File

@ -378,6 +378,8 @@ struct route_in6 {
char *ro_prepend;
uint16_t ro_plen;
uint16_t ro_flags;
uint16_t ro_mtu; /* saved ro_rt mtu */
uint16_t spare;
struct sockaddr_in6 ro_dst;
};
#endif

View File

@ -359,7 +359,7 @@ in6_pcbladdr(register struct inpcb *inp, struct sockaddr *nam,
return (error);
error = in6_selectsrc(sin6, inp->in6p_outputopts,
inp, NULL, inp->inp_cred, &ifp, &in6a);
inp, inp->inp_cred, &ifp, &in6a);
if (error)
return (error);

View File

@ -134,7 +134,7 @@ static int selectroute(struct sockaddr_in6 *, struct ip6_pktopts *,
struct ip6_moptions *, struct route_in6 *, struct ifnet **,
struct rtentry **, int, u_int);
static int in6_selectif(struct sockaddr_in6 *, struct ip6_pktopts *,
struct ip6_moptions *, struct route_in6 *ro, struct ifnet **,
struct ip6_moptions *, struct ifnet **,
struct ifnet *, u_int);
static struct in6_addrpolicy *lookup_addrsel_policy(struct sockaddr_in6 *);
@ -177,7 +177,7 @@ static struct in6_addrpolicy *match_addrsel_policy(struct sockaddr_in6 *);
int
in6_selectsrc(struct sockaddr_in6 *dstsock, struct ip6_pktopts *opts,
struct inpcb *inp, struct route_in6 *ro, struct ucred *cred,
struct inpcb *inp, struct ucred *cred,
struct ifnet **ifpp, struct in6_addr *srcp)
{
struct rm_priotracker in6_ifa_tracker;
@ -227,7 +227,7 @@ in6_selectsrc(struct sockaddr_in6 *dstsock, struct ip6_pktopts *opts,
struct in6_ifaddr *ia6;
/* get the outgoing interface */
if ((error = in6_selectif(dstsock, opts, mopts, ro, &ifp, oifp,
if ((error = in6_selectif(dstsock, opts, mopts, &ifp, oifp,
(inp != NULL) ? inp->inp_inc.inc_fibnum : RT_DEFAULT_FIB))
!= 0)
return (error);
@ -293,7 +293,7 @@ in6_selectsrc(struct sockaddr_in6 *dstsock, struct ip6_pktopts *opts,
* the outgoing interface and the destination address.
*/
/* get the outgoing interface */
if ((error = in6_selectif(dstsock, opts, mopts, ro, &ifp, oifp,
if ((error = in6_selectif(dstsock, opts, mopts, &ifp, oifp,
(inp != NULL) ? inp->inp_inc.inc_fibnum : RT_DEFAULT_FIB)) != 0)
return (error);
@ -761,24 +761,27 @@ selectroute(struct sockaddr_in6 *dstsock, struct ip6_pktopts *opts,
static int
in6_selectif(struct sockaddr_in6 *dstsock, struct ip6_pktopts *opts,
struct ip6_moptions *mopts, struct route_in6 *ro, struct ifnet **retifp,
struct ip6_moptions *mopts, struct ifnet **retifp,
struct ifnet *oifp, u_int fibnum)
{
int error;
struct route_in6 sro;
struct rtentry *rt = NULL;
int rt_flags;
KASSERT(retifp != NULL, ("%s: retifp is NULL", __func__));
if (ro == NULL) {
bzero(&sro, sizeof(sro));
ro = &sro;
}
bzero(&sro, sizeof(sro));
rt_flags = 0;
if ((error = selectroute(dstsock, opts, mopts, ro, retifp,
&rt, 1, fibnum)) != 0) {
if (ro == &sro && rt && rt == sro.ro_rt)
RTFREE(rt);
error = selectroute(dstsock, opts, mopts, &sro, retifp, &rt, 1, fibnum);
if (rt)
rt_flags = rt->rt_flags;
if (rt && rt == sro.ro_rt)
RTFREE(rt);
if (error != 0) {
/* Help ND. See oifp comment in in6_selectsrc(). */
if (oifp != NULL && fibnum == RT_DEFAULT_FIB) {
*retifp = oifp;
@ -804,16 +807,12 @@ in6_selectif(struct sockaddr_in6 *dstsock, struct ip6_pktopts *opts,
* Although this may not be very harmful, it should still be confusing.
* We thus reject the case here.
*/
if (rt && (rt->rt_flags & (RTF_REJECT | RTF_BLACKHOLE))) {
int flags = (rt->rt_flags & RTF_HOST ? EHOSTUNREACH : ENETUNREACH);
if (ro == &sro && rt && rt == sro.ro_rt)
RTFREE(rt);
return (flags);
if (rt_flags & (RTF_REJECT | RTF_BLACKHOLE)) {
error = (rt_flags & RTF_HOST ? EHOSTUNREACH : ENETUNREACH);
return (error);
}
if (ro == &sro && rt && rt == sro.ro_rt)
RTFREE(rt);
return (0);
}

View File

@ -97,6 +97,7 @@ __FBSDID("$FreeBSD$");
#include <netinet/in.h>
#include <netinet/in_var.h>
#include <netinet/ip_var.h>
#include <netinet6/in6_fib.h>
#include <netinet6/in6_var.h>
#include <netinet/ip6.h>
#include <netinet/icmp6.h>
@ -147,8 +148,11 @@ static int ip6_insertfraghdr(struct mbuf *, struct mbuf *, int,
struct ip6_frag **);
static int ip6_insert_jumboopt(struct ip6_exthdrs *, u_int32_t);
static int ip6_splithdr(struct mbuf *, struct ip6_exthdrs *);
static int ip6_getpmtu(struct route_in6 *, struct route_in6 *,
static int ip6_getpmtu(struct route_in6 *, int,
struct ifnet *, struct in6_addr *, u_long *, int *, u_int);
static int ip6_calcmtu(struct ifnet *, const struct in6_addr *, u_long,
u_long *, int *);
static int ip6_getpmtu_ctl(u_int, struct in6_addr *, u_long *);
static int copypktopts(struct ip6_pktopts *, struct ip6_pktopts *, int);
@ -712,7 +716,7 @@ ip6_output(struct mbuf *m0, struct ip6_pktopts *opt,
*ifpp = ifp;
/* Determine path MTU. */
if ((error = ip6_getpmtu(ro_pmtu, ro, ifp, &finaldst, &mtu,
if ((error = ip6_getpmtu(ro_pmtu, ro != ro_pmtu, ifp, &finaldst, &mtu,
&alwaysfrag, fibnum)) != 0)
goto bad;
@ -1045,8 +1049,6 @@ ip6_output(struct mbuf *m0, struct ip6_pktopts *opt,
done:
if (ro == &ip6route)
RO_RTFREE(ro);
if (ro_pmtu == &ip6route)
RO_RTFREE(ro_pmtu);
return (error);
freehdrs:
@ -1215,35 +1217,105 @@ ip6_insertfraghdr(struct mbuf *m0, struct mbuf *m, int hlen,
return (0);
}
/*
* Calculates IPv6 path mtu for destination @dst.
* Resulting MTU is stored in @mtup.
*
* Returns 0 on success.
*/
static int
ip6_getpmtu(struct route_in6 *ro_pmtu, struct route_in6 *ro,
ip6_getpmtu_ctl(u_int fibnum, struct in6_addr *dst, u_long *mtup)
{
struct nhop6_extended nh6;
struct in6_addr kdst;
uint32_t scopeid;
struct ifnet *ifp;
u_long mtu;
int error;
in6_splitscope(dst, &kdst, &scopeid);
if (fib6_lookup_nh_ext(fibnum, &kdst, scopeid, NHR_REF, 0, &nh6) != 0)
return (EHOSTUNREACH);
ifp = nh6.nh_ifp;
mtu = nh6.nh_mtu;
error = ip6_calcmtu(ifp, dst, mtu, mtup, NULL);
fib6_free_nh_ext(fibnum, &nh6);
return (error);
}
/*
* Calculates IPv6 path MTU for @dst based on transmit @ifp,
* and cached data in @ro_pmtu.
* MTU from (successful) route lookup is saved (along with dst)
* inside @ro_pmtu to avoid subsequent route lookups after packet
* filter processing.
*
* Stores mtu and always-frag value into @mtup and @alwaysfragp.
* Returns 0 on success.
*/
static int
ip6_getpmtu(struct route_in6 *ro_pmtu, int do_lookup,
struct ifnet *ifp, struct in6_addr *dst, u_long *mtup,
int *alwaysfragp, u_int fibnum)
{
u_int32_t mtu = 0;
int alwaysfrag = 0;
int error = 0;
struct nhop6_basic nh6;
struct in6_addr kdst;
uint32_t scopeid;
struct sockaddr_in6 *sa6_dst;
u_long mtu;
if (ro_pmtu != ro) {
/* The first hop and the final destination may differ. */
struct sockaddr_in6 *sa6_dst =
(struct sockaddr_in6 *)&ro_pmtu->ro_dst;
if (ro_pmtu->ro_rt &&
((ro_pmtu->ro_rt->rt_flags & RTF_UP) == 0 ||
!IN6_ARE_ADDR_EQUAL(&sa6_dst->sin6_addr, dst))) {
RTFREE(ro_pmtu->ro_rt);
ro_pmtu->ro_rt = (struct rtentry *)NULL;
}
if (ro_pmtu->ro_rt == NULL) {
mtu = 0;
if (do_lookup) {
/*
* Here ro_pmtu has final destination address, while
* ro might represent immediate destination.
* Use ro_pmtu destination since mtu might differ.
*/
sa6_dst = (struct sockaddr_in6 *)&ro_pmtu->ro_dst;
if (!IN6_ARE_ADDR_EQUAL(&sa6_dst->sin6_addr, dst))
ro_pmtu->ro_mtu = 0;
if (ro_pmtu->ro_mtu == 0) {
bzero(sa6_dst, sizeof(*sa6_dst));
sa6_dst->sin6_family = AF_INET6;
sa6_dst->sin6_len = sizeof(struct sockaddr_in6);
sa6_dst->sin6_addr = *dst;
in6_rtalloc(ro_pmtu, fibnum);
in6_splitscope(dst, &kdst, &scopeid);
if (fib6_lookup_nh_basic(fibnum, &kdst, scopeid, 0, 0,
&nh6) == 0)
ro_pmtu->ro_mtu = nh6.nh_mtu;
}
mtu = ro_pmtu->ro_mtu;
}
if (ro_pmtu->ro_rt) {
if (ro_pmtu->ro_rt)
mtu = ro_pmtu->ro_rt->rt_mtu;
return (ip6_calcmtu(ifp, dst, mtu, mtup, alwaysfragp));
}
/*
* Calculate MTU based on transmit @ifp, route mtu @rt_mtu and
* hostcache data for @dst.
* Stores mtu and always-frag value into @mtup and @alwaysfragp.
*
* Returns 0 on success.
*/
static int
ip6_calcmtu(struct ifnet *ifp, const struct in6_addr *dst, u_long rt_mtu,
u_long *mtup, int *alwaysfragp)
{
u_long mtu = 0;
int alwaysfrag = 0;
int error = 0;
if (rt_mtu > 0) {
u_int32_t ifmtu;
struct in_conninfo inc;
@ -1251,14 +1323,12 @@ ip6_getpmtu(struct route_in6 *ro_pmtu, struct route_in6 *ro,
inc.inc_flags |= INC_ISIPV6;
inc.inc6_faddr = *dst;
if (ifp == NULL)
ifp = ro_pmtu->ro_rt->rt_ifp;
ifmtu = IN6_LINKMTU(ifp);
mtu = tcp_hc_getmtu(&inc);
if (mtu)
mtu = min(mtu, ro_pmtu->ro_rt->rt_mtu);
mtu = min(mtu, rt_mtu);
else
mtu = ro_pmtu->ro_rt->rt_mtu;
mtu = rt_mtu;
if (mtu == 0)
mtu = ifmtu;
else if (mtu < IPV6_MMTU) {
@ -1936,9 +2006,6 @@ do { \
{
u_long pmtu = 0;
struct ip6_mtuinfo mtuinfo;
struct route_in6 sro;
bzero(&sro, sizeof(sro));
if (!(so->so_state & SS_ISCONNECTED))
return (ENOTCONN);
@ -1947,11 +2014,8 @@ do { \
* routing, or optional information to specify
* the outgoing interface.
*/
error = ip6_getpmtu(&sro, NULL, NULL,
&in6p->in6p_faddr, &pmtu, NULL,
so->so_fibnum);
if (sro.ro_rt)
RTFREE(sro.ro_rt);
error = ip6_getpmtu_ctl(so->so_fibnum,
&in6p->in6p_faddr, &pmtu);
if (error)
break;
if (pmtu > IPV6_MAXPACKET)

View File

@ -419,7 +419,7 @@ int dest6_input(struct mbuf **, int *, int);
int none_input(struct mbuf **, int *, int);
int in6_selectsrc(struct sockaddr_in6 *, struct ip6_pktopts *,
struct inpcb *inp, struct route_in6 *, struct ucred *cred,
struct inpcb *inp, struct ucred *cred,
struct ifnet **, struct in6_addr *);
int in6_selectroute(struct sockaddr_in6 *, struct ip6_pktopts *,
struct ip6_moptions *, struct route_in6 *, struct ifnet **,

View File

@ -1210,6 +1210,10 @@ nd6_is_new_addr_neighbor(const struct sockaddr_in6 *addr, struct ifnet *ifp)
{
struct nd_prefix *pr;
struct ifaddr *dstaddr;
struct rt_addrinfo info;
struct sockaddr_in6 rt_key;
struct sockaddr *dst6;
int fibnum;
/*
* A link-local address is always a neighbor.
@ -1234,6 +1238,13 @@ nd6_is_new_addr_neighbor(const struct sockaddr_in6 *addr, struct ifnet *ifp)
return (0);
}
bzero(&rt_key, sizeof(rt_key));
bzero(&info, sizeof(info));
info.rti_info[RTAX_DST] = (struct sockaddr *)&rt_key;
/* Always use the default FIB here. XXME - why? */
fibnum = RT_DEFAULT_FIB;
/*
* If the address matches one of our addresses,
* it should be a neighbor.
@ -1245,12 +1256,13 @@ nd6_is_new_addr_neighbor(const struct sockaddr_in6 *addr, struct ifnet *ifp)
continue;
if (!(pr->ndpr_stateflags & NDPRF_ONLINK)) {
struct rtentry *rt;
/* Always use the default FIB here. */
rt = in6_rtalloc1((struct sockaddr *)&pr->ndpr_prefix,
0, 0, RT_DEFAULT_FIB);
if (rt == NULL)
dst6 = (struct sockaddr *)&pr->ndpr_prefix;
/* Restore length field before retrying lookup */
rt_key.sin6_len = sizeof(rt_key);
if (rib_lookup_info(fibnum, dst6, 0, 0, &info) != 0)
continue;
/*
* This is the case where multiple interfaces
@ -1263,11 +1275,8 @@ nd6_is_new_addr_neighbor(const struct sockaddr_in6 *addr, struct ifnet *ifp)
* differ.
*/
if (!IN6_ARE_ADDR_EQUAL(&pr->ndpr_prefix.sin6_addr,
&((struct sockaddr_in6 *)rt_key(rt))->sin6_addr)) {
RTFREE_LOCKED(rt);
&rt_key.sin6_addr))
continue;
}
RTFREE_LOCKED(rt);
}
if (IN6_ARE_MASKED_ADDR_EQUAL(&pr->ndpr_prefix.sin6_addr,

View File

@ -248,37 +248,35 @@ nd6_ns_input(struct mbuf *m, int off, int icmp6len)
/* (2) check. */
if (ifa == NULL) {
struct route_in6 ro;
int need_proxy;
struct sockaddr_dl rt_gateway;
struct rt_addrinfo info;
struct sockaddr_in6 dst6;
bzero(&ro, sizeof(ro));
ro.ro_dst.sin6_len = sizeof(struct sockaddr_in6);
ro.ro_dst.sin6_family = AF_INET6;
ro.ro_dst.sin6_addr = taddr6;
bzero(&dst6, sizeof(dst6));
dst6.sin6_len = sizeof(struct sockaddr_in6);
dst6.sin6_family = AF_INET6;
dst6.sin6_addr = taddr6;
bzero(&rt_gateway, sizeof(rt_gateway));
rt_gateway.sdl_len = sizeof(rt_gateway);
bzero(&info, sizeof(info));
info.rti_info[RTAX_GATEWAY] = (struct sockaddr *)&rt_gateway;
/* Always use the default FIB. */
#ifdef RADIX_MPATH
rtalloc_mpath_fib((struct route *)&ro, ntohl(taddr6.s6_addr32[3]),
RT_DEFAULT_FIB);
#else
in6_rtalloc(&ro, RT_DEFAULT_FIB);
#endif
need_proxy = (ro.ro_rt &&
(ro.ro_rt->rt_flags & RTF_ANNOUNCE) != 0 &&
ro.ro_rt->rt_gateway->sa_family == AF_LINK);
if (ro.ro_rt != NULL) {
if (need_proxy)
proxydl = *SDL(ro.ro_rt->rt_gateway);
RTFREE(ro.ro_rt);
}
if (need_proxy) {
/*
* proxy NDP for single entry
*/
ifa = (struct ifaddr *)in6ifa_ifpforlinklocal(ifp,
IN6_IFF_NOTREADY|IN6_IFF_ANYCAST);
if (ifa)
proxy = 1;
if (rib_lookup_info(RT_DEFAULT_FIB, (struct sockaddr *)&dst6,
0, 0, &info) == 0) {
if ((info.rti_flags & RTF_ANNOUNCE) != 0 &&
rt_gateway.sdl_family == AF_LINK) {
/*
* proxy NDP for single entry
*/
proxydl = *SDL(&rt_gateway);
ifa = (struct ifaddr *)in6ifa_ifpforlinklocal(
ifp, IN6_IFF_NOTREADY|IN6_IFF_ANYCAST);
if (ifa)
proxy = 1;
}
}
}
if (ifa == NULL) {
@ -408,7 +406,6 @@ nd6_ns_output_fib(struct ifnet *ifp, const struct in6_addr *saddr6,
int icmp6len;
int maxlen;
caddr_t mac;
struct route_in6 ro;
if (IN6_IS_ADDR_MULTICAST(taddr6))
return;
@ -428,8 +425,6 @@ nd6_ns_output_fib(struct ifnet *ifp, const struct in6_addr *saddr6,
return;
M_SETFIB(m, fibnum);
bzero(&ro, sizeof(ro));
if (daddr6 == NULL || IN6_IS_ADDR_MULTICAST(daddr6)) {
m->m_flags |= M_MCAST;
im6o.im6o_multicast_ifp = ifp;
@ -497,7 +492,7 @@ nd6_ns_output_fib(struct ifnet *ifp, const struct in6_addr *saddr6,
oifp = ifp;
error = in6_selectsrc(&dst_sa, NULL,
NULL, &ro, NULL, &oifp, &src_in);
NULL, NULL, &oifp, &src_in);
if (error) {
char ip6buf[INET6_ADDRSTRLEN];
nd6log((LOG_DEBUG, "%s: source can't be "
@ -585,21 +580,15 @@ nd6_ns_output_fib(struct ifnet *ifp, const struct in6_addr *saddr6,
m_tag_prepend(m, mtag);
}
ip6_output(m, NULL, &ro, (nonce != NULL) ? IPV6_UNSPECSRC : 0,
ip6_output(m, NULL, NULL, (nonce != NULL) ? IPV6_UNSPECSRC : 0,
&im6o, NULL, NULL);
icmp6_ifstat_inc(ifp, ifs6_out_msg);
icmp6_ifstat_inc(ifp, ifs6_out_neighborsolicit);
ICMP6STAT_INC(icp6s_outhist[ND_NEIGHBOR_SOLICIT]);
/* We don't cache this route. */
RO_RTFREE(&ro);
return;
bad:
if (ro.ro_rt) {
RTFREE(ro.ro_rt);
}
m_freem(m);
return;
}
@ -877,6 +866,7 @@ nd6_na_input(struct mbuf *m, int off, int icmp6len)
*/
struct nd_defrouter *dr;
struct in6_addr *in6;
struct ifnet *nd6_ifp;
in6 = &ln->r_l3addr.addr6;
@ -886,10 +876,11 @@ nd6_na_input(struct mbuf *m, int off, int icmp6len)
* is only called under the network software interrupt
* context. However, we keep it just for safety.
*/
dr = defrouter_lookup(in6, ln->lle_tbl->llt_ifp);
nd6_ifp = lltable_get_ifp(ln->lle_tbl);
dr = defrouter_lookup(in6, nd6_ifp);
if (dr)
defrtrlist_del(dr);
else if (ND_IFINFO(ln->lle_tbl->llt_ifp)->flags &
else if (ND_IFINFO(nd6_ifp)->flags &
ND6_IFF_ACCEPT_RTADV) {
/*
* Even if the neighbor is not in the default
@ -958,9 +949,6 @@ nd6_na_output_fib(struct ifnet *ifp, const struct in6_addr *daddr6_0,
struct sockaddr_in6 dst_sa;
int icmp6len, maxlen, error;
caddr_t mac = NULL;
struct route_in6 ro;
bzero(&ro, sizeof(ro));
daddr6 = *daddr6_0; /* make a local copy for modification */
@ -1018,9 +1006,8 @@ nd6_na_output_fib(struct ifnet *ifp, const struct in6_addr *daddr6_0,
/*
* Select a source whose scope is the same as that of the dest.
*/
bcopy(&dst_sa, &ro.ro_dst, sizeof(dst_sa));
oifp = ifp;
error = in6_selectsrc(&dst_sa, NULL, NULL, &ro, NULL, &oifp, &src);
error = in6_selectsrc(&dst_sa, NULL, NULL, NULL, &oifp, &src);
if (error) {
char ip6buf[INET6_ADDRSTRLEN];
nd6log((LOG_DEBUG, "nd6_na_output: source can't be "
@ -1091,20 +1078,14 @@ nd6_na_output_fib(struct ifnet *ifp, const struct in6_addr *daddr6_0,
m_tag_prepend(m, mtag);
}
ip6_output(m, NULL, &ro, 0, &im6o, NULL, NULL);
ip6_output(m, NULL, NULL, 0, &im6o, NULL, NULL);
icmp6_ifstat_inc(ifp, ifs6_out_msg);
icmp6_ifstat_inc(ifp, ifs6_out_neighboradvert);
ICMP6STAT_INC(icp6s_outhist[ND_NEIGHBOR_ADVERT]);
/* We don't cache this route. */
RO_RTFREE(&ro);
return;
bad:
if (ro.ro_rt) {
RTFREE(ro.ro_rt);
}
m_freem(m);
return;
}

View File

@ -460,7 +460,7 @@ rip6_output(struct mbuf *m, struct socket *so, ...)
/*
* Source address selection.
*/
error = in6_selectsrc(dstsock, optp, in6p, NULL, so->so_cred,
error = in6_selectsrc(dstsock, optp, in6p, so->so_cred,
&oifp, &in6a);
if (error)
goto bad;
@ -814,7 +814,7 @@ rip6_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
INP_WLOCK(inp);
/* Source address selection. XXX: need pcblookup? */
error = in6_selectsrc(addr, inp->in6p_outputopts,
inp, NULL, so->so_cred, &ifp, &in6a);
inp, so->so_cred, &ifp, &in6a);
if (error) {
INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&V_ripcbinfo);

View File

@ -731,7 +731,7 @@ udp6_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *addr6,
}
if (!IN6_IS_ADDR_V4MAPPED(faddr)) {
error = in6_selectsrc(sin6, optp, inp, NULL,
error = in6_selectsrc(sin6, optp, inp,
td->td_ucred, &oifp, &in6a);
if (error)
goto release;

View File

@ -179,6 +179,17 @@ aim_cpu_init(vm_offset_t toc)
trap_offset = 0;
cacheline_warn = 0;
#ifdef __powerpc64__
/*
* Switch to 64-bit mode, if the bootloader didn't, before we start
* using memory beyond what the bootloader might have set up.
* Guaranteed not to cause an implicit branch since we either (a)
* started with a 32-bit bootloader below 4 GB or (b) were already in
* 64-bit mode, making this a no-op.
*/
mtmsrd(mfmsr() | PSL_SF);
#endif
/* Various very early CPU fix ups */
switch (mfpvr() >> 16) {
/*

View File

@ -157,13 +157,6 @@ ASENTRY_NOPROF(__start)
ld %r5,64(%r1)
ld %r6,72(%r1)
/* Switch to 64-bit mode */
mfmsr %r9
li %r8,1
insrdi %r9,%r8,1,0
mtmsrd %r9
isync
/* Begin CPU init */
mr %r4,%r2 /* Replace ignored r4 with tocbase for trap handlers */
bl powerpc_init

View File

@ -77,10 +77,10 @@ cpudep_ap_early_bootstrap(void)
#else
__asm __volatile("ld %0, 16(%2); sync; isync; \
mtspr %1, %0; sync; isync;"
: "=r"(reg) : "K"(SPR_HID4), "r"(bsp_state));
: "=r"(reg) : "K"(SPR_HID4), "b"(bsp_state));
__asm __volatile("ld %0, 24(%2); sync; isync; \
mtspr %1, %0; sync; isync;"
: "=r"(reg) : "K"(SPR_HID5), "r"(bsp_state));
: "=r"(reg) : "K"(SPR_HID5), "b"(bsp_state));
#endif
powerpc_sync();
break;
@ -324,10 +324,10 @@ cpudep_ap_setup()
mfspr %0, %1; mfspr %0, %1; mfspr %0, %1; \
mfspr %0, %1; mfspr %0, %1; mfspr %0, %1; \
sync; isync"
: "=r"(reg) : "K"(SPR_HID0), "r"(bsp_state));
: "=r"(reg) : "K"(SPR_HID0), "b"(bsp_state));
__asm __volatile("ld %0, 8(%2); sync; isync; \
mtspr %1, %0; mtspr %1, %0; sync; isync"
: "=r"(reg) : "K"(SPR_HID1), "r"(bsp_state));
: "=r"(reg) : "K"(SPR_HID1), "b"(bsp_state));
#endif
powerpc_sync();

View File

@ -173,7 +173,7 @@ uint32_t *bootinfo;
void print_kernel_section_addr(void);
void print_kenv(void);
uintptr_t booke_init(uint32_t, uint32_t);
uintptr_t booke_init(u_long, u_long);
void ivor_setup(void);
extern void *interrupt_vector_base;
@ -211,6 +211,8 @@ void
booke_cpu_init(void)
{
cpu_features |= PPC_FEATURE_BOOKE;
pmap_mmu_install(MMU_TYPE_BOOKE, BUS_PROBE_GENERIC);
}
@ -266,7 +268,7 @@ booke_check_for_fdt(uint32_t arg1, vm_offset_t *dtbp)
}
uintptr_t
booke_init(uint32_t arg1, uint32_t arg2)
booke_init(u_long arg1, u_long arg2)
{
uintptr_t ret;
void *mdp;
@ -314,8 +316,6 @@ booke_init(uint32_t arg1, uint32_t arg2)
else /* U-Boot */
mdp = NULL;
ret = powerpc_init(dtbp, 0, 0, mdp);
/* Default to 32 byte cache line size. */
switch ((mfpvr()) >> 16) {
case FSL_E500mc:
@ -325,6 +325,8 @@ booke_init(uint32_t arg1, uint32_t arg2)
break;
}
ret = powerpc_init(dtbp, 0, 0, mdp);
/* Enable caches */
booke_enable_l1_cache();
booke_enable_l2_cache();

View File

@ -48,19 +48,32 @@
*/
extern int cpu_features;
extern int cpu_features2;
#define PPC_FEATURE_32 0x80000000 /* Always true */
#define PPC_FEATURE_64 0x40000000 /* Defined on a 64-bit CPU */
#define PPC_FEATURE_HAS_ALTIVEC 0x10000000
#define PPC_FEATURE_HAS_FPU 0x08000000
#define PPC_FEATURE_HAS_MMU 0x04000000
#define PPC_FEATURE_UNIFIED_CACHE 0x01000000
#define PPC_FEATURE_HAS_VSX 0x00000080
#define PPC_FEATURE_UNIFIED_CACHE 0x01000000
#define PPC_FEATURE_BOOKE 0x00008000
#define PPC_FEATURE_SMT 0x00004000
#define PPC_FEATURE_ARCH_2_05 0x00001000
#define PPC_FEATURE_HAS_DFP 0x00000400
#define PPC_FEATURE_ARCH_2_06 0x00000100
#define PPC_FEATURE_HAS_VSX 0x00000080
#define PPC_FEATURE2_ARCH_2_07 0x80000000
#define PPC_FEATURE2_HAS_HTM 0x40000000
#define PPC_FEATURE2_HAS_VCRYPTO 0x02000000
#define PPC_FEATURE_BITMASK \
"\20" \
"\040PPC32\037PPC64\035ALTIVEC\034FPU\033MMU\031UNIFIEDCACHE" \
"\010VSX"
"\020BOOKE\017SMT\015ARCH205\013DFP\011ARCH206\010VSX"
#define PPC_FEATURE2_BITMASK \
"\20" \
"\040ARCH207\037HTM\032VCRYPTO"
#define TRAPF_USERMODE(frame) (((frame)->srr1 & PSL_PR) != 0)
#define TRAPF_PC(frame) ((frame)->srr0)

View File

@ -30,7 +30,7 @@
#define INTR_VECTORS 256
#define MAX_PICS 5
#define MAX_PICS 16
#define MAP_IRQ(node, pin) powerpc_get_irq(node, pin)
/*

View File

@ -126,11 +126,11 @@ lbc_address_mask(uint32_t size)
{
int n = 15;
if (size == ~0UL)
if (size == ~0)
return (0);
while (n < 32) {
if (size == (1UL << n))
if (size == (1U << n))
break;
n++;
}
@ -267,7 +267,7 @@ lbc_banks_map(struct lbc_softc *sc)
static int
lbc_banks_enable(struct lbc_softc *sc)
{
u_long size;
uint32_t size;
uint32_t regval;
int error, i;

View File

@ -94,6 +94,29 @@ __FBSDID("$FreeBSD$");
#define REG_PEX_ERR_DR 0x0e00
#define REG_PEX_ERR_EN 0x0e08
#define REG_PEX_ERR_DR 0x0e00
#define REG_PEX_ERR_DR_ME 0x80000000
#define REG_PEX_ERR_DR_PCT 0x800000
#define REG_PEX_ERR_DR_PAT 0x400000
#define REG_PEX_ERR_DR_PCAC 0x200000
#define REG_PEX_ERR_DR_PNM 0x100000
#define REG_PEX_ERR_DR_CDNSC 0x80000
#define REG_PEX_ERR_DR_CRSNC 0x40000
#define REG_PEX_ERR_DR_ICCA 0x20000
#define REG_PEX_ERR_DR_IACA 0x10000
#define REG_PEX_ERR_DR_CRST 0x8000
#define REG_PEX_ERR_DR_MIS 0x4000
#define REG_PEX_ERR_DR_IOIS 0x2000
#define REG_PEX_ERR_DR_CIS 0x1000
#define REG_PEX_ERR_DR_CIEP 0x800
#define REG_PEX_ERR_DR_IOIEP 0x400
#define REG_PEX_ERR_DR_OAC 0x200
#define REG_PEX_ERR_DR_IOIA 0x100
#define REG_PEX_ERR_DR_IMBA 0x80
#define REG_PEX_ERR_DR_IIOBA 0x40
#define REG_PEX_ERR_DR_LDDE 0x20
#define REG_PEX_ERR_EN 0x0e08
#define PCIR_LTSSM 0x404
#define LTSSM_STAT_L0 0x16
@ -113,6 +136,9 @@ struct fsl_pcib_softc {
bus_space_tag_t sc_bst;
int sc_rid;
struct resource *sc_irq_res;
void *sc_ih;
int sc_busnr;
int sc_pcie;
uint8_t sc_pcie_capreg; /* PCI-E Capability Reg Set */
@ -122,6 +148,34 @@ struct fsl_pcib_softc {
int sc_devfn_via_ide;
};
struct fsl_pcib_err_dr {
const char *msg;
uint32_t err_dr_mask;
};
static const struct fsl_pcib_err_dr pci_err[] = {
{"ME", REG_PEX_ERR_DR_ME},
{"PCT", REG_PEX_ERR_DR_PCT},
{"PAT", REG_PEX_ERR_DR_PAT},
{"PCAC", REG_PEX_ERR_DR_PCAC},
{"PNM", REG_PEX_ERR_DR_PNM},
{"CDNSC", REG_PEX_ERR_DR_CDNSC},
{"CRSNC", REG_PEX_ERR_DR_CRSNC},
{"ICCA", REG_PEX_ERR_DR_ICCA},
{"IACA", REG_PEX_ERR_DR_IACA},
{"CRST", REG_PEX_ERR_DR_CRST},
{"MIS", REG_PEX_ERR_DR_MIS},
{"IOIS", REG_PEX_ERR_DR_IOIS},
{"CIS", REG_PEX_ERR_DR_CIS},
{"CIEP", REG_PEX_ERR_DR_CIEP},
{"IOIEP", REG_PEX_ERR_DR_IOIEP},
{"OAC", REG_PEX_ERR_DR_OAC},
{"IOIA", REG_PEX_ERR_DR_IOIA},
{"IMBA", REG_PEX_ERR_DR_IMBA},
{"IIOBA", REG_PEX_ERR_DR_IIOBA},
{"LDDE", REG_PEX_ERR_DR_LDDE}
};
/* Local forward declerations. */
static uint32_t fsl_pcib_cfgread(struct fsl_pcib_softc *, u_int, u_int, u_int,
u_int, int);
@ -172,6 +226,35 @@ DEFINE_CLASS_1(pcib, fsl_pcib_driver, fsl_pcib_methods,
sizeof(struct fsl_pcib_softc), ofw_pci_driver);
DRIVER_MODULE(pcib, ofwbus, fsl_pcib_driver, fsl_pcib_devclass, 0, 0);
static int
fsl_pcib_err_intr(void *v)
{
struct fsl_pcib_softc *sc;
device_t dev;
uint32_t err_reg, clear_reg;
uint8_t i;
dev = (device_t)v;
sc = device_get_softc(dev);
clear_reg = 0;
err_reg = bus_space_read_4(sc->sc_bst, sc->sc_bsh, REG_PEX_ERR_DR);
/* Check which one error occurred */
for (i = 0; i < sizeof(pci_err)/sizeof(struct fsl_pcib_err_dr); i++) {
if (err_reg & pci_err[i].err_dr_mask) {
device_printf(dev, "PCI %d: report %s error\n",
device_get_unit(dev), pci_err[i].msg);
clear_reg |= pci_err[i].err_dr_mask;
}
}
/* Clear pending errors */
bus_space_write_4(sc->sc_bst, sc->sc_bsh, REG_PEX_ERR_DR, clear_reg);
return (0);
}
static int
fsl_pcib_probe(device_t dev)
{
@ -198,7 +281,7 @@ fsl_pcib_attach(device_t dev)
struct fsl_pcib_softc *sc;
phandle_t node;
uint32_t cfgreg;
int maxslot, error;
int error, maxslot, rid;
uint8_t ltssm, capptr;
sc = device_get_softc(dev);
@ -279,6 +362,35 @@ fsl_pcib_attach(device_t dev)
}
}
/* Allocate irq */
rid = 0;
sc->sc_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
RF_ACTIVE | RF_SHAREABLE);
if (sc->sc_irq_res == NULL) {
error = fsl_pcib_detach(dev);
if (error != 0) {
device_printf(dev,
"Detach of the driver failed with error %d\n",
error);
}
return (ENXIO);
}
/* Setup interrupt handler */
error = bus_setup_intr(dev, sc->sc_irq_res, INTR_TYPE_MISC | INTR_MPSAFE,
NULL, (driver_intr_t *)fsl_pcib_err_intr, dev, &sc->sc_ih);
if (error != 0) {
device_printf(dev, "Could not setup irq, %d\n", error);
sc->sc_ih = NULL;
error = fsl_pcib_detach(dev);
if (error != 0) {
device_printf(dev,
"Detach of the driver failed with error %d\n",
error);
}
return (ENXIO);
}
fsl_pcib_err_init(dev);
return (ofw_pci_attach(dev));

View File

@ -91,6 +91,7 @@ struct cputab {
uint16_t revfmt;
int features; /* Do not include PPC_FEATURE_32 or
* PPC_FEATURE_HAS_MMU */
int features2;
void (*cpu_setup)(int cpuid, uint16_t vers);
};
#define REVFMT_MAJMIN 1 /* %u.%u */
@ -98,93 +99,102 @@ struct cputab {
#define REVFMT_DEC 3 /* %u */
static const struct cputab models[] = {
{ "Motorola PowerPC 601", MPC601, REVFMT_DEC,
PPC_FEATURE_HAS_FPU | PPC_FEATURE_UNIFIED_CACHE, cpu_6xx_setup },
PPC_FEATURE_HAS_FPU | PPC_FEATURE_UNIFIED_CACHE, 0, cpu_6xx_setup },
{ "Motorola PowerPC 602", MPC602, REVFMT_DEC,
PPC_FEATURE_HAS_FPU, cpu_6xx_setup },
PPC_FEATURE_HAS_FPU, 0, cpu_6xx_setup },
{ "Motorola PowerPC 603", MPC603, REVFMT_MAJMIN,
PPC_FEATURE_HAS_FPU, cpu_6xx_setup },
PPC_FEATURE_HAS_FPU, 0, cpu_6xx_setup },
{ "Motorola PowerPC 603e", MPC603e, REVFMT_MAJMIN,
PPC_FEATURE_HAS_FPU, cpu_6xx_setup },
PPC_FEATURE_HAS_FPU, 0, cpu_6xx_setup },
{ "Motorola PowerPC 603ev", MPC603ev, REVFMT_MAJMIN,
PPC_FEATURE_HAS_FPU, cpu_6xx_setup },
PPC_FEATURE_HAS_FPU, 0, cpu_6xx_setup },
{ "Motorola PowerPC 604", MPC604, REVFMT_MAJMIN,
PPC_FEATURE_HAS_FPU, cpu_6xx_setup },
PPC_FEATURE_HAS_FPU, 0, cpu_6xx_setup },
{ "Motorola PowerPC 604ev", MPC604ev, REVFMT_MAJMIN,
PPC_FEATURE_HAS_FPU, cpu_6xx_setup },
PPC_FEATURE_HAS_FPU, 0, cpu_6xx_setup },
{ "Motorola PowerPC 620", MPC620, REVFMT_HEX,
PPC_FEATURE_64 | PPC_FEATURE_HAS_FPU, NULL },
PPC_FEATURE_64 | PPC_FEATURE_HAS_FPU, 0, NULL },
{ "Motorola PowerPC 750", MPC750, REVFMT_MAJMIN,
PPC_FEATURE_HAS_FPU, cpu_6xx_setup },
PPC_FEATURE_HAS_FPU, 0, cpu_6xx_setup },
{ "IBM PowerPC 750FX", IBM750FX, REVFMT_MAJMIN,
PPC_FEATURE_HAS_FPU, cpu_6xx_setup },
PPC_FEATURE_HAS_FPU, 0, cpu_6xx_setup },
{ "IBM PowerPC 970", IBM970, REVFMT_MAJMIN,
PPC_FEATURE_64 | PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU,
cpu_970_setup },
0, cpu_970_setup },
{ "IBM PowerPC 970FX", IBM970FX, REVFMT_MAJMIN,
PPC_FEATURE_64 | PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU,
cpu_970_setup },
0, cpu_970_setup },
{ "IBM PowerPC 970GX", IBM970GX, REVFMT_MAJMIN,
PPC_FEATURE_64 | PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU,
cpu_970_setup },
0, cpu_970_setup },
{ "IBM PowerPC 970MP", IBM970MP, REVFMT_MAJMIN,
PPC_FEATURE_64 | PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU,
cpu_970_setup },
0, cpu_970_setup },
{ "IBM POWER4", IBMPOWER4, REVFMT_MAJMIN,
PPC_FEATURE_64 | PPC_FEATURE_HAS_FPU, NULL },
PPC_FEATURE_64 | PPC_FEATURE_HAS_FPU, 0, NULL },
{ "IBM POWER4+", IBMPOWER4PLUS, REVFMT_MAJMIN,
PPC_FEATURE_64 | PPC_FEATURE_HAS_FPU, NULL },
PPC_FEATURE_64 | PPC_FEATURE_HAS_FPU, 0, NULL },
{ "IBM POWER5", IBMPOWER5, REVFMT_MAJMIN,
PPC_FEATURE_64 | PPC_FEATURE_HAS_FPU, NULL },
PPC_FEATURE_64 | PPC_FEATURE_HAS_FPU | PPC_FEATURE_SMT, 0, NULL },
{ "IBM POWER5+", IBMPOWER5PLUS, REVFMT_MAJMIN,
PPC_FEATURE_64 | PPC_FEATURE_HAS_FPU, NULL },
PPC_FEATURE_64 | PPC_FEATURE_HAS_FPU | PPC_FEATURE_SMT, 0, NULL },
{ "IBM POWER6", IBMPOWER6, REVFMT_MAJMIN,
PPC_FEATURE_64 | PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU,
NULL },
PPC_FEATURE_64 | PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU |
PPC_FEATURE_SMT | PPC_FEATURE_ARCH_2_05, 0, NULL },
{ "IBM POWER7", IBMPOWER7, REVFMT_MAJMIN,
PPC_FEATURE_64 | PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU |
PPC_FEATURE_HAS_VSX, NULL },
PPC_FEATURE_SMT | PPC_FEATURE_ARCH_2_05 | PPC_FEATURE_ARCH_2_06 |
PPC_FEATURE_HAS_VSX, 0, NULL },
{ "IBM POWER7+", IBMPOWER7PLUS, REVFMT_MAJMIN,
PPC_FEATURE_64 | PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU |
PPC_FEATURE_HAS_VSX, NULL },
PPC_FEATURE_SMT | PPC_FEATURE_ARCH_2_05 | PPC_FEATURE_ARCH_2_06 |
PPC_FEATURE_HAS_VSX, 0, NULL },
{ "IBM POWER8E", IBMPOWER8E, REVFMT_MAJMIN,
PPC_FEATURE_64 | PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU |
PPC_FEATURE_HAS_VSX, NULL },
PPC_FEATURE_SMT | PPC_FEATURE_ARCH_2_05 | PPC_FEATURE_ARCH_2_06 |
PPC_FEATURE_HAS_VSX,
PPC_FEATURE2_ARCH_2_07 | PPC_FEATURE2_HAS_HTM |
PPC_FEATURE2_HAS_VCRYPTO, NULL },
{ "IBM POWER8", IBMPOWER8, REVFMT_MAJMIN,
PPC_FEATURE_64 | PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU |
PPC_FEATURE_HAS_VSX, NULL },
PPC_FEATURE_SMT | PPC_FEATURE_ARCH_2_05 | PPC_FEATURE_ARCH_2_06 |
PPC_FEATURE_HAS_VSX,
PPC_FEATURE2_ARCH_2_07 | PPC_FEATURE2_HAS_HTM |
PPC_FEATURE2_HAS_VCRYPTO, NULL },
{ "Motorola PowerPC 7400", MPC7400, REVFMT_MAJMIN,
PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU, cpu_6xx_setup },
PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU, 0, cpu_6xx_setup },
{ "Motorola PowerPC 7410", MPC7410, REVFMT_MAJMIN,
PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU, cpu_6xx_setup },
PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU, 0, cpu_6xx_setup },
{ "Motorola PowerPC 7450", MPC7450, REVFMT_MAJMIN,
PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU, cpu_6xx_setup },
PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU, 0, cpu_6xx_setup },
{ "Motorola PowerPC 7455", MPC7455, REVFMT_MAJMIN,
PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU, cpu_6xx_setup },
PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU, 0, cpu_6xx_setup },
{ "Motorola PowerPC 7457", MPC7457, REVFMT_MAJMIN,
PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU, cpu_6xx_setup },
PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU, 0, cpu_6xx_setup },
{ "Motorola PowerPC 7447A", MPC7447A, REVFMT_MAJMIN,
PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU, cpu_6xx_setup },
PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU, 0, cpu_6xx_setup },
{ "Motorola PowerPC 7448", MPC7448, REVFMT_MAJMIN,
PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU, cpu_6xx_setup },
PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU, 0, cpu_6xx_setup },
{ "Motorola PowerPC 8240", MPC8240, REVFMT_MAJMIN,
PPC_FEATURE_HAS_FPU, cpu_6xx_setup },
PPC_FEATURE_HAS_FPU, 0, cpu_6xx_setup },
{ "Motorola PowerPC 8245", MPC8245, REVFMT_MAJMIN,
PPC_FEATURE_HAS_FPU, cpu_6xx_setup },
PPC_FEATURE_HAS_FPU, 0, cpu_6xx_setup },
{ "Freescale e500v1 core", FSL_E500v1, REVFMT_MAJMIN,
0, cpu_booke_setup },
PPC_FEATURE_BOOKE, 0, cpu_booke_setup },
{ "Freescale e500v2 core", FSL_E500v2, REVFMT_MAJMIN,
0, cpu_booke_setup },
PPC_FEATURE_BOOKE, 0, cpu_booke_setup },
{ "Freescale e500mc core", FSL_E500mc, REVFMT_MAJMIN,
PPC_FEATURE_HAS_FPU, cpu_booke_setup },
PPC_FEATURE_BOOKE | PPC_FEATURE_HAS_FPU, 0, cpu_booke_setup },
{ "Freescale e5500 core", FSL_E5500, REVFMT_MAJMIN,
PPC_FEATURE_64 | PPC_FEATURE_HAS_FPU, cpu_booke_setup },
{ "Freescale e6500 core", FSL_E6500, REVFMT_MAJMIN,
PPC_FEATURE_64 | PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU,
PPC_FEATURE_BOOKE | PPC_FEATURE_64 | PPC_FEATURE_HAS_FPU, 0,
cpu_booke_setup },
{ "Freescale e6500 core", FSL_E6500, REVFMT_MAJMIN,
PPC_FEATURE_BOOKE | PPC_FEATURE_64 | PPC_FEATURE_HAS_ALTIVEC |
PPC_FEATURE_HAS_FPU, 0, cpu_booke_setup },
{ "IBM Cell Broadband Engine", IBMCELLBE, REVFMT_MAJMIN,
PPC_FEATURE_64 | PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU,
NULL},
{ "Unknown PowerPC CPU", 0, REVFMT_HEX, 0, NULL },
PPC_FEATURE_64 | PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU |
PPC_FEATURE_SMT, 0, NULL},
{ "Unknown PowerPC CPU", 0, REVFMT_HEX, 0, 0, NULL },
};
static void cpu_6xx_print_cacheinfo(u_int, uint16_t);
@ -194,8 +204,11 @@ static char model[64];
SYSCTL_STRING(_hw, HW_MODEL, model, CTLFLAG_RD, model, 0, "");
int cpu_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU;
int cpu_features2 = 0;
SYSCTL_OPAQUE(_hw, OID_AUTO, cpu_features, CTLFLAG_RD,
&cpu_features, sizeof(cpu_features), "IX", "PowerPC CPU features");
SYSCTL_OPAQUE(_hw, OID_AUTO, cpu_features2, CTLFLAG_RD,
&cpu_features2, sizeof(cpu_features2), "IX", "PowerPC CPU features 2");
/* Provide some user-friendly aliases for bits in cpu_features */
SYSCTL_PROC(_hw, OID_AUTO, floatingpoint, CTLTYPE_INT | CTLFLAG_RD,
@ -265,8 +278,12 @@ cpu_setup(u_int cpuid)
printf("\n");
cpu_features |= cp->features;
cpu_features2 |= cp->features2;
printf("cpu%d: Features %b\n", cpuid, cpu_features,
PPC_FEATURE_BITMASK);
if (cpu_features2 != 0)
printf("cpu%d: Features2 %b\n", cpuid, cpu_features2,
PPC_FEATURE2_BITMASK);
/*
* Configure CPU

View File

@ -352,6 +352,9 @@ powerpc_register_pic(device_t dev, uint32_t node, u_int irqs, u_int ipis,
npics++;
}
KASSERT(npics < MAX_PICS,
("Number of PICs exceeds maximum (%d)", MAX_PICS));
mtx_unlock(&intr_table_lock);
}
@ -385,6 +388,9 @@ powerpc_get_irq(uint32_t node, u_int pin)
nirqs += 128;
npics++;
KASSERT(npics < MAX_PICS,
("Number of PICs exceeds maximum (%d)", MAX_PICS));
mtx_unlock(&intr_table_lock);
return (piclist[idx].base + pin);

View File

@ -261,7 +261,8 @@ powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offset_t ofentry, void *mdp)
kmdp = preload_search_by_type("elf kernel");
if (kmdp != NULL) {
boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int);
kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *);
init_static_kenv(MD_FETCH(kmdp, MODINFOMD_ENVP, char *),
0);
endkernel = ulmax(endkernel, MD_FETCH(kmdp,
MODINFOMD_KERNEND, vm_offset_t));
#ifdef DDB

View File

@ -34,6 +34,9 @@
typedef uint64_t cell_t;
/* sparc64 doesn't use the interrupt parent #address-cells in interrupt maps */
#define OFW_IMAP_NO_IPARENT_ADDR_CELLS
int OF_decode_addr(phandle_t, int, int *, bus_addr_t *);
void OF_getetheraddr(device_t, u_char *);
u_int OF_getscsinitid(device_t);

View File

@ -379,7 +379,8 @@ sparc64_init(caddr_t mdp, u_long o1, u_long o2, u_long o3, ofw_vec_t *vec)
kmdp = preload_search_by_type("elf kernel");
if (kmdp != NULL) {
boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int);
kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *);
init_static_kenv(MD_FETCH(kmdp, MODINFOMD_ENVP, char *),
0);
end = MD_FETCH(kmdp, MODINFOMD_KERNEND, vm_offset_t);
kernel_tlb_slots = MD_FETCH(kmdp, MODINFOMD_DTLB_SLOTS,
int);

View File

@ -296,7 +296,7 @@ xen_pv_set_env(void)
for (cmd_line_next = cmd_line; strsep(&cmd_line_next, ",") != NULL;)
;
init_static_kenv(cmd_line, env_size);
init_static_kenv(cmd_line, 0);
}
static void
@ -382,6 +382,7 @@ xen_pv_parse_preload_data(u_int64_t modulep)
caddr_t kmdp;
vm_ooffset_t off;
vm_paddr_t metadata;
char *envp;
if (HYPERVISOR_start_info->mod_start != 0) {
preload_metadata = (caddr_t)(HYPERVISOR_start_info->mod_start);
@ -404,8 +405,10 @@ xen_pv_parse_preload_data(u_int64_t modulep)
preload_bootstrap_relocate(off);
boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int);
kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *);
kern_envp += off;
envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *);
if (envp != NULL)
envp += off;
init_static_kenv(envp, 0);
} else {
/* Parse the extra boot information given by Xen */
xen_pv_set_env();

View File

@ -5,4 +5,11 @@ name="$(mktemp -u mirror.XXXXXX)"
class="mirror"
base=`basename $0`
gmirror_test_cleanup()
{
[ -c /dev/$class/$name ] && gmirror destroy $name
geom_test_cleanup
}
trap gmirror_test_cleanup ABRT EXIT INT TERM
. `dirname $0`/../geom_subr.sh

View File

@ -5,15 +5,11 @@
echo "1..1"
us0=45
us1=`expr $us0 + 1`
us2=`expr $us0 + 2`
us0=$(attach_md -t malloc -s 1M) || exit 1
us1=$(attach_md -t malloc -s 2M) || exit 1
us2=$(attach_md -t malloc -s 3M) || exit 1
mdconfig -a -t malloc -s 1M -u $us0 || exit 1
mdconfig -a -t malloc -s 2M -u $us1 || exit 1
mdconfig -a -t malloc -s 3M -u $us2 || exit 1
gmirror label $name /dev/md${us0} /dev/md${us1} /dev/md${us2} || exit 1
gmirror label $name /dev/$us0 /dev/$us1 /dev/$us2 || exit 1
devwait
# Size of created device should be 1MB - 512b.
@ -25,10 +21,3 @@ if [ $size -eq 1048064 ]; then
else
echo "not ok 1"
fi
gmirror remove $name md${us0}
gmirror remove $name md${us1}
gmirror remove $name md${us2}
mdconfig -d -u $us0
mdconfig -d -u $us1
mdconfig -d -u $us2

View File

@ -6,22 +6,19 @@
echo "1..4"
balance="round-robin"
us0=45
us1=`expr $us0 + 1`
us2=`expr $us0 + 2`
ddbs=2048
nblocks1=1024
nblocks2=`expr $nblocks1 / \( $ddbs / 512 \)`
src=`mktemp /tmp/$base.XXXXXX` || exit 1
dst=`mktemp /tmp/$base.XXXXXX` || exit 1
src=`mktemp $base.XXXXXX` || exit 1
dst=`mktemp $base.XXXXXX` || exit 1
dd if=/dev/random of=${src} bs=$ddbs count=$nblocks2 >/dev/null 2>&1
mdconfig -a -t malloc -s `expr $nblocks1 + 1` -u $us0 || exit 1
mdconfig -a -t malloc -s `expr $nblocks1 + 1` -u $us1 || exit 1
mdconfig -a -t malloc -s `expr $nblocks1 + 1` -u $us2 || exit 1
us0=$(attach_md -t malloc -s `expr $nblocks1 + 1`) || exit 1
us1=$(attach_md -t malloc -s `expr $nblocks1 + 1`) || exit 1
us2=$(attach_md -t malloc -s `expr $nblocks1 + 1`) || exit 1
gmirror label -b $balance $name /dev/md${us0} /dev/md${us1} /dev/md${us2} || exit 1
gmirror label -b $balance $name /dev/${us0} /dev/${us1} /dev/${us2} || exit 1
devwait
dd if=${src} of=/dev/mirror/${name} bs=$ddbs count=$nblocks2 >/dev/null 2>&1
@ -32,28 +29,24 @@ if [ `md5 -q ${src}` != `md5 -q ${dst}` ]; then
else
echo "ok 1"
fi
dd if=/dev/md${us0} of=${dst} bs=$ddbs count=$nblocks2 >/dev/null 2>&1
dd if=/dev/${us0} of=${dst} bs=$ddbs count=$nblocks2 >/dev/null 2>&1
if [ `md5 -q ${src}` != `md5 -q ${dst}` ]; then
echo "not ok 2"
else
echo "ok 2"
fi
dd if=/dev/md${us1} of=${dst} bs=$ddbs count=$nblocks2 >/dev/null 2>&1
dd if=/dev/${us1} of=${dst} bs=$ddbs count=$nblocks2 >/dev/null 2>&1
if [ `md5 -q ${src}` != `md5 -q ${dst}` ]; then
echo "not ok 3"
else
echo "ok 3"
fi
dd if=/dev/md${us2} of=${dst} bs=$ddbs count=$nblocks2 >/dev/null 2>&1
dd if=/dev/${us2} of=${dst} bs=$ddbs count=$nblocks2 >/dev/null 2>&1
if [ `md5 -q ${src}` != `md5 -q ${dst}` ]; then
echo "not ok 4"
else
echo "ok 4"
fi
gmirror remove $name md${us0} md${us1} md${us2}
mdconfig -d -u $us0
mdconfig -d -u $us1
mdconfig -d -u $us2
rm -f ${src} ${dst}

View File

@ -6,22 +6,19 @@
echo "1..5"
balance="round-robin"
us0=45
us1=`expr $us0 + 1`
us2=`expr $us0 + 2`
ddbs=2048
nblocks1=1024
nblocks2=`expr $nblocks1 / \( $ddbs / 512 \)`
src=`mktemp /tmp/$base.XXXXXX` || exit 1
dst=`mktemp /tmp/$base.XXXXXX` || exit 1
src=`mktemp $base.XXXXXX` || exit 1
dst=`mktemp $base.XXXXXX` || exit 1
dd if=/dev/random of=${src} bs=$ddbs count=$nblocks2 >/dev/null 2>&1
mdconfig -a -t malloc -s `expr $nblocks1 + 1` -u $us0 || exit 1
mdconfig -a -t malloc -s `expr $nblocks1 + 1` -u $us1 || exit 1
mdconfig -a -t malloc -s `expr $nblocks1 + 1` -u $us2 || exit 1
us0=$(attach_md -t malloc -s `expr $nblocks1 + 1`) || exit 1
us1=$(attach_md -t malloc -s `expr $nblocks1 + 1`) || exit 1
us2=$(attach_md -t malloc -s `expr $nblocks1 + 1`) || exit 1
gmirror label -b $balance $name /dev/md${us0} /dev/md${us1} /dev/md${us2} || exit 1
gmirror label -b $balance $name /dev/${us0} /dev/${us1} /dev/${us2} || exit 1
devwait
dd if=${src} of=/dev/mirror/${name} bs=$ddbs count=$nblocks2 >/dev/null 2>&1
@ -33,7 +30,7 @@ else
echo "ok 1"
fi
gmirror remove $name md${us0}
gmirror remove $name ${us0}
dd if=/dev/mirror/${name} of=${dst} bs=$ddbs count=$nblocks2 >/dev/null 2>&1
if [ `md5 -q ${src}` != `md5 -q ${dst}` ]; then
echo "not ok 2"
@ -41,7 +38,7 @@ else
echo "ok 2"
fi
gmirror remove $name md${us1}
gmirror remove $name ${us1}
dd if=/dev/mirror/${name} of=${dst} bs=$ddbs count=$nblocks2 >/dev/null 2>&1
if [ `md5 -q ${src}` != `md5 -q ${dst}` ]; then
echo "not ok 3"
@ -49,7 +46,7 @@ else
echo "ok 3"
fi
gmirror remove $name md${us2}
gmirror remove $name ${us2}
dd if=/dev/mirror/${name} of=${dst} bs=$ddbs count=$nblocks2 >/dev/null 2>&1
if [ `md5 -q ${src}` != `md5 -q ${dst}` ]; then
echo "not ok 4"
@ -64,7 +61,4 @@ else
echo "ok 5"
fi
mdconfig -d -u $us0
mdconfig -d -u $us1
mdconfig -d -u $us2
rm -f ${src} ${dst}

Some files were not shown because too many files have changed in this diff Show More