sync with OpenBSD -current
This commit is contained in:
parent
086d8cf2c2
commit
e53750f3c3
@ -1694,6 +1694,7 @@
|
||||
./usr/share/man/man2/open.2
|
||||
./usr/share/man/man2/pathconf.2
|
||||
./usr/share/man/man2/pinsyscall.2
|
||||
./usr/share/man/man2/pinsyscalls.2
|
||||
./usr/share/man/man2/pipe.2
|
||||
./usr/share/man/man2/pledge.2
|
||||
./usr/share/man/man2/poll.2
|
||||
|
@ -1,4 +1,4 @@
|
||||
# $OpenBSD: login.conf,v 1.14 2023/11/14 12:48:46 jsg Exp $
|
||||
# $OpenBSD: login.conf,v 1.15 2023/12/11 19:52:40 kettenis Exp $
|
||||
|
||||
#
|
||||
# Sample login.conf file. See login.conf(5) for details.
|
||||
@ -71,7 +71,7 @@ daemon:\
|
||||
# Staff have fewer restrictions and can login even when nologins are set.
|
||||
#
|
||||
staff:\
|
||||
:datasize-cur=512M:\
|
||||
:datasize-cur=1536M:\
|
||||
:datasize-max=infinity:\
|
||||
:maxproc-max=512:\
|
||||
:maxproc-cur=128:\
|
||||
|
@ -1,4 +1,4 @@
|
||||
# $OpenBSD: login.conf,v 1.18 2023/11/13 20:19:45 sthen Exp $
|
||||
# $OpenBSD: login.conf,v 1.19 2023/12/11 19:52:40 kettenis Exp $
|
||||
|
||||
#
|
||||
# Sample login.conf file. See login.conf(5) for details.
|
||||
@ -70,7 +70,7 @@ daemon:\
|
||||
# Staff have fewer restrictions and can login even when nologins are set.
|
||||
#
|
||||
staff:\
|
||||
:datasize-cur=512M:\
|
||||
:datasize-cur=768M:\
|
||||
:datasize-max=infinity:\
|
||||
:maxproc-max=512:\
|
||||
:maxproc-cur=128:\
|
||||
|
@ -34,7 +34,7 @@ BEGIN {
|
||||
$Is{SunOS4} = $^O eq 'sunos';
|
||||
$Is{Solaris} = $^O eq 'solaris';
|
||||
$Is{SunOS} = $Is{SunOS4} || $Is{Solaris};
|
||||
$Is{BSD} = ($^O =~ /^(?:free|net|open)bsd$/ or
|
||||
$Is{BSD} = ($^O =~ /^(?:free|net|open|sec)bsd$/ or
|
||||
grep( $^O eq $_, qw(bsdos interix dragonfly) )
|
||||
);
|
||||
$Is{Android} = $^O =~ /android/;
|
||||
|
@ -34,8 +34,8 @@ BEGIN {
|
||||
*is_hpux = $^O =~ m/hpux/ ? \&TRUE : \&FALSE unless defined &is_hpux;
|
||||
*is_openbsd = $^O =~ m/openbsd/ ? \&TRUE : \&FALSE unless defined &is_openbsd;
|
||||
*is_freebsd = $^O =~ m/freebsd/ ? \&TRUE : \&FALSE unless defined &is_freebsd;
|
||||
*is_secbsd = $^O =~ m/secbsd/ ? \&TRUE : \&FALSE unless defined &is_secbsd;
|
||||
*is_bitrig = $^O =~ m/bitrig/ ? \&TRUE : \&FALSE unless defined &is_bitrig;
|
||||
*is_secbsd = $^O =~ m/bitrig/ ? \&TRUE : \&FALSE unless defined &is_secbsd;
|
||||
}
|
||||
|
||||
sub _perldoc_elem {
|
||||
|
@ -63,7 +63,7 @@ sub init {
|
||||
sub _roffer_candidates {
|
||||
my( $self ) = @_;
|
||||
|
||||
if( $self->is_openbsd || $self->is_freebsd || $self->is_bitrig ) { qw( mandoc groff nroff ) }
|
||||
if( $self->is_openbsd || $self->is_freebsd || $self->is_bitrig || $self->is_secbsd ) { qw( mandoc groff nroff ) }
|
||||
else { qw( groff nroff mandoc ) }
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: DEFS.h,v 1.2 2023/12/10 16:45:50 deraadt Exp $ */
|
||||
/* $OpenBSD: DEFS.h,v 1.4 2023/12/11 22:24:15 kettenis Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2015,2018,2021 Philip Guenther <guenther@openbsd.org>
|
||||
*
|
||||
@ -20,8 +20,10 @@
|
||||
/* ARM just had to be different... */
|
||||
#ifndef __arm__
|
||||
# define _FUNC_TYPE @function
|
||||
# define _PROGBITS @progbits
|
||||
#else
|
||||
# define _FUNC_TYPE #function
|
||||
# define _PROGBITS %progbits
|
||||
#endif
|
||||
|
||||
/*
|
||||
@ -69,7 +71,8 @@
|
||||
#define _END(x) .size x, . - x
|
||||
|
||||
#define PINSYSCALL(sysno, label) \
|
||||
.pushsection .openbsd.syscalls,"",@progbits; \
|
||||
.pushsection .openbsd.syscalls,"",_PROGBITS; \
|
||||
.p2align 2; \
|
||||
.long label; \
|
||||
.long sysno; \
|
||||
.popsection;
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: SYS.h,v 1.17 2023/12/10 16:45:50 deraadt Exp $ */
|
||||
/* $OpenBSD: SYS.h,v 1.18 2023/12/11 22:24:15 kettenis Exp $ */
|
||||
/* $NetBSD: SYS.h,v 1.4 1996/10/17 03:03:53 cgd Exp $ */
|
||||
|
||||
/*
|
||||
@ -58,6 +58,7 @@
|
||||
|
||||
#define PINSYSCALL(sysno, label) \
|
||||
.pushsection .openbsd.syscalls,"",@progbits; \
|
||||
.p2align 2; \
|
||||
.long label; \
|
||||
.long sysno; \
|
||||
.popsection;
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: SYS.h,v 1.24 2023/12/10 16:45:51 deraadt Exp $ */
|
||||
/* $OpenBSD: SYS.h,v 1.26 2023/12/11 22:24:15 kettenis Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1998-2002 Michael Shalayeff
|
||||
@ -69,6 +69,7 @@
|
||||
|
||||
#define PINSYSCALL(sysno, label) \
|
||||
.pushsection .openbsd.syscalls,"",@progbits !\
|
||||
.p2align 2 !\
|
||||
.long label !\
|
||||
.long sysno !\
|
||||
.popsection
|
||||
@ -120,8 +121,8 @@ SYSENTRY(x) !\
|
||||
stw rp, HPPA_FRAME_ERP(sr0,sp) !\
|
||||
ldil L%SYSCALLGATE, r1 !\
|
||||
97: ble 4(sr7, r1) !\
|
||||
PINSYSCALL(__CONCAT(SYS_,x), 97b) !\
|
||||
ldi __CONCAT(SYS_,x), t1 !\
|
||||
PINSYSCALL(__CONCAT(SYS_,y), 97b) !\
|
||||
ldi __CONCAT(SYS_,y), t1 !\
|
||||
ldw HPPA_FRAME_ERP(sr0,sp), rp !\
|
||||
bv r0(rp) !\
|
||||
nop !\
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: DEFS.h,v 1.4 2023/12/10 16:45:51 deraadt Exp $ */
|
||||
/* $OpenBSD: DEFS.h,v 1.5 2023/12/11 22:24:15 kettenis Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2017 Philip Guenther <guenther@openbsd.org>
|
||||
*
|
||||
@ -50,6 +50,7 @@
|
||||
|
||||
#define PINSYSCALL(sysno, label) \
|
||||
.pushsection .openbsd.syscalls,"",@progbits; \
|
||||
.p2align 2; \
|
||||
.long label; \
|
||||
.long sysno; \
|
||||
.popsection;
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: DEFS.h,v 1.4 2023/12/10 16:45:51 deraadt Exp $ */
|
||||
/* $OpenBSD: DEFS.h,v 1.5 2023/12/11 22:24:15 kettenis Exp $ */
|
||||
|
||||
#include <machine/asm.h>
|
||||
|
||||
@ -26,6 +26,7 @@
|
||||
|
||||
#define PINSYSCALL(sysno, label) \
|
||||
.pushsection .openbsd.syscalls,"",@progbits; \
|
||||
.p2align 2; \
|
||||
.long label; \
|
||||
.long sysno; \
|
||||
.popsection;
|
||||
|
@ -29,7 +29,7 @@
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $OpenBSD: SYS.h,v 1.13 2023/12/10 16:45:51 deraadt Exp $
|
||||
* $OpenBSD: SYS.h,v 1.14 2023/12/11 22:24:16 kettenis Exp $
|
||||
*/
|
||||
|
||||
#include <sys/syscall.h>
|
||||
@ -127,6 +127,7 @@
|
||||
|
||||
#define PINSYSCALL(sysno, label) \
|
||||
.pushsection .openbsd.syscalls,"",@progbits; \
|
||||
.p2align 2; \
|
||||
.long label; \
|
||||
.long sysno; \
|
||||
.popsection;
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: DEFS.h,v 1.2 2023/12/10 16:45:52 deraadt Exp $ */
|
||||
/* $OpenBSD: DEFS.h,v 1.3 2023/12/11 22:24:16 kettenis Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1990 The Regents of the University of California.
|
||||
@ -70,6 +70,7 @@
|
||||
|
||||
#define PINSYSCALL(sysno, label) \
|
||||
.pushsection .openbsd.syscalls,"",@progbits; \
|
||||
.p2align 2; \
|
||||
.long label; \
|
||||
.long sysno; \
|
||||
.popsection;
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: DEFS.h,v 1.2 2023/12/10 16:45:52 deraadt Exp $ */
|
||||
/* $OpenBSD: DEFS.h,v 1.3 2023/12/11 22:24:16 kettenis Exp $ */
|
||||
/*-
|
||||
* Copyright (c) 1990 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
@ -60,6 +60,7 @@
|
||||
|
||||
#define PINSYSCALL(sysno, label) \
|
||||
.pushsection .openbsd.syscalls,"",@progbits; \
|
||||
.p2align 2; \
|
||||
.long label; \
|
||||
.long sysno; \
|
||||
.popsection;
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: SYS.h,v 1.14 2023/12/10 16:45:52 deraadt Exp $ */
|
||||
/* $OpenBSD: SYS.h,v 1.15 2023/12/11 22:24:16 kettenis Exp $ */
|
||||
/*-
|
||||
* Copyright (c) 1990 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
@ -87,6 +87,7 @@
|
||||
|
||||
#define PINSYSCALL(sysno, label) \
|
||||
.pushsection .openbsd.syscalls,"",@progbits; \
|
||||
.p2align 2; \
|
||||
.long label; \
|
||||
.long sysno; \
|
||||
.popsection;
|
||||
|
@ -1,4 +1,4 @@
|
||||
# $OpenBSD: Makefile.inc,v 1.174 2023/08/20 15:17:53 visa Exp $
|
||||
# $OpenBSD: Makefile.inc,v 1.175 2023/12/11 00:34:24 deraadt Exp $
|
||||
# $NetBSD: Makefile.inc,v 1.35 1995/10/16 23:49:07 jtc Exp $
|
||||
# @(#)Makefile.inc 8.1 (Berkeley) 6/17/93
|
||||
|
||||
@ -208,8 +208,8 @@ MAN+= __get_tcb.2 __thrsigdivert.2 __thrsleep.2 _exit.2 accept.2 \
|
||||
mimmutable.2 minherit.2 mkdir.2 mkfifo.2 mknod.2 mlock.2 \
|
||||
mlockall.2 mmap.2 mount.2 mprotect.2 mquery.2 msyscall.2 msgctl.2 \
|
||||
msgget.2 msgrcv.2 msgsnd.2 msync.2 munmap.2 nanosleep.2 \
|
||||
nfssvc.2 open.2 pathconf.2 pinsyscall.2 pipe.2 pledge.2 poll.2 \
|
||||
profil.2 ptrace.2 quotactl.2 read.2 readlink.2 reboot.2 recv.2 \
|
||||
nfssvc.2 open.2 pathconf.2 pinsyscall.2 pinsyscalls.2 pipe.2 pledge.2 \
|
||||
poll.2 profil.2 ptrace.2 quotactl.2 read.2 readlink.2 reboot.2 recv.2 \
|
||||
rename.2 revoke.2 rmdir.2 sched_yield.2 select.2 semctl.2 semget.2 \
|
||||
semop.2 send.2 setgroups.2 setpgid.2 setregid.2 \
|
||||
setresuid.2 setreuid.2 setsid.2 sendsyslog.2 setuid.2 shmat.2 \
|
||||
|
76
lib/libc/sys/pinsyscalls.2
Normal file
76
lib/libc/sys/pinsyscalls.2
Normal file
@ -0,0 +1,76 @@
|
||||
.\" $OpenBSD: pinsyscalls.2,v 1.1 2023/12/11 00:34:24 deraadt Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 2023 Theo de Raadt <deraadt@openbsd.org>
|
||||
.\"
|
||||
.\" Permission to use, copy, modify, and distribute this software for any
|
||||
.\" purpose with or without fee is hereby granted, provided that the above
|
||||
.\" copyright notice and this permission notice appear in all copies.
|
||||
.\"
|
||||
.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
.\"
|
||||
.Dd $Mdocdate: December 11 2023 $
|
||||
.Dt PINSYSCALLS 2
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm pinsyscalls
|
||||
.Nd pin system call entry to precise locations in the address space
|
||||
.Sh SYNOPSIS
|
||||
.In sys/types.h
|
||||
.Ft int
|
||||
.Fn pinsyscalls "void *start" "size_t len" "uint *pintable" "size_t pintablesize"
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Fn pinsyscalls
|
||||
system call specifies the
|
||||
.Va start
|
||||
to
|
||||
.Va start + len
|
||||
range in the address space where the system call entry instructions are found,
|
||||
and furthermore provides a table of uint offsets from that
|
||||
.Va start
|
||||
(indexed by the system call number) to
|
||||
provide the precise location for the system call instruction required
|
||||
for that system call number.
|
||||
.Pp
|
||||
.Fn pinsyscalls
|
||||
is only called by the shared library linker
|
||||
.Xr ld.so 1
|
||||
to tell the kernel where system calls are found in the dynamic library
|
||||
.Pa libc.so
|
||||
(the filename is actually /usr/lib/libc.so.major.minor).
|
||||
.Pp
|
||||
A similar setup operation is done automatically by the kernel for
|
||||
the system calls found in
|
||||
.Xr ld.so 1
|
||||
and in static executables.
|
||||
.Pp
|
||||
Once the kernel knows the specific location in the address space where
|
||||
a specific system call must be entered from, any attempt to use a different
|
||||
system call entry instruction to perform a non-corresponding system call
|
||||
operation will fail with signal
|
||||
.Dv SIGABRT .
|
||||
.Sh RETURN VALUES
|
||||
.Rv -std
|
||||
.Sh ERRORS
|
||||
.Fn pinsyscalls
|
||||
will fail if:
|
||||
.Bl -tag -width Er
|
||||
.It Bq Er EINVAL
|
||||
Process already has a system call pinning table loaded.
|
||||
.It Bq Er EPERM
|
||||
A static binary tried to call
|
||||
.Fn pinsyscalls .
|
||||
.It Bq Er ERANGE
|
||||
At least one system call offset is out of bounds.
|
||||
.El
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Fn pinsyscalls
|
||||
system call first appeared in
|
||||
.Ox 7.4 .
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: SYS.h,v 1.6 2023/12/10 16:45:50 deraadt Exp $ */
|
||||
/* $OpenBSD: SYS.h,v 1.7 2023/12/11 22:29:23 deraadt Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2016 Dale Rahn
|
||||
@ -31,6 +31,7 @@
|
||||
|
||||
#define PINSYSCALL(sysno, label) \
|
||||
.pushsection .openbsd.syscalls,"",@progbits ;\
|
||||
.p2align 2 ;\
|
||||
.long label ;\
|
||||
.long sysno ;\
|
||||
.popsection
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: SYS.h,v 1.4 2023/12/10 16:45:50 deraadt Exp $ */
|
||||
/* $OpenBSD: SYS.h,v 1.5 2023/12/11 22:29:24 deraadt Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2001 Niklas Hallqvist
|
||||
@ -63,6 +63,7 @@
|
||||
|
||||
#define PINSYSCALL(sysno, label) \
|
||||
.pushsection .openbsd.syscalls,"",@progbits ;\
|
||||
.p2align 2 ;\
|
||||
.long label ;\
|
||||
.long sysno ;\
|
||||
.popsection
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: SYS.h,v 1.4 2023/12/10 16:45:50 deraadt Exp $ */
|
||||
/* $OpenBSD: SYS.h,v 1.5 2023/12/11 22:29:24 deraadt Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2002,2004 Dale Rahn
|
||||
@ -32,6 +32,7 @@
|
||||
|
||||
#define PINSYSCALL(sysno, label) \
|
||||
.pushsection .openbsd.syscalls,"",@progbits ;\
|
||||
.p2align 2 ;\
|
||||
.long label ;\
|
||||
.long sysno ;\
|
||||
.popsection
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: SYS.h,v 1.4 2023/12/10 16:45:50 deraadt Exp $ */
|
||||
/* $OpenBSD: SYS.h,v 1.6 2023/12/11 22:29:24 deraadt Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2004 Dale Rahn
|
||||
@ -30,7 +30,8 @@
|
||||
#include <sys/syscall.h>
|
||||
|
||||
#define PINSYSCALL(sysno, label) \
|
||||
.pushsection .openbsd.syscalls,"",@progbits ;\
|
||||
.pushsection .openbsd.syscalls,"",%progbits ;\
|
||||
.p2align 2 ;\
|
||||
.long label ;\
|
||||
.long sysno ;\
|
||||
.popsection
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: SYS.h,v 1.2 2023/12/10 16:45:50 deraadt Exp $ */
|
||||
/* $OpenBSD: SYS.h,v 1.3 2023/12/11 22:29:24 deraadt Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2004 Michael Shalayeff
|
||||
@ -35,6 +35,7 @@
|
||||
|
||||
#define PINSYSCALL(sysno, label) \
|
||||
.pushsection .openbsd.syscalls,"",@progbits !\
|
||||
.p2align 2 !\
|
||||
.long label !\
|
||||
.long sysno !\
|
||||
.popsection
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: SYS.h,v 1.2 2023/12/10 16:45:50 deraadt Exp $ */
|
||||
/* $OpenBSD: SYS.h,v 1.3 2023/12/11 22:29:24 deraadt Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2002 Dale Rahn
|
||||
@ -32,6 +32,7 @@
|
||||
|
||||
#define PINSYSCALL(sysno, label) \
|
||||
.pushsection .openbsd.syscalls,"",@progbits ;\
|
||||
.p2align 2 ;\
|
||||
.long label ;\
|
||||
.long sysno ;\
|
||||
.popsection
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: SYS.h,v 1.5 2023/12/10 16:45:50 deraadt Exp $ */
|
||||
/* $OpenBSD: SYS.h,v 1.6 2023/12/11 22:29:24 deraadt Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2013 Miodrag Vallat.
|
||||
@ -46,6 +46,7 @@
|
||||
|
||||
#define PINSYSCALL(sysno, label) \
|
||||
.pushsection .openbsd.syscalls,"",@progbits ;\
|
||||
.p2align 2 ;\
|
||||
.long label ;\
|
||||
.long sysno ;\
|
||||
.popsection
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: SYS.h,v 1.2 2023/12/10 16:45:50 deraadt Exp $ */
|
||||
/* $OpenBSD: SYS.h,v 1.3 2023/12/11 22:29:24 deraadt Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1998-2002 Opsycon AB, Sweden.
|
||||
@ -31,6 +31,7 @@
|
||||
|
||||
#define PINSYSCALL(sysno, label) \
|
||||
.pushsection .openbsd.syscalls,"",@progbits ;\
|
||||
.p2align 2 ;\
|
||||
.long label ;\
|
||||
.long sysno ;\
|
||||
.popsection
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: SYS.h,v 1.5 2023/12/10 16:45:50 deraadt Exp $ */
|
||||
/* $OpenBSD: SYS.h,v 1.6 2023/12/11 22:29:24 deraadt Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1999 Dale Rahn
|
||||
@ -31,6 +31,7 @@
|
||||
|
||||
#define PINSYSCALL(sysno, label) \
|
||||
.pushsection .openbsd.syscalls,"",@progbits ;\
|
||||
.p2align 2 ;\
|
||||
.long label ;\
|
||||
.long sysno ;\
|
||||
.popsection
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: SYS.h,v 1.3 2023/12/10 16:45:50 deraadt Exp $ */
|
||||
/* $OpenBSD: SYS.h,v 1.4 2023/12/11 22:29:24 deraadt Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1999 Dale Rahn
|
||||
@ -31,6 +31,7 @@
|
||||
|
||||
#define PINSYSCALL(sysno, label) \
|
||||
.pushsection .openbsd.syscalls,"",@progbits ;\
|
||||
.p2align 2 ;\
|
||||
.long label ;\
|
||||
.long sysno ;\
|
||||
.popsection
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: SYS.h,v 1.2 2023/12/10 16:45:50 deraadt Exp $ */
|
||||
/* $OpenBSD: SYS.h,v 1.3 2023/12/11 22:29:25 deraadt Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2016 Dale Rahn <drahn@openbsd.org>
|
||||
@ -31,6 +31,7 @@
|
||||
|
||||
#define PINSYSCALL(sysno, label) \
|
||||
.pushsection .openbsd.syscalls,"",@progbits ;\
|
||||
.p2align 2 ;\
|
||||
.long label ;\
|
||||
.long sysno ;\
|
||||
.popsection
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: SYS.h,v 1.3 2023/12/10 16:45:50 deraadt Exp $ */
|
||||
/* $OpenBSD: SYS.h,v 1.4 2023/12/11 22:29:25 deraadt Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2006 Dale Rahn
|
||||
@ -31,6 +31,7 @@
|
||||
|
||||
#define PINSYSCALL(sysno, label) \
|
||||
.pushsection .openbsd.syscalls,"",@progbits ;\
|
||||
.p2align 2 ;\
|
||||
.long label ;\
|
||||
.long sysno ;\
|
||||
.popsection
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: SYS.h,v 1.5 2023/12/10 16:45:50 deraadt Exp $ */
|
||||
/* $OpenBSD: SYS.h,v 1.6 2023/12/11 22:29:25 deraadt Exp $ */
|
||||
/* $NetBSD: rtld_start.S,v 1.5 2001/08/14 22:17:48 eeh Exp $ */
|
||||
|
||||
/*
|
||||
@ -70,6 +70,7 @@
|
||||
|
||||
#define PINSYSCALL(sysno, label) \
|
||||
.pushsection .openbsd.syscalls,"",@progbits ;\
|
||||
.p2align 2 ;\
|
||||
.long label ;\
|
||||
.long sysno ;\
|
||||
.popsection
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: evp_test.c,v 1.10 2023/12/08 08:30:04 tb Exp $ */
|
||||
/* $OpenBSD: evp_test.c,v 1.11 2023/12/10 19:20:06 tb Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2022 Joel Sing <jsing@openbsd.org>
|
||||
* Copyright (c) 2023 Theo Buehler <tb@openbsd.org>
|
||||
@ -601,7 +601,6 @@ obj_name_cb(const OBJ_NAME *obj_name, void *do_all_arg)
|
||||
previous, obj_name->name);
|
||||
}
|
||||
|
||||
|
||||
arg->failure |= arg_copy.failure;
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
.\" $OpenBSD: acpi.4,v 1.72 2023/04/27 19:26:06 jmc Exp $
|
||||
.\" $OpenBSD: acpi.4,v 1.73 2023/12/11 15:21:14 jmc Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 2006 Alexander Yurchenko <grange@openbsd.org>
|
||||
.\"
|
||||
@ -14,7 +14,7 @@
|
||||
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
.\"
|
||||
.Dd $Mdocdate: April 27 2023 $
|
||||
.Dd $Mdocdate: December 11 2023 $
|
||||
.Dt ACPI 4
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -98,6 +98,8 @@ ACPI video output
|
||||
ASUSTeK AI Booster ACPI ATK0110 temperature, voltage, and fan sensor
|
||||
.It Xr amdgpio 4
|
||||
AMD GPIO controller
|
||||
.It Xr ampchwm 4
|
||||
Ampere Altra fine-grained power telemetry
|
||||
.It Xr aplgpio 4
|
||||
Intel Apollo Lake GPIO controller
|
||||
.It Xr asmc 4
|
||||
|
@ -1,6 +1,6 @@
|
||||
# $OpenBSD: Makefile,v 1.32 2022/12/17 12:02:00 kettenis Exp $
|
||||
# $OpenBSD: Makefile,v 1.33 2023/12/11 11:17:34 claudio Exp $
|
||||
|
||||
MAN= agintc.4 agtimer.4 ampintc.4 \
|
||||
MAN= agintc.4 agtimer.4 ampchwm.4 ampintc.4 \
|
||||
aplaudio.4 aplcpu.4 apldart.4 apldma.4 apldog.4 aplefuse.4 \
|
||||
aplhidev.4 apliic.4 aplintc.4 aplmbox.4 aplmca.4 aplnco.4 aplns.4 \
|
||||
aplpcie.4 aplpinctrl.4 aplpmgr.4 aplpmu.4 aplpwm.4 \
|
||||
|
48
share/man/man4/man4.arm64/ampchwm.4
Normal file
48
share/man/man4/man4.arm64/ampchwm.4
Normal file
@ -0,0 +1,48 @@
|
||||
.\" $OpenBSD: ampchwm.4,v 1.2 2023/12/11 15:21:15 jmc Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 2023 Claudio Jeker <claudio@openbsd.org>
|
||||
.\"
|
||||
.\" Permission to use, copy, modify, and distribute this software for any
|
||||
.\" purpose with or without fee is hereby granted, provided that the above
|
||||
.\" copyright notice and this permission notice appear in all copies.
|
||||
.\"
|
||||
.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
.\"
|
||||
.Dd $Mdocdate: December 11 2023 $
|
||||
.Dt AMPCHWM 4 arm64
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm ampchwm
|
||||
.Nd Ampere Altra fine-grained power telemetry
|
||||
.Sh SYNOPSIS
|
||||
.Cd "ampchwm* at acpi?"
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm
|
||||
driver provides support for the per-core power telemetry firmware interface
|
||||
found on the Ampere Altra SoC.
|
||||
.Pp
|
||||
Sensor values are made available through the
|
||||
.Xr sysctl 8
|
||||
interface.
|
||||
.Sh SEE ALSO
|
||||
.Xr intro 4 ,
|
||||
.Xr sensorsd 8 ,
|
||||
.Xr sysctl 8
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Nm
|
||||
driver first appeared in
|
||||
.Ox 7.5 .
|
||||
.Sh AUTHORS
|
||||
.An -nosplit
|
||||
The
|
||||
.Nm
|
||||
driver was written by
|
||||
.An Claudio Jeker Aq Mt claudio@openbsd.org .
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: vmm_machdep.c,v 1.11 2023/11/26 13:02:44 dv Exp $ */
|
||||
/* $OpenBSD: vmm_machdep.c,v 1.12 2023/12/10 21:25:14 dv Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2014 Mike Larkin <mlarkin@openbsd.org>
|
||||
*
|
||||
@ -1055,6 +1055,7 @@ start_vmm_on_cpu(struct cpu_info *ci)
|
||||
{
|
||||
uint64_t msr;
|
||||
uint32_t cr4;
|
||||
struct vmx_invept_descriptor vid;
|
||||
|
||||
/* No VMM mode? exit. */
|
||||
if ((ci->ci_vmm_flags & CI_VMM_VMX) == 0 &&
|
||||
@ -1081,11 +1082,6 @@ start_vmm_on_cpu(struct cpu_info *ci)
|
||||
ci->ci_vmxon_region->vr_revision =
|
||||
ci->ci_vmm_cap.vcc_vmx.vmx_vmxon_revision;
|
||||
|
||||
/* Set CR4.VMXE */
|
||||
cr4 = rcr4();
|
||||
cr4 |= CR4_VMXE;
|
||||
lcr4(cr4);
|
||||
|
||||
/* Enable VMX */
|
||||
msr = rdmsr(MSR_IA32_FEATURE_CONTROL);
|
||||
if (msr & IA32_FEATURE_CONTROL_LOCK) {
|
||||
@ -1097,9 +1093,18 @@ start_vmm_on_cpu(struct cpu_info *ci)
|
||||
wrmsr(MSR_IA32_FEATURE_CONTROL, msr);
|
||||
}
|
||||
|
||||
/* Enter VMX mode */
|
||||
/* Set CR4.VMXE */
|
||||
cr4 = rcr4();
|
||||
cr4 |= CR4_VMXE;
|
||||
lcr4(cr4);
|
||||
|
||||
/* Enter VMX mode and clear EPTs on this cpu */
|
||||
if (vmxon((uint64_t *)&ci->ci_vmxon_region_pa))
|
||||
return;
|
||||
panic("vmxon failed");
|
||||
|
||||
memset(&vid, 0, sizeof(vid));
|
||||
if (invept(IA32_VMX_INVEPT_GLOBAL_CTX, &vid))
|
||||
panic("invept failed");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: pmap.h,v 1.86 2023/04/13 15:23:21 miod Exp $ */
|
||||
/* $OpenBSD: pmap.h,v 1.87 2023/12/11 22:12:52 kettenis Exp $ */
|
||||
/* $NetBSD: pmap.h,v 1.1 2003/04/26 18:39:46 fvdl Exp $ */
|
||||
|
||||
/*
|
||||
@ -375,6 +375,7 @@ extern const long nbpd[], nkptpmax[];
|
||||
#define pmap_valid_entry(E) ((E) & PG_V) /* is PDE or PTE valid? */
|
||||
|
||||
#define pmap_proc_iflush(p,va,len) /* nothing */
|
||||
#define pmap_init_percpu() do { /* nothing */ } while (0)
|
||||
#define pmap_unuse_final(p) /* nothing */
|
||||
#define pmap_remove_holes(vm) do { /* nothing */ } while (0)
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: pmap.h,v 1.54 2023/04/13 15:23:22 miod Exp $ */
|
||||
/* $OpenBSD: pmap.h,v 1.55 2023/12/11 22:12:53 kettenis Exp $ */
|
||||
/* $NetBSD: pmap.h,v 1.76 2003/09/06 09:10:46 rearnsha Exp $ */
|
||||
|
||||
/*
|
||||
@ -241,6 +241,7 @@ extern struct pmap kernel_pmap_store;
|
||||
|
||||
#define pmap_deactivate(p) do { /* nothing */ } while (0)
|
||||
|
||||
#define pmap_init_percpu() do { /* nothing */ } while (0)
|
||||
#define pmap_unuse_final(p) do { /* nothing */ } while (0)
|
||||
#define pmap_remove_holes(vm) do { /* nothing */ } while (0)
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: pmap.c,v 1.99 2023/08/10 19:29:32 kettenis Exp $ */
|
||||
/* $OpenBSD: pmap.c,v 1.100 2023/12/11 22:12:53 kettenis Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2008-2009,2014-2016 Dale Rahn <drahn@dalerahn.com>
|
||||
*
|
||||
@ -1872,6 +1872,13 @@ pmap_postinit(void)
|
||||
npages * PAGE_SIZE, VM_MAP_INTRSAFE, FALSE, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
pmap_init_percpu(void)
|
||||
{
|
||||
pool_cache_init(&pmap_pted_pool);
|
||||
pool_cache_init(&pmap_vp_pool);
|
||||
}
|
||||
|
||||
void
|
||||
pmap_update(pmap_t pm)
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
# $OpenBSD: GENERIC,v 1.277 2023/07/22 22:43:53 patrick Exp $
|
||||
# $OpenBSD: GENERIC,v 1.278 2023/12/11 11:15:44 claudio Exp $
|
||||
#
|
||||
# GENERIC machine description file
|
||||
#
|
||||
@ -52,6 +52,7 @@ acpiiort* at acpi?
|
||||
smmu* at acpiiort?
|
||||
acpipci* at acpi?
|
||||
pci* at acpipci?
|
||||
ampchwm* at acpi?
|
||||
acpipwrres* at acpi?
|
||||
acpitz* at acpi?
|
||||
ahci* at acpi?
|
||||
|
@ -1,4 +1,4 @@
|
||||
# $OpenBSD: files.arm64,v 1.66 2023/01/14 12:11:11 kettenis Exp $
|
||||
# $OpenBSD: files.arm64,v 1.67 2023/12/11 11:15:44 claudio Exp $
|
||||
|
||||
maxpartitions 16
|
||||
maxusers 2 8 128
|
||||
@ -279,6 +279,10 @@ file arch/arm64/dev/acpipci.c acpipci
|
||||
attach smmu at acpiiort with smmu_acpi
|
||||
file arch/arm64/dev/smmu_acpi.c smmu_acpi
|
||||
|
||||
device ampchwm
|
||||
attach ampchwm at acpi
|
||||
file arch/arm64/dev/ampchwm.c ampchwm
|
||||
|
||||
device apm
|
||||
attach apm at mainbus
|
||||
file arch/arm64/dev/apm.c apm needs-flag
|
||||
|
272
sys/arch/arm64/dev/ampchwm.c
Normal file
272
sys/arch/arm64/dev/ampchwm.c
Normal file
@ -0,0 +1,272 @@
|
||||
/* $OpenBSD: ampchwm.c,v 1.1 2023/12/11 11:15:44 claudio Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2023 Claudio Jeker <claudio@openbsd.org>
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/device.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/sensors.h>
|
||||
|
||||
#include <dev/acpi/acpireg.h>
|
||||
#include <dev/acpi/acpivar.h>
|
||||
#include <dev/acpi/amltypes.h>
|
||||
|
||||
int ampchwm_match(struct device *, void *, void *);
|
||||
void ampchwm_attach(struct device *, struct device *, void *);
|
||||
|
||||
#define HWMON_ID 0x304d5748
|
||||
#define HWMON_UNIT_CELSIUS 0x01
|
||||
#define HWMON_UNIT_JOULES 0x10
|
||||
#define HWMON_UNIT_MILIJOULES 0x11
|
||||
#define HWMON_UNIT_MICROJOULES 0x12
|
||||
#define HWMON_MAX_METRIC_COUNT 2
|
||||
|
||||
union metrics_hdr {
|
||||
uint64_t data;
|
||||
struct {
|
||||
uint32_t id;
|
||||
uint16_t version;
|
||||
uint16_t count;
|
||||
};
|
||||
};
|
||||
|
||||
union metric_hdr {
|
||||
uint64_t data[3];
|
||||
struct {
|
||||
char label[16];
|
||||
uint8_t unit;
|
||||
uint8_t data_size;
|
||||
uint16_t data_count;
|
||||
uint32_t pad;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
struct ampchwm_softc {
|
||||
struct device sc_dev;
|
||||
struct acpi_softc *sc_acpi;
|
||||
struct aml_node *sc_node;
|
||||
|
||||
bus_space_tag_t sc_iot;
|
||||
bus_space_handle_t sc_ioh;
|
||||
size_t sc_size;
|
||||
|
||||
uint16_t sc_count;
|
||||
struct {
|
||||
struct ksensor *sc_sens;
|
||||
uint16_t sc_sens_offset;
|
||||
uint16_t sc_sens_count;
|
||||
uint16_t sc_sens_size;
|
||||
uint16_t sc_sens_unit;
|
||||
} sc_metrics[HWMON_MAX_METRIC_COUNT];
|
||||
|
||||
struct ksensordev sc_sensdev;
|
||||
struct sensor_task *sc_sens_task;
|
||||
};
|
||||
|
||||
const struct cfattach ampchwm_ca = {
|
||||
sizeof(struct ampchwm_softc), ampchwm_match, ampchwm_attach
|
||||
};
|
||||
|
||||
struct cfdriver ampchwm_cd = {
|
||||
NULL, "ampchwm", DV_DULL
|
||||
};
|
||||
|
||||
const char *ampchwm_hids[] = {
|
||||
"AMPC0005",
|
||||
NULL
|
||||
};
|
||||
|
||||
int ampchwm_attach_sensors(struct ampchwm_softc *, int,
|
||||
union metric_hdr *, uint16_t *);
|
||||
void ampchwm_refresh_sensors(void *);
|
||||
void ampchwm_update_sensor(struct ampchwm_softc *, int, int);
|
||||
|
||||
|
||||
int
|
||||
ampchwm_match(struct device *parent, void *match, void *aux)
|
||||
{
|
||||
struct acpi_attach_args *aaa = aux;
|
||||
struct cfdata *cf = match;
|
||||
|
||||
if (aaa->aaa_naddr < 1)
|
||||
return (0);
|
||||
return (acpi_matchhids(aaa, ampchwm_hids, cf->cf_driver->cd_name));
|
||||
}
|
||||
|
||||
void
|
||||
ampchwm_attach(struct device *parent, struct device *self, void *aux)
|
||||
{
|
||||
struct ampchwm_softc *sc = (struct ampchwm_softc *)self;
|
||||
struct acpi_attach_args *aaa = aux;
|
||||
union metrics_hdr hdr;
|
||||
union metric_hdr metric;
|
||||
uint16_t offset = 0;
|
||||
int i;
|
||||
|
||||
sc->sc_acpi = (struct acpi_softc *)parent;
|
||||
sc->sc_node = aaa->aaa_node;
|
||||
|
||||
printf(" %s", sc->sc_node->name);
|
||||
printf(" addr 0x%llx/0x%llx", aaa->aaa_addr[0], aaa->aaa_size[0]);
|
||||
|
||||
sc->sc_iot = aaa->aaa_bst[0];
|
||||
sc->sc_size = aaa->aaa_size[0];
|
||||
|
||||
if (bus_space_map(sc->sc_iot, aaa->aaa_addr[0], aaa->aaa_size[0],
|
||||
0, &sc->sc_ioh)) {
|
||||
printf(": can't map registers\n");
|
||||
return;
|
||||
}
|
||||
|
||||
bus_space_read_region_8(sc->sc_iot, sc->sc_ioh, offset, &hdr.data, 1);
|
||||
|
||||
if (hdr.id != HWMON_ID) {
|
||||
printf(": bad id %x\n", hdr.id);
|
||||
goto unmap;
|
||||
}
|
||||
|
||||
printf(": ver %d", hdr.version);
|
||||
|
||||
strlcpy(sc->sc_sensdev.xname, sc->sc_dev.dv_xname,
|
||||
sizeof(sc->sc_sensdev.xname));
|
||||
|
||||
offset += sizeof(hdr);
|
||||
for (i = 0; i < hdr.count; i++) {
|
||||
bus_space_read_region_8(sc->sc_iot, sc->sc_ioh, offset,
|
||||
metric.data, 3);
|
||||
if (ampchwm_attach_sensors(sc, i, &metric, &offset))
|
||||
goto unmap;
|
||||
}
|
||||
sc->sc_count = MIN(hdr.count, HWMON_MAX_METRIC_COUNT);
|
||||
|
||||
sensordev_install(&sc->sc_sensdev);
|
||||
sc->sc_sens_task = sensor_task_register(sc, ampchwm_refresh_sensors, 1);
|
||||
printf("\n");
|
||||
|
||||
return;
|
||||
unmap:
|
||||
bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_size);
|
||||
return;
|
||||
}
|
||||
|
||||
int
|
||||
ampchwm_attach_sensors(struct ampchwm_softc *sc, int num,
|
||||
union metric_hdr *metric, uint16_t *offsetp)
|
||||
{
|
||||
uint16_t off = *offsetp;
|
||||
int i, count = 0;
|
||||
|
||||
if (num >= HWMON_MAX_METRIC_COUNT) {
|
||||
if (num == HWMON_MAX_METRIC_COUNT)
|
||||
printf(" ignoring extra metrics");
|
||||
return 0;
|
||||
}
|
||||
|
||||
off += sizeof(*metric);
|
||||
/* skip 0 values since those are disabled cores */
|
||||
for (i = 0; i < metric->data_count; i++) {
|
||||
if (bus_space_read_8(sc->sc_iot, sc->sc_ioh,
|
||||
off + i * 8) == 0)
|
||||
continue;
|
||||
count++;
|
||||
}
|
||||
|
||||
sc->sc_metrics[num].sc_sens = mallocarray(count,
|
||||
sizeof(struct ksensor), M_DEVBUF, M_NOWAIT);
|
||||
if (sc->sc_metrics[num].sc_sens == NULL) {
|
||||
printf(" out of memory\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
sc->sc_metrics[num].sc_sens_offset = off;
|
||||
sc->sc_metrics[num].sc_sens_count = count;
|
||||
sc->sc_metrics[num].sc_sens_unit = metric->unit;
|
||||
if (metric->data_size == 0)
|
||||
sc->sc_metrics[num].sc_sens_size = 8;
|
||||
else
|
||||
sc->sc_metrics[num].sc_sens_size = 4;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
struct ksensor *s = &sc->sc_metrics[num].sc_sens[i];
|
||||
|
||||
strlcpy(s->desc, metric->label, sizeof(s->desc));
|
||||
if (metric->unit == HWMON_UNIT_CELSIUS)
|
||||
s->type = SENSOR_TEMP;
|
||||
else
|
||||
s->type = SENSOR_ENERGY;
|
||||
sensor_attach(&sc->sc_sensdev, s);
|
||||
|
||||
ampchwm_update_sensor(sc, num, i);
|
||||
}
|
||||
|
||||
off += metric->data_count * 8;
|
||||
|
||||
printf(", %d \"%s\"", count, metric->label);
|
||||
*offsetp = off;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
ampchwm_refresh_sensors(void *arg)
|
||||
{
|
||||
struct ampchwm_softc *sc = arg;
|
||||
int num, i;
|
||||
|
||||
for (num = 0; num < sc->sc_count; num++)
|
||||
for (i = 0; i < sc->sc_metrics[num].sc_sens_count; i++)
|
||||
ampchwm_update_sensor(sc, num, i);
|
||||
}
|
||||
|
||||
void
|
||||
ampchwm_update_sensor(struct ampchwm_softc *sc, int num, int i)
|
||||
{
|
||||
struct ksensor *s;
|
||||
uint64_t v;
|
||||
|
||||
KASSERT(i < sc->sc_metrics[num].sc_sens_count);
|
||||
|
||||
s = &sc->sc_metrics[num].sc_sens[i];
|
||||
if (sc->sc_metrics[num].sc_sens_size == 8) {
|
||||
v = bus_space_read_8(sc->sc_iot, sc->sc_ioh,
|
||||
sc->sc_metrics[num].sc_sens_offset + i * sizeof(v));
|
||||
} else {
|
||||
v = bus_space_read_4(sc->sc_iot, sc->sc_ioh,
|
||||
sc->sc_metrics[num].sc_sens_offset + i * sizeof(v));
|
||||
}
|
||||
|
||||
if (v == 0) {
|
||||
s->flags = SENSOR_FUNKNOWN;
|
||||
s->status = SENSOR_S_UNKNOWN;
|
||||
} else {
|
||||
s->flags = 0;
|
||||
s->status = SENSOR_S_OK;
|
||||
}
|
||||
|
||||
switch (sc->sc_metrics[num].sc_sens_unit) {
|
||||
case HWMON_UNIT_CELSIUS:
|
||||
s->value = v * 1000 * 1000 + 273150000;
|
||||
break;
|
||||
case HWMON_UNIT_JOULES:
|
||||
v *= 1000;
|
||||
case HWMON_UNIT_MILIJOULES:
|
||||
v *= 1000;
|
||||
case HWMON_UNIT_MICROJOULES:
|
||||
s->value = v;
|
||||
break;
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: pmap.h,v 1.24 2023/06/10 19:30:48 kettenis Exp $ */
|
||||
/* $OpenBSD: pmap.h,v 1.25 2023/12/11 22:12:53 kettenis Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2008,2009,2014 Dale Rahn <drahn@dalerahn.com>
|
||||
*
|
||||
@ -101,6 +101,9 @@ extern struct pmap kernel_pmap_;
|
||||
|
||||
vaddr_t pmap_bootstrap(long kvo, paddr_t lpt1, long kernelstart,
|
||||
long kernelend, long ram_start, long ram_end);
|
||||
void pmap_postinit(void);
|
||||
void pmap_init_percpu(void);
|
||||
|
||||
void pmap_kenter_cache(vaddr_t va, paddr_t pa, vm_prot_t prot, int cacheable);
|
||||
void pmap_page_ro(pmap_t pm, vaddr_t va, vm_prot_t prot);
|
||||
void pmap_page_rw(pmap_t pm, vaddr_t va);
|
||||
@ -118,7 +121,6 @@ struct pv_entry;
|
||||
/* investigate */
|
||||
#define pmap_unuse_final(p) do { /* nothing */ } while (0)
|
||||
int pmap_fault_fixup(pmap_t, vaddr_t, vm_prot_t);
|
||||
void pmap_postinit(void);
|
||||
|
||||
#define __HAVE_PMAP_MPSAFE_ENTER_COW
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: pmap.h,v 1.93 2023/04/13 15:23:22 miod Exp $ */
|
||||
/* $OpenBSD: pmap.h,v 1.94 2023/12/11 22:12:53 kettenis Exp $ */
|
||||
/* $NetBSD: pmap.h,v 1.44 2000/04/24 17:18:18 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
@ -210,6 +210,7 @@ extern struct pool pmap_pv_pool;
|
||||
#define pmap_valid_entry(E) ((E) & PG_V) /* is PDE or PTE valid? */
|
||||
|
||||
#define pmap_proc_iflush(p,va,len) /* nothing */
|
||||
#define pmap_init_percpu() do { /* nothing */ } while (0)
|
||||
#define pmap_unuse_final(p) /* nothing */
|
||||
#define pmap_remove_holes(vm) do { /* nothing */ } while (0)
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: nvmereg.h,v 1.11 2016/11/15 12:01:11 mpi Exp $ */
|
||||
/* $OpenBSD: nvmereg.h,v 1.12 2023/12/11 14:27:09 krw Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2014 David Gwynne <dlg@openbsd.org>
|
||||
@ -204,12 +204,12 @@ struct nvme_cqe {
|
||||
u_int16_t flags;
|
||||
#define NVME_CQE_DNR (1 << 15)
|
||||
#define NVME_CQE_M (1 << 14)
|
||||
#define NVME_CQE_SCT(_f) ((_f) & (0x07 << 8))
|
||||
#define NVME_CQE_SCT_GENERIC (0x00 << 8)
|
||||
#define NVME_CQE_SCT_COMMAND (0x01 << 8)
|
||||
#define NVME_CQE_SCT_MEDIAERR (0x02 << 8)
|
||||
#define NVME_CQE_SCT_VENDOR (0x07 << 8)
|
||||
#define NVME_CQE_SC(_f) ((_f) & (0x7f << 1))
|
||||
#define NVME_CQE_SCT(_f) ((_f) & (0x07 << 9))
|
||||
#define NVME_CQE_SCT_GENERIC (0x00 << 9)
|
||||
#define NVME_CQE_SCT_COMMAND (0x01 << 9)
|
||||
#define NVME_CQE_SCT_MEDIAERR (0x02 << 9)
|
||||
#define NVME_CQE_SCT_VENDOR (0x07 << 9)
|
||||
#define NVME_CQE_SC(_f) ((_f) & (0xff << 1))
|
||||
#define NVME_CQE_SC_SUCCESS (0x00 << 1)
|
||||
#define NVME_CQE_SC_INVALID_OPCODE (0x01 << 1)
|
||||
#define NVME_CQE_SC_INVALID_FIELD (0x02 << 1)
|
||||
|
@ -2205,6 +2205,8 @@ retry_init:
|
||||
pm_runtime_mark_last_busy(ddev->dev);
|
||||
pm_runtime_put_autosuspend(ddev->dev);
|
||||
|
||||
pci_wake_from_d3(pdev, TRUE);
|
||||
|
||||
/*
|
||||
* For runpm implemented via BACO, PMFW will handle the
|
||||
* timing for BACO in and out:
|
||||
|
@ -82,6 +82,10 @@ MODULE_FIRMWARE("amdgpu/gc_11_0_4_me.bin");
|
||||
MODULE_FIRMWARE("amdgpu/gc_11_0_4_mec.bin");
|
||||
MODULE_FIRMWARE("amdgpu/gc_11_0_4_rlc.bin");
|
||||
|
||||
static const struct soc15_reg_golden golden_settings_gc_11_0[] = {
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CNTL, 0x20000000, 0x20000000)
|
||||
};
|
||||
|
||||
static const struct soc15_reg_golden golden_settings_gc_11_0_1[] =
|
||||
{
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, regCGTT_GS_NGG_CLK_CTRL, 0x9fff8fff, 0x00000010),
|
||||
@ -274,6 +278,10 @@ static void gfx_v11_0_init_golden_registers(struct amdgpu_device *adev)
|
||||
default:
|
||||
break;
|
||||
}
|
||||
soc15_program_register_sequence(adev,
|
||||
golden_settings_gc_11_0,
|
||||
(const u32)ARRAY_SIZE(golden_settings_gc_11_0));
|
||||
|
||||
}
|
||||
|
||||
static void gfx_v11_0_write_data_to_reg(struct amdgpu_ring *ring, int eng_sel,
|
||||
|
@ -6151,7 +6151,7 @@ int amdgpu_dm_connector_atomic_set_property(struct drm_connector *connector,
|
||||
dm_new_state->underscan_enable = val;
|
||||
ret = 0;
|
||||
} else if (property == adev->mode_info.abm_level_property) {
|
||||
dm_new_state->abm_level = val;
|
||||
dm_new_state->abm_level = val ?: ABM_LEVEL_IMMEDIATE_DISABLE;
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
@ -6196,7 +6196,8 @@ int amdgpu_dm_connector_atomic_get_property(struct drm_connector *connector,
|
||||
*val = dm_state->underscan_enable;
|
||||
ret = 0;
|
||||
} else if (property == adev->mode_info.abm_level_property) {
|
||||
*val = dm_state->abm_level;
|
||||
*val = (dm_state->abm_level != ABM_LEVEL_IMMEDIATE_DISABLE) ?
|
||||
dm_state->abm_level : 0;
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
@ -6276,7 +6277,8 @@ void amdgpu_dm_connector_funcs_reset(struct drm_connector *connector)
|
||||
state->pbn = 0;
|
||||
|
||||
if (connector->connector_type == DRM_MODE_CONNECTOR_eDP)
|
||||
state->abm_level = amdgpu_dm_abm_level;
|
||||
state->abm_level = amdgpu_dm_abm_level ?:
|
||||
ABM_LEVEL_IMMEDIATE_DISABLE;
|
||||
|
||||
__drm_atomic_helper_connector_reset(connector, &state->base);
|
||||
}
|
||||
|
@ -499,9 +499,12 @@ enum dcn_zstate_support_state {
|
||||
DCN_ZSTATE_SUPPORT_ALLOW_Z10_ONLY,
|
||||
DCN_ZSTATE_SUPPORT_DISALLOW,
|
||||
};
|
||||
/*
|
||||
* For any clocks that may differ per pipe
|
||||
* only the max is stored in this structure
|
||||
|
||||
/**
|
||||
* dc_clocks - DC pipe clocks
|
||||
*
|
||||
* For any clocks that may differ per pipe only the max is stored in this
|
||||
* structure
|
||||
*/
|
||||
struct dc_clocks {
|
||||
int dispclk_khz;
|
||||
@ -528,6 +531,16 @@ struct dc_clocks {
|
||||
bool prev_p_state_change_support;
|
||||
bool fclk_prev_p_state_change_support;
|
||||
int num_ways;
|
||||
|
||||
/**
|
||||
* @fw_based_mclk_switching
|
||||
*
|
||||
* DC has a mechanism that leverage the variable refresh rate to switch
|
||||
* memory clock in cases that we have a large latency to achieve the
|
||||
* memory clock change and a short vblank window. DC has some
|
||||
* requirements to enable this feature, and this field describes if the
|
||||
* system support or not such a feature.
|
||||
*/
|
||||
bool fw_based_mclk_switching;
|
||||
bool fw_based_mclk_switching_shut_down;
|
||||
int prev_num_ways;
|
||||
|
@ -202,7 +202,18 @@ struct dc_stream_state {
|
||||
bool use_vsc_sdp_for_colorimetry;
|
||||
bool ignore_msa_timing_param;
|
||||
|
||||
/**
|
||||
* @allow_freesync:
|
||||
*
|
||||
* It say if Freesync is enabled or not.
|
||||
*/
|
||||
bool allow_freesync;
|
||||
|
||||
/**
|
||||
* @vrr_active_variable:
|
||||
*
|
||||
* It describes if VRR is in use.
|
||||
*/
|
||||
bool vrr_active_variable;
|
||||
bool freesync_on_desktop;
|
||||
|
||||
|
@ -308,7 +308,10 @@ bool cm_helper_convert_to_custom_float(
|
||||
#define NUMBER_REGIONS 32
|
||||
#define NUMBER_SW_SEGMENTS 16
|
||||
|
||||
bool cm_helper_translate_curve_to_hw_format(
|
||||
#define DC_LOGGER \
|
||||
ctx->logger
|
||||
|
||||
bool cm_helper_translate_curve_to_hw_format(struct dc_context *ctx,
|
||||
const struct dc_transfer_func *output_tf,
|
||||
struct pwl_params *lut_params, bool fixpoint)
|
||||
{
|
||||
@ -482,10 +485,18 @@ bool cm_helper_translate_curve_to_hw_format(
|
||||
rgb->delta_green = dc_fixpt_sub(rgb_plus_1->green, rgb->green);
|
||||
rgb->delta_blue = dc_fixpt_sub(rgb_plus_1->blue, rgb->blue);
|
||||
|
||||
|
||||
if (fixpoint == true) {
|
||||
rgb->delta_red_reg = dc_fixpt_clamp_u0d10(rgb->delta_red);
|
||||
rgb->delta_green_reg = dc_fixpt_clamp_u0d10(rgb->delta_green);
|
||||
rgb->delta_blue_reg = dc_fixpt_clamp_u0d10(rgb->delta_blue);
|
||||
uint32_t red_clamp = dc_fixpt_clamp_u0d14(rgb->delta_red);
|
||||
uint32_t green_clamp = dc_fixpt_clamp_u0d14(rgb->delta_green);
|
||||
uint32_t blue_clamp = dc_fixpt_clamp_u0d14(rgb->delta_blue);
|
||||
|
||||
if (red_clamp >> 10 || green_clamp >> 10 || blue_clamp >> 10)
|
||||
DC_LOG_WARNING("Losing delta precision while programming shaper LUT.");
|
||||
|
||||
rgb->delta_red_reg = red_clamp & 0x3ff;
|
||||
rgb->delta_green_reg = green_clamp & 0x3ff;
|
||||
rgb->delta_blue_reg = blue_clamp & 0x3ff;
|
||||
rgb->red_reg = dc_fixpt_clamp_u0d14(rgb->red);
|
||||
rgb->green_reg = dc_fixpt_clamp_u0d14(rgb->green);
|
||||
rgb->blue_reg = dc_fixpt_clamp_u0d14(rgb->blue);
|
||||
|
@ -106,6 +106,7 @@ bool cm_helper_convert_to_custom_float(
|
||||
bool fixpoint);
|
||||
|
||||
bool cm_helper_translate_curve_to_hw_format(
|
||||
struct dc_context *ctx,
|
||||
const struct dc_transfer_func *output_tf,
|
||||
struct pwl_params *lut_params, bool fixpoint);
|
||||
|
||||
|
@ -1867,7 +1867,7 @@ bool dcn10_set_output_transfer_func(struct dc *dc, struct pipe_ctx *pipe_ctx,
|
||||
/* dcn10_translate_regamma_to_hw_format takes 750us, only do it when full
|
||||
* update.
|
||||
*/
|
||||
else if (cm_helper_translate_curve_to_hw_format(
|
||||
else if (cm_helper_translate_curve_to_hw_format(dc->ctx,
|
||||
stream->out_transfer_func,
|
||||
&dpp->regamma_params, false)) {
|
||||
dpp->funcs->dpp_program_regamma_pwl(
|
||||
|
@ -843,7 +843,7 @@ bool dcn20_set_output_transfer_func(struct dc *dc, struct pipe_ctx *pipe_ctx,
|
||||
params = &stream->out_transfer_func->pwl;
|
||||
else if (pipe_ctx->stream->out_transfer_func->type ==
|
||||
TF_TYPE_DISTRIBUTED_POINTS &&
|
||||
cm_helper_translate_curve_to_hw_format(
|
||||
cm_helper_translate_curve_to_hw_format(dc->ctx,
|
||||
stream->out_transfer_func,
|
||||
&mpc->blender_params, false))
|
||||
params = &mpc->blender_params;
|
||||
@ -872,7 +872,7 @@ bool dcn20_set_blend_lut(
|
||||
if (plane_state->blend_tf->type == TF_TYPE_HWPWL)
|
||||
blend_lut = &plane_state->blend_tf->pwl;
|
||||
else if (plane_state->blend_tf->type == TF_TYPE_DISTRIBUTED_POINTS) {
|
||||
cm_helper_translate_curve_to_hw_format(
|
||||
cm_helper_translate_curve_to_hw_format(plane_state->ctx,
|
||||
plane_state->blend_tf,
|
||||
&dpp_base->regamma_params, false);
|
||||
blend_lut = &dpp_base->regamma_params;
|
||||
@ -894,7 +894,7 @@ bool dcn20_set_shaper_3dlut(
|
||||
if (plane_state->in_shaper_func->type == TF_TYPE_HWPWL)
|
||||
shaper_lut = &plane_state->in_shaper_func->pwl;
|
||||
else if (plane_state->in_shaper_func->type == TF_TYPE_DISTRIBUTED_POINTS) {
|
||||
cm_helper_translate_curve_to_hw_format(
|
||||
cm_helper_translate_curve_to_hw_format(plane_state->ctx,
|
||||
plane_state->in_shaper_func,
|
||||
&dpp_base->shaper_params, true);
|
||||
shaper_lut = &dpp_base->shaper_params;
|
||||
|
@ -280,7 +280,7 @@ bool dwb3_ogam_set_input_transfer_func(
|
||||
dwb_ogam_lut = kzalloc(sizeof(*dwb_ogam_lut), GFP_KERNEL);
|
||||
|
||||
if (dwb_ogam_lut) {
|
||||
cm_helper_translate_curve_to_hw_format(
|
||||
cm_helper_translate_curve_to_hw_format(dwbc->ctx,
|
||||
in_transfer_func_dwb_ogam,
|
||||
dwb_ogam_lut, false);
|
||||
|
||||
|
@ -91,8 +91,8 @@ bool dcn30_set_blend_lut(
|
||||
return result;
|
||||
}
|
||||
|
||||
static bool dcn30_set_mpc_shaper_3dlut(
|
||||
struct pipe_ctx *pipe_ctx, const struct dc_stream_state *stream)
|
||||
static bool dcn30_set_mpc_shaper_3dlut(struct pipe_ctx *pipe_ctx,
|
||||
const struct dc_stream_state *stream)
|
||||
{
|
||||
struct dpp *dpp_base = pipe_ctx->plane_res.dpp;
|
||||
int mpcc_id = pipe_ctx->plane_res.hubp->inst;
|
||||
@ -104,19 +104,18 @@ static bool dcn30_set_mpc_shaper_3dlut(
|
||||
const struct pwl_params *shaper_lut = NULL;
|
||||
//get the shaper lut params
|
||||
if (stream->func_shaper) {
|
||||
if (stream->func_shaper->type == TF_TYPE_HWPWL)
|
||||
if (stream->func_shaper->type == TF_TYPE_HWPWL) {
|
||||
shaper_lut = &stream->func_shaper->pwl;
|
||||
else if (stream->func_shaper->type == TF_TYPE_DISTRIBUTED_POINTS) {
|
||||
cm_helper_translate_curve_to_hw_format(
|
||||
stream->func_shaper,
|
||||
&dpp_base->shaper_params, true);
|
||||
} else if (stream->func_shaper->type == TF_TYPE_DISTRIBUTED_POINTS) {
|
||||
cm_helper_translate_curve_to_hw_format(stream->ctx, stream->func_shaper,
|
||||
&dpp_base->shaper_params, true);
|
||||
shaper_lut = &dpp_base->shaper_params;
|
||||
}
|
||||
}
|
||||
|
||||
if (stream->lut3d_func &&
|
||||
stream->lut3d_func->state.bits.initialized == 1 &&
|
||||
stream->lut3d_func->state.bits.rmu_idx_valid == 1) {
|
||||
stream->lut3d_func->state.bits.initialized == 1 &&
|
||||
stream->lut3d_func->state.bits.rmu_idx_valid == 1) {
|
||||
if (stream->lut3d_func->state.bits.rmu_mux_num == 0)
|
||||
mpcc_id_projected = stream->lut3d_func->state.bits.mpc_rmu0_mux;
|
||||
else if (stream->lut3d_func->state.bits.rmu_mux_num == 1)
|
||||
@ -125,20 +124,22 @@ static bool dcn30_set_mpc_shaper_3dlut(
|
||||
mpcc_id_projected = stream->lut3d_func->state.bits.mpc_rmu2_mux;
|
||||
if (mpcc_id_projected != mpcc_id)
|
||||
BREAK_TO_DEBUGGER();
|
||||
/*find the reason why logical layer assigned a differant mpcc_id into acquire_post_bldn_3dlut*/
|
||||
/* find the reason why logical layer assigned a different
|
||||
* mpcc_id into acquire_post_bldn_3dlut
|
||||
*/
|
||||
acquired_rmu = mpc->funcs->acquire_rmu(mpc, mpcc_id,
|
||||
stream->lut3d_func->state.bits.rmu_mux_num);
|
||||
stream->lut3d_func->state.bits.rmu_mux_num);
|
||||
if (acquired_rmu != stream->lut3d_func->state.bits.rmu_mux_num)
|
||||
BREAK_TO_DEBUGGER();
|
||||
result = mpc->funcs->program_3dlut(mpc,
|
||||
&stream->lut3d_func->lut_3d,
|
||||
stream->lut3d_func->state.bits.rmu_mux_num);
|
||||
result = mpc->funcs->program_shaper(mpc, shaper_lut,
|
||||
stream->lut3d_func->state.bits.rmu_mux_num);
|
||||
} else
|
||||
/*loop through the available mux and release the requested mpcc_id*/
|
||||
mpc->funcs->release_rmu(mpc, mpcc_id);
|
||||
|
||||
result = mpc->funcs->program_3dlut(mpc, &stream->lut3d_func->lut_3d,
|
||||
stream->lut3d_func->state.bits.rmu_mux_num);
|
||||
result = mpc->funcs->program_shaper(mpc, shaper_lut,
|
||||
stream->lut3d_func->state.bits.rmu_mux_num);
|
||||
} else {
|
||||
// loop through the available mux and release the requested mpcc_id
|
||||
mpc->funcs->release_rmu(mpc, mpcc_id);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
@ -884,7 +884,7 @@ static const struct dc_plane_cap plane_cap = {
|
||||
static const struct dc_debug_options debug_defaults_drv = {
|
||||
.disable_z10 = false,
|
||||
.enable_z9_disable_interface = true,
|
||||
.minimum_z8_residency_time = 2000,
|
||||
.minimum_z8_residency_time = 2100,
|
||||
.psr_skip_crtc_disable = true,
|
||||
.disable_dmcu = true,
|
||||
.force_abm_enable = false,
|
||||
|
@ -530,7 +530,7 @@ static bool dcn32_set_mpc_shaper_3dlut(
|
||||
if (stream->func_shaper->type == TF_TYPE_HWPWL)
|
||||
shaper_lut = &stream->func_shaper->pwl;
|
||||
else if (stream->func_shaper->type == TF_TYPE_DISTRIBUTED_POINTS) {
|
||||
cm_helper_translate_curve_to_hw_format(
|
||||
cm_helper_translate_curve_to_hw_format(stream->ctx,
|
||||
stream->func_shaper,
|
||||
&dpp_base->shaper_params, true);
|
||||
shaper_lut = &dpp_base->shaper_params;
|
||||
@ -566,8 +566,7 @@ bool dcn32_set_mcm_luts(
|
||||
if (plane_state->blend_tf->type == TF_TYPE_HWPWL)
|
||||
lut_params = &plane_state->blend_tf->pwl;
|
||||
else if (plane_state->blend_tf->type == TF_TYPE_DISTRIBUTED_POINTS) {
|
||||
cm_helper_translate_curve_to_hw_format(
|
||||
plane_state->blend_tf,
|
||||
cm3_helper_translate_curve_to_hw_format(plane_state->blend_tf,
|
||||
&dpp_base->regamma_params, false);
|
||||
lut_params = &dpp_base->regamma_params;
|
||||
}
|
||||
@ -581,8 +580,7 @@ bool dcn32_set_mcm_luts(
|
||||
else if (plane_state->in_shaper_func->type == TF_TYPE_DISTRIBUTED_POINTS) {
|
||||
// TODO: dpp_base replace
|
||||
ASSERT(false);
|
||||
cm_helper_translate_curve_to_hw_format(
|
||||
plane_state->in_shaper_func,
|
||||
cm3_helper_translate_curve_to_hw_format(plane_state->in_shaper_func,
|
||||
&dpp_base->shaper_params, true);
|
||||
lut_params = &dpp_base->shaper_params;
|
||||
}
|
||||
|
@ -29,6 +29,13 @@
|
||||
#define DC__PRESENT 1
|
||||
#define DC__PRESENT__1 1
|
||||
#define DC__NUM_DPP 4
|
||||
|
||||
/**
|
||||
* @DC__VOLTAGE_STATES:
|
||||
*
|
||||
* Define the maximum amount of states supported by the ASIC. Every ASIC has a
|
||||
* specific number of states; this macro defines the maximum number of states.
|
||||
*/
|
||||
#define DC__VOLTAGE_STATES 20
|
||||
#define DC__NUM_DPP__4 1
|
||||
#define DC__NUM_DPP__0_PRESENT 1
|
||||
|
@ -948,10 +948,8 @@ static enum dcn_zstate_support_state decide_zstate_support(struct dc *dc, struc
|
||||
{
|
||||
int plane_count;
|
||||
int i;
|
||||
unsigned int min_dst_y_next_start_us;
|
||||
|
||||
plane_count = 0;
|
||||
min_dst_y_next_start_us = 0;
|
||||
for (i = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
if (context->res_ctx.pipe_ctx[i].plane_state)
|
||||
plane_count++;
|
||||
@ -973,26 +971,15 @@ static enum dcn_zstate_support_state decide_zstate_support(struct dc *dc, struc
|
||||
else if (context->stream_count == 1 && context->streams[0]->signal == SIGNAL_TYPE_EDP) {
|
||||
struct dc_link *link = context->streams[0]->sink->link;
|
||||
struct dc_stream_status *stream_status = &context->stream_status[0];
|
||||
struct dc_stream_state *current_stream = context->streams[0];
|
||||
int minmum_z8_residency = dc->debug.minimum_z8_residency_time > 0 ? dc->debug.minimum_z8_residency_time : 1000;
|
||||
bool allow_z8 = context->bw_ctx.dml.vba.StutterPeriod > (double)minmum_z8_residency;
|
||||
bool is_pwrseq0 = link->link_index == 0;
|
||||
bool isFreesyncVideo;
|
||||
|
||||
isFreesyncVideo = current_stream->adjust.v_total_min == current_stream->adjust.v_total_max;
|
||||
isFreesyncVideo = isFreesyncVideo && current_stream->timing.v_total < current_stream->adjust.v_total_min;
|
||||
for (i = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
if (context->res_ctx.pipe_ctx[i].stream == current_stream && isFreesyncVideo) {
|
||||
min_dst_y_next_start_us = context->res_ctx.pipe_ctx[i].dlg_regs.min_dst_y_next_start_us;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Don't support multi-plane configurations */
|
||||
if (stream_status->plane_count > 1)
|
||||
return DCN_ZSTATE_SUPPORT_DISALLOW;
|
||||
|
||||
if (is_pwrseq0 && (context->bw_ctx.dml.vba.StutterPeriod > 5000.0 || min_dst_y_next_start_us > 5000))
|
||||
if (is_pwrseq0 && context->bw_ctx.dml.vba.StutterPeriod > 5000.0)
|
||||
return DCN_ZSTATE_SUPPORT_ALLOW;
|
||||
else if (is_pwrseq0 && link->psr_settings.psr_version == DC_PSR_VERSION_1 && !link->panel_config.psr.disable_psr)
|
||||
return allow_z8 ? DCN_ZSTATE_SUPPORT_ALLOW_Z8_Z10_ONLY : DCN_ZSTATE_SUPPORT_ALLOW_Z10_ONLY;
|
||||
|
@ -1788,6 +1788,7 @@ void dcn32_calculate_wm_and_dlg_fpu(struct dc *dc, struct dc_state *context,
|
||||
int i, pipe_idx, vlevel_temp = 0;
|
||||
double dcfclk = dcn3_2_soc.clock_limits[0].dcfclk_mhz;
|
||||
double dcfclk_from_validation = context->bw_ctx.dml.vba.DCFCLKState[vlevel][context->bw_ctx.dml.vba.maxMpcComb];
|
||||
double dram_speed_from_validation = context->bw_ctx.dml.vba.DRAMSpeed;
|
||||
double dcfclk_from_fw_based_mclk_switching = dcfclk_from_validation;
|
||||
bool pstate_en = context->bw_ctx.dml.vba.DRAMClockChangeSupport[vlevel][context->bw_ctx.dml.vba.maxMpcComb] !=
|
||||
dm_dram_clock_change_unsupported;
|
||||
@ -1921,7 +1922,7 @@ void dcn32_calculate_wm_and_dlg_fpu(struct dc *dc, struct dc_state *context,
|
||||
}
|
||||
|
||||
if (dc->clk_mgr->bw_params->wm_table.nv_entries[WM_C].valid) {
|
||||
min_dram_speed_mts = context->bw_ctx.dml.vba.DRAMSpeed;
|
||||
min_dram_speed_mts = dram_speed_from_validation;
|
||||
min_dram_speed_mts_margin = 160;
|
||||
|
||||
context->bw_ctx.dml.soc.dram_clock_change_latency_us =
|
||||
|
@ -105,14 +105,39 @@ enum source_macro_tile_size {
|
||||
enum cursor_bpp {
|
||||
dm_cur_2bit = 0, dm_cur_32bit = 1, dm_cur_64bit = 2
|
||||
};
|
||||
|
||||
/**
|
||||
* @enum clock_change_support - It represents possible reasons to change the DRAM clock.
|
||||
*
|
||||
* DC may change the DRAM clock during its execution, and this enum tracks all
|
||||
* the available methods. Note that every ASIC has their specific way to deal
|
||||
* with these clock switch.
|
||||
*/
|
||||
enum clock_change_support {
|
||||
/**
|
||||
* @dm_dram_clock_change_uninitialized: If you see this, we might have
|
||||
* a code initialization issue
|
||||
*/
|
||||
dm_dram_clock_change_uninitialized = 0,
|
||||
|
||||
/**
|
||||
* @dm_dram_clock_change_vactive: Support DRAM switch in VActive
|
||||
*/
|
||||
dm_dram_clock_change_vactive,
|
||||
|
||||
/**
|
||||
* @dm_dram_clock_change_vblank: Support DRAM switch in VBlank
|
||||
*/
|
||||
dm_dram_clock_change_vblank,
|
||||
|
||||
dm_dram_clock_change_vactive_w_mall_full_frame,
|
||||
dm_dram_clock_change_vactive_w_mall_sub_vp,
|
||||
dm_dram_clock_change_vblank_w_mall_full_frame,
|
||||
dm_dram_clock_change_vblank_w_mall_sub_vp,
|
||||
|
||||
/**
|
||||
* @dm_dram_clock_change_unsupported: Do not support DRAM switch
|
||||
*/
|
||||
dm_dram_clock_change_unsupported
|
||||
};
|
||||
|
||||
|
@ -419,6 +419,15 @@ struct vba_vars_st {
|
||||
double MinPixelChunkSizeBytes;
|
||||
unsigned int DCCMetaBufferSizeBytes;
|
||||
// Pipe/Plane Parameters
|
||||
|
||||
/** @VoltageLevel:
|
||||
* Every ASIC has a fixed number of DPM states, and some devices might
|
||||
* have some particular voltage configuration that does not map
|
||||
* directly to the DPM states. This field tells how many states the
|
||||
* target device supports; even though this field combines the DPM and
|
||||
* special SOC voltages, it mostly matches the total number of DPM
|
||||
* states.
|
||||
*/
|
||||
int VoltageLevel;
|
||||
double FabricClock;
|
||||
double DRAMSpeed;
|
||||
|
@ -115,6 +115,13 @@ struct resource_funcs {
|
||||
int vlevel);
|
||||
void (*update_soc_for_wm_a)(
|
||||
struct dc *dc, struct dc_state *context);
|
||||
|
||||
/**
|
||||
* @populate_dml_pipes - Populate pipe data struct
|
||||
*
|
||||
* Returns:
|
||||
* Total of pipes available in the specific ASIC.
|
||||
*/
|
||||
int (*populate_dml_pipes)(
|
||||
struct dc *dc,
|
||||
struct dc_state *context,
|
||||
|
@ -35,6 +35,13 @@
|
||||
******************************************************************************/
|
||||
|
||||
#define MAX_AUDIOS 7
|
||||
|
||||
/**
|
||||
* @MAX_PIPES:
|
||||
*
|
||||
* Every ASIC support a fixed number of pipes; MAX_PIPES defines a large number
|
||||
* to be used inside loops and for determining array sizes.
|
||||
*/
|
||||
#define MAX_PIPES 6
|
||||
#define MAX_DIG_LINK_ENCODERS 7
|
||||
#define MAX_DWB_PIPES 1
|
||||
|
@ -332,6 +332,8 @@ struct dmub_srv_hw_funcs {
|
||||
void (*setup_mailbox)(struct dmub_srv *dmub,
|
||||
const struct dmub_region *inbox1);
|
||||
|
||||
uint32_t (*get_inbox1_wptr)(struct dmub_srv *dmub);
|
||||
|
||||
uint32_t (*get_inbox1_rptr)(struct dmub_srv *dmub);
|
||||
|
||||
void (*set_inbox1_wptr)(struct dmub_srv *dmub, uint32_t wptr_offset);
|
||||
@ -590,6 +592,18 @@ enum dmub_status dmub_srv_hw_init(struct dmub_srv *dmub,
|
||||
*/
|
||||
enum dmub_status dmub_srv_hw_reset(struct dmub_srv *dmub);
|
||||
|
||||
/**
|
||||
* dmub_srv_sync_inbox1() - sync sw state with hw state
|
||||
* @dmub: the dmub service
|
||||
*
|
||||
* Sync sw state with hw state when resume from S0i3
|
||||
*
|
||||
* Return:
|
||||
* DMUB_STATUS_OK - success
|
||||
* DMUB_STATUS_INVALID - unspecified error
|
||||
*/
|
||||
enum dmub_status dmub_srv_sync_inbox1(struct dmub_srv *dmub);
|
||||
|
||||
/**
|
||||
* dmub_srv_cmd_queue() - queues a command to the DMUB
|
||||
* @dmub: the dmub service
|
||||
|
@ -282,6 +282,11 @@ void dmub_dcn20_setup_mailbox(struct dmub_srv *dmub,
|
||||
REG_WRITE(DMCUB_INBOX1_SIZE, inbox1->top - inbox1->base);
|
||||
}
|
||||
|
||||
uint32_t dmub_dcn20_get_inbox1_wptr(struct dmub_srv *dmub)
|
||||
{
|
||||
return REG_READ(DMCUB_INBOX1_WPTR);
|
||||
}
|
||||
|
||||
uint32_t dmub_dcn20_get_inbox1_rptr(struct dmub_srv *dmub)
|
||||
{
|
||||
return REG_READ(DMCUB_INBOX1_RPTR);
|
||||
|
@ -202,6 +202,8 @@ void dmub_dcn20_setup_windows(struct dmub_srv *dmub,
|
||||
void dmub_dcn20_setup_mailbox(struct dmub_srv *dmub,
|
||||
const struct dmub_region *inbox1);
|
||||
|
||||
uint32_t dmub_dcn20_get_inbox1_wptr(struct dmub_srv *dmub);
|
||||
|
||||
uint32_t dmub_dcn20_get_inbox1_rptr(struct dmub_srv *dmub);
|
||||
|
||||
void dmub_dcn20_set_inbox1_wptr(struct dmub_srv *dmub, uint32_t wptr_offset);
|
||||
|
@ -242,6 +242,11 @@ void dmub_dcn31_setup_mailbox(struct dmub_srv *dmub,
|
||||
REG_WRITE(DMCUB_INBOX1_SIZE, inbox1->top - inbox1->base);
|
||||
}
|
||||
|
||||
uint32_t dmub_dcn31_get_inbox1_wptr(struct dmub_srv *dmub)
|
||||
{
|
||||
return REG_READ(DMCUB_INBOX1_WPTR);
|
||||
}
|
||||
|
||||
uint32_t dmub_dcn31_get_inbox1_rptr(struct dmub_srv *dmub)
|
||||
{
|
||||
return REG_READ(DMCUB_INBOX1_RPTR);
|
||||
|
@ -204,6 +204,8 @@ void dmub_dcn31_setup_windows(struct dmub_srv *dmub,
|
||||
void dmub_dcn31_setup_mailbox(struct dmub_srv *dmub,
|
||||
const struct dmub_region *inbox1);
|
||||
|
||||
uint32_t dmub_dcn31_get_inbox1_wptr(struct dmub_srv *dmub);
|
||||
|
||||
uint32_t dmub_dcn31_get_inbox1_rptr(struct dmub_srv *dmub);
|
||||
|
||||
void dmub_dcn31_set_inbox1_wptr(struct dmub_srv *dmub, uint32_t wptr_offset);
|
||||
|
@ -266,6 +266,11 @@ void dmub_dcn32_setup_mailbox(struct dmub_srv *dmub,
|
||||
REG_WRITE(DMCUB_INBOX1_SIZE, inbox1->top - inbox1->base);
|
||||
}
|
||||
|
||||
uint32_t dmub_dcn32_get_inbox1_wptr(struct dmub_srv *dmub)
|
||||
{
|
||||
return REG_READ(DMCUB_INBOX1_WPTR);
|
||||
}
|
||||
|
||||
uint32_t dmub_dcn32_get_inbox1_rptr(struct dmub_srv *dmub)
|
||||
{
|
||||
return REG_READ(DMCUB_INBOX1_RPTR);
|
||||
|
@ -206,6 +206,8 @@ void dmub_dcn32_setup_windows(struct dmub_srv *dmub,
|
||||
void dmub_dcn32_setup_mailbox(struct dmub_srv *dmub,
|
||||
const struct dmub_region *inbox1);
|
||||
|
||||
uint32_t dmub_dcn32_get_inbox1_wptr(struct dmub_srv *dmub);
|
||||
|
||||
uint32_t dmub_dcn32_get_inbox1_rptr(struct dmub_srv *dmub);
|
||||
|
||||
void dmub_dcn32_set_inbox1_wptr(struct dmub_srv *dmub, uint32_t wptr_offset);
|
||||
|
@ -167,6 +167,7 @@ static bool dmub_srv_hw_setup(struct dmub_srv *dmub, enum dmub_asic asic)
|
||||
funcs->backdoor_load = dmub_dcn20_backdoor_load;
|
||||
funcs->setup_windows = dmub_dcn20_setup_windows;
|
||||
funcs->setup_mailbox = dmub_dcn20_setup_mailbox;
|
||||
funcs->get_inbox1_wptr = dmub_dcn20_get_inbox1_wptr;
|
||||
funcs->get_inbox1_rptr = dmub_dcn20_get_inbox1_rptr;
|
||||
funcs->set_inbox1_wptr = dmub_dcn20_set_inbox1_wptr;
|
||||
funcs->is_supported = dmub_dcn20_is_supported;
|
||||
@ -243,6 +244,7 @@ static bool dmub_srv_hw_setup(struct dmub_srv *dmub, enum dmub_asic asic)
|
||||
funcs->backdoor_load = dmub_dcn31_backdoor_load;
|
||||
funcs->setup_windows = dmub_dcn31_setup_windows;
|
||||
funcs->setup_mailbox = dmub_dcn31_setup_mailbox;
|
||||
funcs->get_inbox1_wptr = dmub_dcn31_get_inbox1_wptr;
|
||||
funcs->get_inbox1_rptr = dmub_dcn31_get_inbox1_rptr;
|
||||
funcs->set_inbox1_wptr = dmub_dcn31_set_inbox1_wptr;
|
||||
funcs->setup_out_mailbox = dmub_dcn31_setup_out_mailbox;
|
||||
@ -281,6 +283,7 @@ static bool dmub_srv_hw_setup(struct dmub_srv *dmub, enum dmub_asic asic)
|
||||
funcs->backdoor_load_zfb_mode = dmub_dcn32_backdoor_load_zfb_mode;
|
||||
funcs->setup_windows = dmub_dcn32_setup_windows;
|
||||
funcs->setup_mailbox = dmub_dcn32_setup_mailbox;
|
||||
funcs->get_inbox1_wptr = dmub_dcn32_get_inbox1_wptr;
|
||||
funcs->get_inbox1_rptr = dmub_dcn32_get_inbox1_rptr;
|
||||
funcs->set_inbox1_wptr = dmub_dcn32_set_inbox1_wptr;
|
||||
funcs->setup_out_mailbox = dmub_dcn32_setup_out_mailbox;
|
||||
@ -666,6 +669,27 @@ enum dmub_status dmub_srv_hw_init(struct dmub_srv *dmub,
|
||||
return DMUB_STATUS_OK;
|
||||
}
|
||||
|
||||
enum dmub_status dmub_srv_sync_inbox1(struct dmub_srv *dmub)
|
||||
{
|
||||
if (!dmub->sw_init)
|
||||
return DMUB_STATUS_INVALID;
|
||||
|
||||
if (dmub->hw_funcs.get_inbox1_rptr && dmub->hw_funcs.get_inbox1_wptr) {
|
||||
uint32_t rptr = dmub->hw_funcs.get_inbox1_rptr(dmub);
|
||||
uint32_t wptr = dmub->hw_funcs.get_inbox1_wptr(dmub);
|
||||
|
||||
if (rptr > dmub->inbox1_rb.capacity || wptr > dmub->inbox1_rb.capacity) {
|
||||
return DMUB_STATUS_HW_FAILURE;
|
||||
} else {
|
||||
dmub->inbox1_rb.rptr = rptr;
|
||||
dmub->inbox1_rb.wrpt = wptr;
|
||||
dmub->inbox1_last_wptr = dmub->inbox1_rb.wrpt;
|
||||
}
|
||||
}
|
||||
|
||||
return DMUB_STATUS_OK;
|
||||
}
|
||||
|
||||
enum dmub_status dmub_srv_hw_reset(struct dmub_srv *dmub)
|
||||
{
|
||||
if (!dmub->sw_init)
|
||||
@ -694,6 +718,11 @@ enum dmub_status dmub_srv_cmd_queue(struct dmub_srv *dmub,
|
||||
if (!dmub->hw_init)
|
||||
return DMUB_STATUS_INVALID;
|
||||
|
||||
if (dmub->inbox1_rb.rptr > dmub->inbox1_rb.capacity ||
|
||||
dmub->inbox1_rb.wrpt > dmub->inbox1_rb.capacity) {
|
||||
return DMUB_STATUS_HW_FAILURE;
|
||||
}
|
||||
|
||||
if (dmub_rb_push_front(&dmub->inbox1_rb, cmd))
|
||||
return DMUB_STATUS_OK;
|
||||
|
||||
@ -964,6 +993,7 @@ enum dmub_status dmub_srv_wait_for_inbox0_ack(struct dmub_srv *dmub, uint32_t ti
|
||||
ack = dmub->hw_funcs.read_inbox0_ack_register(dmub);
|
||||
if (ack)
|
||||
return DMUB_STATUS_OK;
|
||||
udelay(1);
|
||||
}
|
||||
return DMUB_STATUS_TIMEOUT;
|
||||
}
|
||||
|
@ -6369,6 +6369,8 @@
|
||||
#define regTCP_INVALIDATE_BASE_IDX 1
|
||||
#define regTCP_STATUS 0x19a1
|
||||
#define regTCP_STATUS_BASE_IDX 1
|
||||
#define regTCP_CNTL 0x19a2
|
||||
#define regTCP_CNTL_BASE_IDX 1
|
||||
#define regTCP_CNTL2 0x19a3
|
||||
#define regTCP_CNTL2_BASE_IDX 1
|
||||
#define regTCP_DEBUG_INDEX 0x19a5
|
||||
|
@ -258,8 +258,11 @@ static int aldebaran_tables_init(struct smu_context *smu)
|
||||
}
|
||||
|
||||
smu_table->ecc_table = kzalloc(tables[SMU_TABLE_ECCINFO].size, GFP_KERNEL);
|
||||
if (!smu_table->ecc_table)
|
||||
if (!smu_table->ecc_table) {
|
||||
kfree(smu_table->metrics_table);
|
||||
kfree(smu_table->gpu_metrics_table);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -301,7 +301,7 @@ void dma_resv_add_fence(struct dma_resv *obj, struct dma_fence *fence,
|
||||
|
||||
dma_resv_list_entry(fobj, i, obj, &old, &old_usage);
|
||||
if ((old->context == fence->context && old_usage >= usage &&
|
||||
dma_fence_is_later(fence, old)) ||
|
||||
dma_fence_is_later_or_same(fence, old)) ||
|
||||
dma_fence_is_signaled(old)) {
|
||||
dma_resv_list_set(fobj, i, fence, usage);
|
||||
dma_fence_put(old);
|
||||
|
@ -113,6 +113,14 @@ dma_fence_is_later(struct dma_fence *a, struct dma_fence *b)
|
||||
return __dma_fence_is_later(a->seqno, b->seqno, a->ops);
|
||||
}
|
||||
|
||||
static inline bool
|
||||
dma_fence_is_later_or_same(struct dma_fence *a, struct dma_fence *b)
|
||||
{
|
||||
if (a == b)
|
||||
return true;
|
||||
return dma_fence_is_later(a, b);
|
||||
}
|
||||
|
||||
static inline void
|
||||
dma_fence_set_error(struct dma_fence *fence, int error)
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: if_vio.c,v 1.27 2023/12/09 10:36:05 jan Exp $ */
|
||||
/* $OpenBSD: if_vio.c,v 1.28 2023/12/11 09:40:42 jan Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2012 Stefan Fritsch, Alexander Fiveg.
|
||||
@ -749,27 +749,22 @@ again:
|
||||
hdr = &sc->sc_tx_hdrs[slot];
|
||||
memset(hdr, 0, sc->sc_hdr_size);
|
||||
if (m->m_pkthdr.csum_flags & (M_TCP_CSUM_OUT|M_UDP_CSUM_OUT)) {
|
||||
struct mbuf *mip;
|
||||
struct ip *ip;
|
||||
int ehdrlen = ETHER_HDR_LEN;
|
||||
int ipoff;
|
||||
struct ether_extracted ext;
|
||||
|
||||
ether_extract_headers(m, &ext);
|
||||
hdr->csum_start = sizeof(*ext.eh);
|
||||
#if NVLAN > 0
|
||||
struct ether_vlan_header *eh;
|
||||
|
||||
eh = mtod(m, struct ether_vlan_header *);
|
||||
if (eh->evl_encap_proto == htons(ETHERTYPE_VLAN))
|
||||
ehdrlen += ETHER_VLAN_ENCAP_LEN;
|
||||
if (ext.evh)
|
||||
hdr->csum_start = sizeof(*ext.evh);
|
||||
#endif
|
||||
|
||||
if (m->m_pkthdr.csum_flags & M_TCP_CSUM_OUT)
|
||||
hdr->csum_offset = offsetof(struct tcphdr, th_sum);
|
||||
else
|
||||
hdr->csum_offset = offsetof(struct udphdr, uh_sum);
|
||||
|
||||
mip = m_getptr(m, ehdrlen, &ipoff);
|
||||
KASSERT(mip != NULL && mip->m_len - ipoff >= sizeof(*ip));
|
||||
ip = (struct ip *)(mip->m_data + ipoff);
|
||||
hdr->csum_start = ehdrlen + (ip->ip_hl << 2);
|
||||
if (ext.ip4)
|
||||
hdr->csum_start += ext.ip4->ip_hl << 2;
|
||||
|
||||
hdr->flags = VIRTIO_NET_HDR_F_NEEDS_CSUM;
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: ugold.c,v 1.25 2023/12/08 06:33:48 miod Exp $ */
|
||||
/* $OpenBSD: ugold.c,v 1.26 2023/12/10 19:03:37 miod Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2013 Takayoshi SASANO <uaa@openbsd.org>
|
||||
@ -609,6 +609,18 @@ ugold_intr(struct uhidev *addr, void *ibuf, u_int len)
|
||||
break;
|
||||
default:
|
||||
if (!sc->sc_type) {
|
||||
/*
|
||||
* During initialization, some devices need a bit
|
||||
* more time to submit their identification string.
|
||||
*/
|
||||
if (len == sc->sc_model_len &&
|
||||
!memcmp(sc->sc_model, buf, len)) {
|
||||
#ifdef UGOLD_DEBUG
|
||||
printf("%s: duplicate string component\n",
|
||||
sc->sc_hdev.sc_dev.dv_xname);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
/*
|
||||
* Exact sensor type is not known yet, type command
|
||||
* returns arbitrary string.
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: init_main.c,v 1.322 2023/08/29 16:19:34 claudio Exp $ */
|
||||
/* $OpenBSD: init_main.c,v 1.323 2023/12/11 22:12:53 kettenis Exp $ */
|
||||
/* $NetBSD: init_main.c,v 1.84.4.1 1996/06/02 09:08:06 mrg Exp $ */
|
||||
|
||||
/*
|
||||
@ -400,6 +400,7 @@ main(void *framep)
|
||||
/* Enable per-CPU data. */
|
||||
mbcpuinit();
|
||||
kqueue_init_percpu();
|
||||
pmap_init_percpu();
|
||||
uvm_init_percpu();
|
||||
evcount_init_percpu();
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: if_pflow.c,v 1.102 2023/12/08 23:15:44 mvs Exp $ */
|
||||
/* $OpenBSD: if_pflow.c,v 1.104 2023/12/12 00:03:31 mvs Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2011 Florian Obser <florian@narrans.de>
|
||||
@ -62,8 +62,23 @@
|
||||
#define DPRINTF(x)
|
||||
#endif
|
||||
|
||||
SLIST_HEAD(, pflow_softc) pflowif_list;
|
||||
struct pflowstats pflowstats;
|
||||
SMR_SLIST_HEAD(, pflow_softc) pflowif_list;
|
||||
|
||||
enum pflowstat_counters {
|
||||
pflow_flows,
|
||||
pflow_packets,
|
||||
pflow_onomem,
|
||||
pflow_oerrors,
|
||||
pflow_ncounters,
|
||||
};
|
||||
|
||||
struct cpumem *pflow_counters;
|
||||
|
||||
static inline void
|
||||
pflowstat_inc(enum pflowstat_counters c)
|
||||
{
|
||||
counters_inc(pflow_counters, c);
|
||||
}
|
||||
|
||||
void pflowattach(int);
|
||||
int pflow_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
|
||||
@ -113,7 +128,8 @@ struct if_clone pflow_cloner =
|
||||
void
|
||||
pflowattach(int npflow)
|
||||
{
|
||||
SLIST_INIT(&pflowif_list);
|
||||
SMR_SLIST_INIT(&pflowif_list);
|
||||
pflow_counters = counters_alloc(pflow_ncounters);
|
||||
if_clone_attach(&pflow_cloner);
|
||||
}
|
||||
|
||||
@ -268,9 +284,8 @@ pflow_clone_create(struct if_clone *ifc, int unit)
|
||||
task_set(&pflowif->sc_outputtask, pflow_output_process, pflowif);
|
||||
|
||||
/* Insert into list of pflows */
|
||||
NET_LOCK();
|
||||
SLIST_INSERT_HEAD(&pflowif_list, pflowif, sc_next);
|
||||
NET_UNLOCK();
|
||||
KERNEL_ASSERT_LOCKED();
|
||||
SMR_SLIST_INSERT_HEAD_LOCKED(&pflowif_list, pflowif, sc_next);
|
||||
return (0);
|
||||
}
|
||||
|
||||
@ -284,9 +299,12 @@ pflow_clone_destroy(struct ifnet *ifp)
|
||||
|
||||
NET_LOCK();
|
||||
sc->sc_dying = 1;
|
||||
SLIST_REMOVE(&pflowif_list, sc, pflow_softc, sc_next);
|
||||
NET_UNLOCK();
|
||||
|
||||
KERNEL_ASSERT_LOCKED();
|
||||
SMR_SLIST_REMOVE_LOCKED(&pflowif_list, sc, pflow_softc, sc_next);
|
||||
smr_barrier();
|
||||
|
||||
timeout_del(&sc->sc_tmo);
|
||||
timeout_del(&sc->sc_tmo6);
|
||||
timeout_del(&sc->sc_tmo_tmpl);
|
||||
@ -513,7 +531,6 @@ pflowioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
|
||||
if ((ifp->if_flags & IFF_UP) && sc->so != NULL) {
|
||||
ifp->if_flags |= IFF_RUNNING;
|
||||
mtx_enter(&sc->sc_mtx);
|
||||
sc->sc_gcounter = pflowstats.pflow_flows;
|
||||
/* send templates on startup */
|
||||
if (sc->sc_version == PFLOW_PROTO_10)
|
||||
pflow_sendout_ipfix_tmpl(sc);
|
||||
@ -577,7 +594,6 @@ pflowioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
|
||||
if ((ifp->if_flags & IFF_UP) && sc->so != NULL) {
|
||||
ifp->if_flags |= IFF_RUNNING;
|
||||
mtx_enter(&sc->sc_mtx);
|
||||
sc->sc_gcounter = pflowstats.pflow_flows;
|
||||
if (sc->sc_version == PFLOW_PROTO_10)
|
||||
pflow_sendout_ipfix_tmpl(sc);
|
||||
mtx_leave(&sc->sc_mtx);
|
||||
@ -646,14 +662,14 @@ pflow_get_mbuf(struct pflow_softc *sc, u_int16_t set_id)
|
||||
|
||||
MGETHDR(m, M_DONTWAIT, MT_DATA);
|
||||
if (m == NULL) {
|
||||
pflowstats.pflow_onomem++;
|
||||
pflowstat_inc(pflow_onomem);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
MCLGET(m, M_DONTWAIT);
|
||||
if ((m->m_flags & M_EXT) == 0) {
|
||||
m_free(m);
|
||||
pflowstats.pflow_onomem++;
|
||||
pflowstat_inc(pflow_onomem);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@ -812,7 +828,7 @@ export_pflow(struct pf_state *st)
|
||||
|
||||
sk = st->key[st->direction == PF_IN ? PF_SK_WIRE : PF_SK_STACK];
|
||||
|
||||
SLIST_FOREACH(sc, &pflowif_list, sc_next) {
|
||||
SMR_SLIST_FOREACH(sc, &pflowif_list, sc_next) {
|
||||
mtx_enter(&sc->sc_mtx);
|
||||
switch (sc->sc_version) {
|
||||
case PFLOW_PROTO_5:
|
||||
@ -898,8 +914,7 @@ copy_flow_to_m(struct pflow_flow *flow, struct pflow_softc *sc)
|
||||
(sc->sc_count * sizeof(struct pflow_flow)),
|
||||
sizeof(struct pflow_flow), flow, M_NOWAIT);
|
||||
|
||||
if (pflowstats.pflow_flows == sc->sc_gcounter)
|
||||
pflowstats.pflow_flows++;
|
||||
pflowstat_inc(pflow_flows);
|
||||
sc->sc_gcounter++;
|
||||
sc->sc_count++;
|
||||
|
||||
@ -928,8 +943,7 @@ copy_flow_ipfix_4_to_m(struct pflow_ipfix_flow4 *flow, struct pflow_softc *sc)
|
||||
(sc->sc_count4 * sizeof(struct pflow_ipfix_flow4)),
|
||||
sizeof(struct pflow_ipfix_flow4), flow, M_NOWAIT);
|
||||
|
||||
if (pflowstats.pflow_flows == sc->sc_gcounter)
|
||||
pflowstats.pflow_flows++;
|
||||
pflowstat_inc(pflow_flows);
|
||||
sc->sc_gcounter++;
|
||||
sc->sc_count4++;
|
||||
|
||||
@ -957,8 +971,7 @@ copy_flow_ipfix_6_to_m(struct pflow_ipfix_flow6 *flow, struct pflow_softc *sc)
|
||||
(sc->sc_count6 * sizeof(struct pflow_ipfix_flow6)),
|
||||
sizeof(struct pflow_ipfix_flow6), flow, M_NOWAIT);
|
||||
|
||||
if (pflowstats.pflow_flows == sc->sc_gcounter)
|
||||
pflowstats.pflow_flows++;
|
||||
pflowstat_inc(pflow_flows);
|
||||
sc->sc_gcounter++;
|
||||
sc->sc_count6++;
|
||||
|
||||
@ -1114,7 +1127,7 @@ pflow_sendout_v5(struct pflow_softc *sc)
|
||||
return (0);
|
||||
}
|
||||
|
||||
pflowstats.pflow_packets++;
|
||||
pflowstat_inc(pflow_packets);
|
||||
h = mtod(m, struct pflow_header *);
|
||||
h->count = htons(sc->sc_count);
|
||||
|
||||
@ -1171,14 +1184,14 @@ pflow_sendout_ipfix(struct pflow_softc *sc, sa_family_t af)
|
||||
return (0);
|
||||
}
|
||||
|
||||
pflowstats.pflow_packets++;
|
||||
pflowstat_inc(pflow_packets);
|
||||
set_hdr = mtod(m, struct pflow_set_header *);
|
||||
set_hdr->set_length = htons(set_length);
|
||||
|
||||
/* populate pflow_header */
|
||||
M_PREPEND(m, sizeof(struct pflow_v10_header), M_DONTWAIT);
|
||||
if (m == NULL) {
|
||||
pflowstats.pflow_onomem++;
|
||||
pflowstat_inc(pflow_onomem);
|
||||
return (ENOBUFS);
|
||||
}
|
||||
h10 = mtod(m, struct pflow_v10_header *);
|
||||
@ -1215,12 +1228,12 @@ pflow_sendout_ipfix_tmpl(struct pflow_softc *sc)
|
||||
m_freem(m);
|
||||
return (0);
|
||||
}
|
||||
pflowstats.pflow_packets++;
|
||||
pflowstat_inc(pflow_packets);
|
||||
|
||||
/* populate pflow_header */
|
||||
M_PREPEND(m, sizeof(struct pflow_v10_header), M_DONTWAIT);
|
||||
if (m == NULL) {
|
||||
pflowstats.pflow_onomem++;
|
||||
pflowstat_inc(pflow_onomem);
|
||||
return (ENOBUFS);
|
||||
}
|
||||
h10 = mtod(m, struct pflow_v10_header *);
|
||||
@ -1260,11 +1273,23 @@ pflow_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp,
|
||||
return (ENOTDIR);
|
||||
|
||||
switch (name[0]) {
|
||||
case NET_PFLOW_STATS:
|
||||
case NET_PFLOW_STATS: {
|
||||
uint64_t counters[pflow_ncounters];
|
||||
struct pflowstats pflowstats;
|
||||
|
||||
if (newp != NULL)
|
||||
return (EPERM);
|
||||
|
||||
counters_read(pflow_counters, counters, pflow_ncounters, NULL);
|
||||
|
||||
pflowstats.pflow_flows = counters[pflow_flows];
|
||||
pflowstats.pflow_packets = counters[pflow_packets];
|
||||
pflowstats.pflow_onomem = counters[pflow_onomem];
|
||||
pflowstats.pflow_oerrors = counters[pflow_oerrors];
|
||||
|
||||
return (sysctl_struct(oldp, oldlenp, newp, newlen,
|
||||
&pflowstats, sizeof(pflowstats)));
|
||||
}
|
||||
default:
|
||||
return (EOPNOTSUPP);
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: if_pflow.h,v 1.20 2023/12/08 23:13:40 mvs Exp $ */
|
||||
/* $OpenBSD: if_pflow.h,v 1.22 2023/12/12 00:03:31 mvs Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2008 Henning Brauer <henning@openbsd.org>
|
||||
@ -169,6 +169,8 @@ struct pflow_ipfix_flow6 {
|
||||
|
||||
#ifdef _KERNEL
|
||||
|
||||
#include <sys/smr.h>
|
||||
|
||||
/*
|
||||
* Locks used to protect struct members and global data
|
||||
* I immutable after creation
|
||||
@ -190,7 +192,7 @@ struct pflow_softc {
|
||||
unsigned int sc_maxcount; /* [m] */
|
||||
unsigned int sc_maxcount4; /* [m] */
|
||||
unsigned int sc_maxcount6; /* [m] */
|
||||
u_int64_t sc_gcounter; /* [m] */
|
||||
u_int32_t sc_gcounter; /* [m] */
|
||||
u_int32_t sc_sequence; /* [m] */
|
||||
struct timeout sc_tmo;
|
||||
struct timeout sc_tmo6;
|
||||
@ -207,7 +209,7 @@ struct pflow_softc {
|
||||
mbuf */
|
||||
struct mbuf *sc_mbuf6; /* [m] current cumulative
|
||||
mbuf */
|
||||
SLIST_ENTRY(pflow_softc) sc_next;
|
||||
SMR_SLIST_ENTRY(pflow_softc) sc_next;
|
||||
};
|
||||
|
||||
extern struct pflow_softc *pflowif;
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: acct.h,v 1.13 2023/02/21 14:31:07 deraadt Exp $ */
|
||||
/* $OpenBSD: acct.h,v 1.14 2023/12/11 00:39:43 deraadt Exp $ */
|
||||
/* $NetBSD: acct.h,v 1.16 1995/03/26 20:23:52 jtc Exp $ */
|
||||
|
||||
/*-
|
||||
@ -67,6 +67,7 @@ struct acct {
|
||||
#define ATRAP 0x00000040 /* memory access violation */
|
||||
#define AUNVEIL 0x00000080 /* unveil access violation */
|
||||
#define AEXECVE 0x00000100 /* execve from wrong libc stub */
|
||||
#define APINSYS 0x00000200 /* syscall pin violation */
|
||||
u_int32_t ac_flag; /* accounting flags */
|
||||
};
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
.\" $OpenBSD: lastcomm.1,v 1.25 2023/02/21 14:31:07 deraadt Exp $
|
||||
.\" $OpenBSD: lastcomm.1,v 1.26 2023/12/11 00:40:31 deraadt Exp $
|
||||
.\" $NetBSD: lastcomm.1,v 1.5 1995/10/22 01:43:41 ghudson Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 1980, 1990, 1993
|
||||
@ -30,7 +30,7 @@
|
||||
.\"
|
||||
.\" @(#)lastcomm.1 8.1 (Berkeley) 6/6/93
|
||||
.\"
|
||||
.Dd $Mdocdate: February 21 2023 $
|
||||
.Dd $Mdocdate: December 11 2023 $
|
||||
.Dt LASTCOMM 1
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -122,6 +122,10 @@ pointer was not in stack memory.
|
||||
The command was terminated due to a
|
||||
.Xr pledge 2
|
||||
violation.
|
||||
.It Li S
|
||||
The command tried to execute a system call from the wrong
|
||||
system call instruction, see
|
||||
.Xr pinsyscalls 2 .
|
||||
.It Li T
|
||||
The command did a memory access violation detected by a
|
||||
processor trap.
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: lastcomm.c,v 1.33 2023/02/21 14:31:07 deraadt Exp $ */
|
||||
/* $OpenBSD: lastcomm.c,v 1.34 2023/12/11 00:40:31 deraadt Exp $ */
|
||||
/* $NetBSD: lastcomm.c,v 1.9 1995/10/22 01:43:42 ghudson Exp $ */
|
||||
|
||||
/*
|
||||
@ -178,6 +178,7 @@ flagbits(int f)
|
||||
BIT(ATRAP, 'T');
|
||||
BIT(AUNVEIL, 'U');
|
||||
BIT(AEXECVE, 'E');
|
||||
BIT(APINSYS, 'S');
|
||||
*p = '\0';
|
||||
return (flags);
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: extern.h,v 1.195 2023/11/24 14:05:47 job Exp $ */
|
||||
/* $OpenBSD: extern.h,v 1.196 2023/12/11 19:05:20 job Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2019 Kristaps Dzonsons <kristaps@bsd.lv>
|
||||
*
|
||||
@ -210,6 +210,7 @@ struct mft {
|
||||
char *sia; /* SIA signedObject */
|
||||
char *ski; /* SKI */
|
||||
char *crl; /* CRL file name */
|
||||
unsigned char mfthash[SHA256_DIGEST_LENGTH];
|
||||
unsigned char crlhash[SHA256_DIGEST_LENGTH];
|
||||
time_t signtime; /* CMS signing-time attribute */
|
||||
time_t thisupdate; /* from the eContent */
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: mft.c,v 1.99 2023/10/13 12:06:49 job Exp $ */
|
||||
/* $OpenBSD: mft.c,v 1.100 2023/12/11 15:50:23 job Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2022 Theo Buehler <tb@openbsd.org>
|
||||
* Copyright (c) 2019 Kristaps Dzonsons <kristaps@bsd.lv>
|
||||
@ -545,8 +545,9 @@ mft_read(struct ibuf *b)
|
||||
}
|
||||
|
||||
/*
|
||||
* Compare two MFT files, returns 1 if first MFT is preferred and 0 if second
|
||||
* MFT should be used.
|
||||
* Compare the manifestNumber of two MFT files.
|
||||
* Returns 1 if first MFT should be used, 0 if both are equal, and -1 if the
|
||||
* second MFT should be used.
|
||||
*/
|
||||
int
|
||||
mft_compare(const struct mft *a, const struct mft *b)
|
||||
@ -556,16 +557,19 @@ mft_compare(const struct mft *a, const struct mft *b)
|
||||
if (b == NULL)
|
||||
return 1;
|
||||
if (a == NULL)
|
||||
return 0;
|
||||
return -1;
|
||||
|
||||
r = strlen(a->seqnum) - strlen(b->seqnum);
|
||||
if (r > 0) /* seqnum in a is longer -> higher */
|
||||
return 1;
|
||||
if (r < 0) /* seqnum in a is shorter -> smaller */
|
||||
return 0;
|
||||
return -1;
|
||||
|
||||
r = strcmp(a->seqnum, b->seqnum);
|
||||
if (r > 0) /* a is greater, prefer a */
|
||||
return 1;
|
||||
if (r < 0) /* b is greater, prefer b */
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: parser.c,v 1.101 2023/12/09 00:44:18 job Exp $ */
|
||||
/* $OpenBSD: parser.c,v 1.103 2023/12/11 19:05:20 job Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2019 Claudio Jeker <claudio@openbsd.org>
|
||||
* Copyright (c) 2019 Kristaps Dzonsons <kristaps@bsd.lv>
|
||||
@ -280,6 +280,10 @@ proc_parser_mft_pre(struct entity *entp, enum location loc, char **file,
|
||||
free(der);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!EVP_Digest(der, len, mft->mfthash, NULL, EVP_sha256(), NULL))
|
||||
errx(1, "EVP_Digest failed");
|
||||
|
||||
free(der);
|
||||
|
||||
*crl = parse_load_crl_from_mft(entp, mft, DIR_TEMP, crlfile);
|
||||
@ -361,7 +365,7 @@ proc_parser_mft(struct entity *entp, struct mft **mp, char **crlfile,
|
||||
struct crl *crl, *crl1, *crl2;
|
||||
char *file, *file1, *file2, *crl1file, *crl2file;
|
||||
const char *err1, *err2;
|
||||
int warned = 0;
|
||||
int r, warned = 0;
|
||||
|
||||
*mp = NULL;
|
||||
*crlmtime = 0;
|
||||
@ -376,7 +380,17 @@ proc_parser_mft(struct entity *entp, struct mft **mp, char **crlfile,
|
||||
if (err2 != NULL)
|
||||
err1 = err2;
|
||||
|
||||
if (mft_compare(mft1, mft2) == 1) {
|
||||
r = mft_compare(mft1, mft2);
|
||||
if (r == -1 && mft1 != NULL && mft2 != NULL)
|
||||
warnx("%s: manifest replay detected (expected >= #%s, got #%s)",
|
||||
file1, mft2->seqnum, mft1->seqnum);
|
||||
|
||||
if (r == 0 && memcmp(mft1->mfthash, mft2->mfthash,
|
||||
SHA256_DIGEST_LENGTH) != 0)
|
||||
warnx("%s: manifest misissuance, #%s was recycled",
|
||||
file1, mft1->seqnum);
|
||||
|
||||
if (r == 1) {
|
||||
*mp = proc_parser_mft_post(file1, mft1, entp->path, err1,
|
||||
&warned);
|
||||
if (*mp == NULL) {
|
||||
|
Loading…
Reference in New Issue
Block a user