This commit is contained in:
purplerain 2023-06-13 18:56:01 +00:00
parent 25f3a6cfac
commit bfc16459ac
Signed by: purplerain
GPG Key ID: F42C07F07E2E35B7
143 changed files with 3115 additions and 4613 deletions

View File

@ -1,4 +1,4 @@
/* $OpenBSD: bn.h,v 1.71 2023/04/27 06:48:47 tb Exp $ */
/* $OpenBSD: bn.h,v 1.72 2023/06/13 09:12:22 tb Exp $ */
/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
* All rights reserved.
*
@ -547,6 +547,7 @@ void ERR_load_BN_strings(void);
#define BN_R_ENCODING_ERROR 104
#define BN_R_EXPAND_ON_STATIC_BIGNUM_DATA 105
#define BN_R_INPUT_NOT_REDUCED 110
#define BN_R_INVALID_ARGUMENT 118
#define BN_R_INVALID_LENGTH 106
#define BN_R_INVALID_RANGE 115
#define BN_R_NOT_A_SQUARE 111

View File

@ -1,4 +1,4 @@
/* $OpenBSD: bn_err.c,v 1.15 2022/07/12 14:42:48 kn Exp $ */
/* $OpenBSD: bn_err.c,v 1.16 2023/06/13 09:12:22 tb Exp $ */
/* ====================================================================
* Copyright (c) 1999-2007 The OpenSSL Project. All rights reserved.
*
@ -80,6 +80,7 @@ static ERR_STRING_DATA BN_str_reasons[]= {
{ERR_REASON(BN_R_ENCODING_ERROR) , "encoding error"},
{ERR_REASON(BN_R_EXPAND_ON_STATIC_BIGNUM_DATA), "expand on static bignum data"},
{ERR_REASON(BN_R_INPUT_NOT_REDUCED) , "input not reduced"},
{ERR_REASON(BN_R_INVALID_ARGUMENT) , "invalid argument"},
{ERR_REASON(BN_R_INVALID_LENGTH) , "invalid length"},
{ERR_REASON(BN_R_INVALID_RANGE) , "invalid range"},
{ERR_REASON(BN_R_NOT_A_SQUARE) , "not a square"},

View File

@ -1,4 +1,4 @@
/* $OpenBSD: bn_mod.c,v 1.20 2023/03/27 10:21:23 tb Exp $ */
/* $OpenBSD: bn_mod.c,v 1.21 2023/06/13 09:28:13 tb Exp $ */
/* Includes code written by Lenka Fibikova <fibikova@exp-math.uni-essen.de>
* for the OpenSSL project. */
/* ====================================================================
@ -136,6 +136,10 @@ BN_mod_nonct(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx)
int
BN_nnmod(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx)
{
if (r == m) {
BNerror(BN_R_INVALID_ARGUMENT);
return 0;
}
if (!BN_mod_ct(r, a, m, ctx))
return 0;
if (BN_is_negative(r))
@ -147,6 +151,10 @@ int
BN_mod_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m,
BN_CTX *ctx)
{
if (r == m) {
BNerror(BN_R_INVALID_ARGUMENT);
return 0;
}
if (!BN_add(r, a, b))
return 0;
return BN_nnmod(r, r, m, ctx);
@ -159,6 +167,10 @@ BN_mod_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m,
int
BN_mod_add_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m)
{
if (r == m) {
BNerror(BN_R_INVALID_ARGUMENT);
return 0;
}
if (!BN_uadd(r, a, b))
return 0;
if (BN_ucmp(r, m) >= 0)
@ -170,6 +182,10 @@ int
BN_mod_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m,
BN_CTX *ctx)
{
if (r == m) {
BNerror(BN_R_INVALID_ARGUMENT);
return 0;
}
if (!BN_sub(r, a, b))
return 0;
return BN_nnmod(r, r, m, ctx);
@ -182,6 +198,10 @@ BN_mod_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m,
int
BN_mod_sub_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m)
{
if (r == m) {
BNerror(BN_R_INVALID_ARGUMENT);
return 0;
}
if (BN_ucmp(a, b) >= 0)
return BN_usub(r, a, b);
if (!BN_usub(r, b, a))
@ -198,6 +218,11 @@ BN_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m,
BN_CTX_start(ctx);
if (r == m) {
BNerror(BN_R_INVALID_ARGUMENT);
goto err;
}
rr = r;
if (rr == a || rr == b)
rr = BN_CTX_get(ctx);
@ -231,6 +256,10 @@ BN_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx)
int
BN_mod_lshift1(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx)
{
if (r == m) {
BNerror(BN_R_INVALID_ARGUMENT);
return 0;
}
if (!BN_lshift1(r, a))
return 0;
return BN_nnmod(r, r, m, ctx);
@ -243,6 +272,10 @@ BN_mod_lshift1(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx)
int
BN_mod_lshift1_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *m)
{
if (r == m) {
BNerror(BN_R_INVALID_ARGUMENT);
return 0;
}
if (!BN_lshift1(r, a))
return 0;
if (BN_ucmp(r, m) >= 0)
@ -258,6 +291,11 @@ BN_mod_lshift(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m, BN_CTX *ctx)
BN_CTX_start(ctx);
if (r == m) {
BNerror(BN_R_INVALID_ARGUMENT);
goto err;
}
if (!BN_nnmod(r, a, m, ctx))
goto err;
@ -288,6 +326,11 @@ BN_mod_lshift_quick(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m)
{
int max_shift;
if (r == m) {
BNerror(BN_R_INVALID_ARGUMENT);
return 0;
}
if (!bn_copy(r, a))
return 0;

View File

@ -1,12 +1,7 @@
# $OpenBSD: Makefile,v 1.1 2022/04/23 08:57:52 tobias Exp $
# $OpenBSD: Makefile,v 1.2 2023/06/13 10:38:45 tb Exp $
REGRESS_TARGETS= run-regress
LDFLAGS= -lutil
CLEANFILES= ibuf_test ibuf_test.d
run-regress: ibuf_test
${.OBJDIR}/ibuf_test
PROG= ibuf_test
LDADD= -lutil
DPADD= ${LIBUTIL}
.include <bsd.regress.mk>

View File

@ -1,5 +1,4 @@
/* $OpenBSD: ibuf_test.c,v 1.2 2023/05/23 09:32:37 claudio Exp $
*/
/* $OpenBSD: ibuf_test.c,v 1.3 2023/06/13 10:39:46 tb Exp $ */
/*
* Copyright (c) Tobias Stoeckmann <tobias@openbsd.org>
*
@ -26,7 +25,8 @@
#include <stdio.h>
int
test_ibuf_open(void) {
test_ibuf_open(void)
{
struct ibuf *buf;
if ((buf = ibuf_open(1)) == NULL)
@ -37,7 +37,8 @@ test_ibuf_open(void) {
}
int
test_ibuf_dynamic(void) {
test_ibuf_dynamic(void)
{
struct ibuf *buf;
if (ibuf_dynamic(100, 0) != NULL)
@ -51,7 +52,8 @@ test_ibuf_dynamic(void) {
}
int
test_ibuf_reserve(void) {
test_ibuf_reserve(void)
{
struct ibuf *buf;
int ret;
@ -76,7 +78,8 @@ test_ibuf_reserve(void) {
}
int
test_ibuf_seek(void) {
test_ibuf_seek(void)
{
struct ibuf *buf;
int ret;
@ -90,7 +93,8 @@ test_ibuf_seek(void) {
}
int
test_msgbuf_drain(void) {
test_msgbuf_drain(void)
{
struct msgbuf msgbuf;
struct ibuf *buf;

View File

@ -1,7 +1,12 @@
# $OpenBSD: Makefile,v 1.1 2023/06/12 20:19:45 millert Exp $
# $OpenBSD: Makefile,v 1.2 2023/06/13 04:59:10 anton Exp $
SEQ?= /usr/bin/seq
CLEANFILES+= *.out
REGRESS_TARGETS+=seqtest
seqtest:
sh ${.CURDIR}/$@.sh ${SEQ} $@.out
diff ${.CURDIR}/$@.expected $@.out
.include <bsd.regress.mk>

View File

@ -1,10 +1,10 @@
# $OpenBSD: Makefile,v 1.9 2023/04/18 19:41:50 bluhm Exp $
# $OpenBSD: Makefile,v 1.10 2023/06/13 11:41:36 claudio Exp $
PROGS += test-http
SRCS_test-http = test-http.c http.c io.c encoding.c
LDADD_test-http = -ltls -lssl -lcrypto -lutil
DPADD_test-http = ${LIBTLS} ${LIBSSL} ${LIBCRYPTO} ${LIBUTIL}
LDADD_test-http = -ltls -lssl -lcrypto -lutil -lz
DPADD_test-http = ${LIBTLS} ${LIBSSL} ${LIBCRYPTO} ${LIBUTIL} ${LIBZ}
SERVER = jigsaw.w3.org
.if ! (make(clean) || make(cleandir) || make(obj))

View File

@ -1,4 +1,4 @@
/* $OpenBSD: iked.h,v 1.215 2023/06/12 09:02:31 claudio Exp $ */
/* $OpenBSD: iked.h,v 1.216 2023/06/13 12:34:12 tb Exp $ */
/*
* Copyright (c) 2019 Tobias Heider <tobias.heider@stusta.de>
@ -1252,6 +1252,8 @@ uint32_t
prefixlen2mask(uint8_t);
const char *
print_host(struct sockaddr *, char *, size_t);
const char *
print_addr(void *);
char *get_string(uint8_t *, size_t);
const char *
print_proto(uint8_t);

View File

@ -1,4 +1,4 @@
/* $OpenBSD: ikev2.c,v 1.368 2023/06/12 09:02:31 claudio Exp $ */
/* $OpenBSD: ikev2.c,v 1.370 2023/06/13 12:34:12 tb Exp $ */
/*
* Copyright (c) 2019 Tobias Heider <tobias.heider@stusta.de>
@ -669,8 +669,8 @@ ikev2_recv(struct iked *env, struct iked_message *msg)
print_map(hdr->ike_exchange, ikev2_exchange_map),
msg->msg_response ? "res" : "req",
msg->msg_msgid,
print_host((struct sockaddr *)&msg->msg_peer, NULL, 0),
print_host((struct sockaddr *)&msg->msg_local, NULL, 0),
print_addr(&msg->msg_peer),
print_addr(&msg->msg_local),
ibuf_length(msg->msg_data),
msg->msg_policy->pol_name);
log_debug("%s: ispi %s rspi %s", __func__,
@ -783,8 +783,7 @@ ikev2_recv(struct iked *env, struct iked_message *msg)
sa->sa_fd = msg->msg_fd;
log_debug("%s: updated SA to peer %s local %s", __func__,
print_host((struct sockaddr *)&sa->sa_peer.addr, NULL, 0),
print_host((struct sockaddr *)&sa->sa_local.addr, NULL, 0));
print_addr(&sa->sa_peer.addr), print_addr(&sa->sa_local.addr));
done:
if (initiator)
@ -1101,16 +1100,13 @@ ikev2_ike_auth_recv(struct iked *env, struct iked_sa *sa,
if (sa->sa_cp == IKEV2_CP_REPLY) {
if (sa->sa_cp_addr)
log_info("%s: obtained lease: %s", SPI_SA(sa, __func__),
print_host((struct sockaddr *)&sa->sa_cp_addr->addr,
NULL, 0));
print_addr(&sa->sa_cp_addr->addr));
if (sa->sa_cp_addr6)
log_info("%s: obtained lease: %s", SPI_SA(sa, __func__),
print_host((struct sockaddr *)&sa->sa_cp_addr6->addr,
NULL, 0));
print_addr(&sa->sa_cp_addr6->addr));
if (sa->sa_cp_dns)
log_info("%s: obtained DNS: %s", SPI_SA(sa, __func__),
print_host((struct sockaddr *)&sa->sa_cp_dns->addr,
NULL, 0));
print_addr(&sa->sa_cp_dns->addr));
}
return ikev2_ike_auth(env, sa);
@ -1296,8 +1292,7 @@ ikev2_enable_natt(struct iked *env, struct iked_sa *sa,
log_debug("%s: detected NAT, enabling UDP encapsulation,"
" updated SA to peer %s local %s", __func__,
print_host((struct sockaddr *)&sa->sa_peer.addr, NULL, 0),
print_host((struct sockaddr *)&sa->sa_local.addr, NULL, 0));
print_addr(&sa->sa_peer.addr), print_addr(&sa->sa_local.addr));
}
void
@ -1318,9 +1313,7 @@ ikev2_init_ike_sa(struct iked *env, void *arg)
if (ikev2_init_ike_sa_peer(env, pol, &pol->pol_peer, NULL))
log_debug("%s: failed to initiate with peer %s",
__func__,
print_host((struct sockaddr *)&pol->pol_peer.addr,
NULL, 0));
__func__, print_addr(&pol->pol_peer.addr));
}
timer_set(env, &env->sc_inittmr, ikev2_init_ike_sa, NULL);
@ -2326,7 +2319,7 @@ ikev2_nat_detection(struct iked *env, struct iked_message *msg,
frompeer ? "peer" : "local",
print_spi(betoh64(ispi), 8),
print_spi(betoh64(rspi), 8),
print_host(src, NULL, 0));
print_addr(src));
ss = src;
break;
case IKEV2_N_NAT_DETECTION_DESTINATION_IP:
@ -2334,7 +2327,7 @@ ikev2_nat_detection(struct iked *env, struct iked_message *msg,
frompeer ? "peer" : "local",
print_spi(betoh64(ispi), 8),
print_spi(betoh64(rspi), 8),
print_host(dst, NULL, 0));
print_addr(dst));
ss = dst;
break;
default:
@ -5225,12 +5218,12 @@ ikev2_ike_sa_keepalive(struct iked *env, void *arg)
(struct sockaddr *)&sa->sa_local.addr, sa->sa_local.addr.ss_len)
== -1)
log_warn("%s: sendtofrom: peer %s local %s", __func__,
print_host((struct sockaddr *)&sa->sa_peer.addr, NULL, 0),
print_host((struct sockaddr *)&sa->sa_local.addr, NULL, 0));
print_addr(&sa->sa_peer.addr),
print_addr(&sa->sa_local.addr));
else
log_debug("%s: peer %s local %s", __func__,
print_host((struct sockaddr *)&sa->sa_peer.addr, NULL, 0),
print_host((struct sockaddr *)&sa->sa_local.addr, NULL, 0));
print_addr(&sa->sa_peer.addr),
print_addr(&sa->sa_local.addr));
ikestat_inc(env, ikes_keepalive_sent);
timer_add(env, &sa->sa_keepalive, IKED_IKE_SA_KEEPALIVE_TIMEOUT);
}
@ -6430,11 +6423,16 @@ ikev2_childsa_enable(struct iked *env, struct iked_sa *sa)
int ret = -1;
spif = open_memstream(&spibuf, &spisz);
flowf = open_memstream(&flowbuf, &flowsz);
if (spif == NULL || flowf == NULL) {
if (spif == NULL) {
log_warn("%s", __func__);
return (ret);
}
flowf = open_memstream(&flowbuf, &flowsz);
if (flowf == NULL) {
log_warn("%s", __func__);
fclose(spif);
return (ret);
}
TAILQ_FOREACH(csa, &sa->sa_childsas, csa_entry) {
if (csa->csa_rekey || csa->csa_loaded)
@ -6552,18 +6550,15 @@ ikev2_childsa_enable(struct iked *env, struct iked_sa *sa)
fputs(", ", flowf);
fprintf(flowf, "%s-%s/%d%s%s%s%s%s=%s/%d(%u)%s",
print_map(flow->flow_saproto, ikev2_saproto_map),
print_host((struct sockaddr *)&flow->flow_src.addr,
NULL, 0),
print_addr(&flow->flow_src.addr),
flow->flow_src.addr_mask,
flow->flow_prenat.addr_af != 0 ? "[": "",
flow->flow_prenat.addr_af != 0 ?
print_host((struct sockaddr *)
&flow->flow_prenat.addr, NULL, 0) : "",
print_addr(&flow->flow_prenat.addr) : "",
flow->flow_prenat.addr_af != 0 ? "/" : "",
flow->flow_prenat.addr_af != 0 ? prenat_mask : "",
flow->flow_prenat.addr_af != 0 ? "]": "",
print_host((struct sockaddr *)&flow->flow_dst.addr,
NULL, 0),
print_addr(&flow->flow_dst.addr),
flow->flow_dst.addr_mask,
flow->flow_ipproto,
reload ? "-R" : "");
@ -6575,8 +6570,7 @@ ikev2_childsa_enable(struct iked *env, struct iked_sa *sa)
memcpy(&sa->sa_peer_loaded, &sa->sa_peer,
sizeof(sa->sa_peer_loaded));
log_debug("%s: remember SA peer %s", __func__,
print_host((struct sockaddr *)&sa->sa_peer_loaded.addr,
NULL, 0));
print_addr(&sa->sa_peer_loaded.addr));
}
fflush(spif);
@ -7124,8 +7118,7 @@ ikev2_cp_setaddr_pool(struct iked *env, struct iked_sa *sa,
log_info(
"%s: giving up assigned address %s to IKESA %s",
SPI_SA(osa, __func__),
print_host((struct sockaddr *)
&sa->sa_addrpool->addr, NULL, 0),
print_addr(&sa->sa_addrpool->addr),
print_spi(sa->sa_hdr.sh_ispi, 8));
}
if (sa->sa_addrpool6) {
@ -7133,8 +7126,7 @@ ikev2_cp_setaddr_pool(struct iked *env, struct iked_sa *sa,
log_info(
"%s: giving up assigned v6 address %s to IKESA %s",
SPI_SA(osa, __func__),
print_host((struct sockaddr *)
&sa->sa_addrpool6->addr, NULL, 0),
print_addr(&sa->sa_addrpool6->addr),
print_spi(sa->sa_hdr.sh_ispi, 8));
}
if (family == AF_INET && sa->sa_addrpool != NULL)
@ -7263,7 +7255,7 @@ ikev2_cp_setaddr_pool(struct iked *env, struct iked_sa *sa,
if (ikev2_print_id(IKESA_DSTID(sa), idstr, sizeof(idstr)) == -1)
bzero(idstr, sizeof(idstr));
log_info("%sassigned address %s to %s%s", SPI_SA(sa, NULL),
print_host((struct sockaddr *)&addr.addr, NULL, 0),
print_addr(&addr.addr),
idstr, requested ? " (requested by peer)" : "");
return (0);
}
@ -7369,8 +7361,8 @@ ikev2_update_sa_addresses(struct iked *env, struct iked_sa *sa)
return -1;
log_info("%s: old %s new %s", SPI_SA(sa, __func__),
print_host((struct sockaddr *)&sa->sa_peer_loaded.addr, NULL, 0),
print_host((struct sockaddr *)&sa->sa_peer.addr, NULL, 0));
print_addr(&sa->sa_peer_loaded.addr),
print_addr(&sa->sa_peer.addr));
TAILQ_FOREACH(csa, &sa->sa_childsas, csa_entry) {
if (!csa->csa_loaded)
@ -7444,11 +7436,10 @@ ikev2_info_sa(struct iked *env, int dolog, const char *msg, struct iked_sa *sa)
msg, sa,
print_spi(sa->sa_hdr.sh_rspi, 8),
print_spi(sa->sa_hdr.sh_ispi, 8),
print_host((struct sockaddr *)&sa->sa_local.addr, NULL, 0),
print_host((struct sockaddr *)&sa->sa_peer.addr, NULL, 0),
print_addr(&sa->sa_local.addr),
print_addr(&sa->sa_peer.addr),
idstr,
sa->sa_addrpool ?
print_host((struct sockaddr *)&sa->sa_addrpool->addr, NULL, 0) : "",
sa->sa_addrpool ? print_addr(&sa->sa_addrpool->addr) : "",
print_map(sa->sa_state, ikev2_state_map),
sa->sa_hdr.sh_initiator ? 'i' : 'r',
sa->sa_natt ? " natt" : "",
@ -7479,8 +7470,8 @@ ikev2_info_csa(struct iked *env, int dolog, const char *msg, struct iked_childsa
print_map(csa->csa_saproto, ikev2_saproto_map),
print_spi(csa->csa_spi.spi, csa->csa_spi.spi_size),
csa->csa_dir == IPSP_DIRECTION_IN ? "in" : "out",
print_host((struct sockaddr *)&csa->csa_local->addr, NULL, 0),
print_host((struct sockaddr *)&csa->csa_peer->addr, NULL, 0),
print_addr(&csa->csa_local->addr),
print_addr(&csa->csa_peer->addr),
csa->csa_loaded ? "L" : "",
csa->csa_rekey ? "R" : "",
csa->csa_allocated ? "A" : "",
@ -7519,13 +7510,13 @@ ikev2_info_flow(struct iked *env, int dolog, const char *msg, struct iked_flow *
"%s: %p %s %s %s/%d -> %s/%d %s%s%s%s%s[%u]@%d (%s) @%p\n", msg, flow,
print_map(flow->flow_saproto, ikev2_saproto_map),
flow->flow_dir == IPSP_DIRECTION_IN ? "in" : "out",
print_host((struct sockaddr *)&flow->flow_src.addr, NULL, 0),
print_addr(&flow->flow_src.addr),
flow->flow_src.addr_mask,
print_host((struct sockaddr *)&flow->flow_dst.addr, NULL, 0),
print_addr(&flow->flow_dst.addr),
flow->flow_dst.addr_mask,
flow->flow_prenat.addr_af != 0 ? "[": "",
flow->flow_prenat.addr_af != 0 ? print_host((struct sockaddr *)
&flow->flow_prenat.addr, NULL, 0) : "",
flow->flow_prenat.addr_af != 0 ?
print_addr(&flow->flow_prenat.addr) : "",
flow->flow_prenat.addr_af != 0 ? "/" : "",
flow->flow_prenat.addr_af != 0 ? prenat_mask : "",
flow->flow_prenat.addr_af != 0 ? "] ": "",
@ -7611,14 +7602,12 @@ ikev2_log_established(struct iked_sa *sa)
log_info(
"%sestablished peer %s[%s] local %s[%s]%s%s%s%s policy '%s'%s"
" (enc %s%s%s group %s prf %s)", SPI_SA(sa, NULL),
print_host((struct sockaddr *)&sa->sa_peer.addr, NULL, 0), dstid,
print_host((struct sockaddr *)&sa->sa_local.addr, NULL, 0), srcid,
print_addr(&sa->sa_peer.addr), dstid,
print_addr(&sa->sa_local.addr), srcid,
sa->sa_addrpool ? " assigned " : "",
sa->sa_addrpool ?
print_host((struct sockaddr *)&sa->sa_addrpool->addr, NULL, 0) : "",
sa->sa_addrpool ? print_addr(&sa->sa_addrpool->addr) : "",
sa->sa_addrpool6 ? " assigned " : "",
sa->sa_addrpool6 ?
print_host((struct sockaddr *)&sa->sa_addrpool6->addr, NULL, 0) : "",
sa->sa_addrpool6 ? print_addr(&sa->sa_addrpool6->addr) : "",
sa->sa_policy ? sa->sa_policy->pol_name : "",
sa->sa_hdr.sh_initiator ? " as initiator" : " as responder",
print_xf(sa->sa_encr->encr_id, cipher_keylength(sa->sa_encr) -

View File

@ -1,4 +1,4 @@
/* $OpenBSD: ikev2_msg.c,v 1.94 2023/06/06 13:27:49 claudio Exp $ */
/* $OpenBSD: ikev2_msg.c,v 1.95 2023/06/13 12:34:12 tb Exp $ */
/*
* Copyright (c) 2019 Tobias Heider <tobias.heider@stusta.de>
@ -285,8 +285,8 @@ ikev2_msg_send(struct iked *env, struct iked_message *msg)
print_map(exchange, ikev2_exchange_map),
(flags & IKEV2_FLAG_RESPONSE) ? "res" : "req",
betoh32(hdr->ike_msgid),
print_host((struct sockaddr *)&msg->msg_peer, NULL, 0),
print_host((struct sockaddr *)&msg->msg_local, NULL, 0),
print_addr(&msg->msg_peer),
print_addr(&msg->msg_local),
ibuf_length(buf), isnatt ? ", NAT-T" : "");
if (isnatt) {
@ -1290,8 +1290,8 @@ ikev2_msg_retransmit_response(struct iked *env, struct iked_sa *sa,
SPI_SA(sa, NULL),
print_map(exchange, ikev2_exchange_map),
m->msg_msgid,
print_host((struct sockaddr *)&m->msg_local, NULL, 0),
print_host((struct sockaddr *)&m->msg_peer, NULL, 0));
print_addr(&m->msg_local),
print_addr(&m->msg_peer));
}
timer_add(env, &mr->mrt_timer, IKED_RESPONSE_TIMEOUT);
@ -1333,8 +1333,8 @@ ikev2_msg_retransmit_timeout(struct iked *env, void *arg)
"local %s", SPI_SA(sa, NULL), mr->mrt_tries + 1,
print_map(msg->msg_exchange, ikev2_exchange_map),
msg->msg_msgid,
print_host((struct sockaddr *)&msg->msg_peer, NULL, 0),
print_host((struct sockaddr *)&msg->msg_local, NULL, 0));
print_addr(&msg->msg_peer),
print_addr(&msg->msg_local));
}
/* Exponential timeout */
timer_add(env, &mr->mrt_timer,

View File

@ -1,4 +1,4 @@
/* $OpenBSD: pfkey.c,v 1.81 2022/07/22 15:33:53 tobhe Exp $ */
/* $OpenBSD: pfkey.c,v 1.82 2023/06/13 12:34:12 tb Exp $ */
/*
* Copyright (c) 2010-2013 Reyk Floeter <reyk@openbsd.org>
@ -1853,7 +1853,7 @@ pfkey_process(struct iked *env, struct pfkey_message *pm)
flow.flow_peer = &peer;
log_debug("%s: acquire request (peer %s)", __func__,
print_host(speer, NULL, 0));
print_addr(speer));
/* get the matching flow */
bzero(&smsg, sizeof(smsg));
@ -1992,9 +1992,9 @@ pfkey_process(struct iked *env, struct pfkey_message *pm)
log_debug("%s: flow %s from %s/%s to %s/%s via %s", __func__,
flow.flow_dir == IPSP_DIRECTION_IN ? "in" : "out",
print_host(ssrc, NULL, 0), print_host(smask, NULL, 0),
print_host(sdst, NULL, 0), print_host(dmask, NULL, 0),
print_host(speer, NULL, 0));
print_addr(ssrc), print_addr(smask),
print_addr(sdst), print_addr(dmask),
print_addr(speer));
ret = ikev2_child_sa_acquire(env, &flow);

View File

@ -1,4 +1,4 @@
/* $OpenBSD: policy.c,v 1.94 2023/05/23 13:12:19 claudio Exp $ */
/* $OpenBSD: policy.c,v 1.95 2023/06/13 12:34:12 tb Exp $ */
/*
* Copyright (c) 2020-2021 Tobias Heider <tobhe@openbsd.org>
@ -398,10 +398,8 @@ sa_state(struct iked *env, struct iked_sa *sa, int state)
case IKEV2_STATE_CLOSED:
log_debug("%s: %s -> %s from %s to %s policy '%s'",
SPI_SA(sa, __func__), a, b,
print_host((struct sockaddr *)&sa->sa_peer.addr,
NULL, 0),
print_host((struct sockaddr *)&sa->sa_local.addr,
NULL, 0),
print_addr(&sa->sa_peer.addr),
print_addr(&sa->sa_local.addr),
sa->sa_policy ? sa->sa_policy->pol_name :
"<unknown>");
break;

View File

@ -1,4 +1,4 @@
/* $OpenBSD: print.c,v 1.3 2021/10/26 17:31:22 tobhe Exp $ */
/* $OpenBSD: print.c,v 1.4 2023/06/13 12:34:12 tb Exp $ */
/*
* Copyright (c) 2019-2021 Tobias Heider <tobias.heider@stusta.de>
@ -112,9 +112,7 @@ print_policy(struct iked_policy *pol)
print_verbose(" rdomain %d", pol->pol_rdomain);
RB_FOREACH(flow, iked_flows, &pol->pol_flows) {
print_verbose(" from %s",
print_host((struct sockaddr *)&flow->flow_src.addr, NULL,
0));
print_verbose(" from %s", print_addr(&flow->flow_src.addr));
if (flow->flow_src.addr_af != AF_UNSPEC &&
flow->flow_src.addr_net)
print_verbose("/%d", flow->flow_src.addr_mask);
@ -122,9 +120,7 @@ print_policy(struct iked_policy *pol)
print_verbose(" port %d",
ntohs(flow->flow_src.addr_port));
print_verbose(" to %s",
print_host((struct sockaddr *)&flow->flow_dst.addr, NULL,
0));
print_verbose(" to %s", print_addr(&flow->flow_dst.addr));
if (flow->flow_dst.addr_af != AF_UNSPEC &&
flow->flow_dst.addr_net)
print_verbose("/%d", flow->flow_dst.addr_mask);
@ -134,16 +130,12 @@ print_policy(struct iked_policy *pol)
}
if ((pol->pol_flags & IKED_POLICY_DEFAULT) == 0) {
print_verbose(" local %s",
print_host((struct sockaddr *)&pol->pol_local.addr, NULL,
0));
print_verbose(" local %s", print_addr(&pol->pol_local.addr));
if (pol->pol_local.addr.ss_family != AF_UNSPEC &&
pol->pol_local.addr_net)
print_verbose("/%d", pol->pol_local.addr_mask);
print_verbose(" peer %s",
print_host((struct sockaddr *)&pol->pol_peer.addr, NULL,
0));
print_verbose(" peer %s", print_addr(&pol->pol_peer.addr));
if (pol->pol_peer.addr.ss_family != AF_UNSPEC &&
pol->pol_peer.addr_net)
print_verbose("/%d", pol->pol_peer.addr_mask);
@ -235,8 +227,7 @@ print_policy(struct iked_policy *pol)
cfg = &pol->pol_cfg[i];
print_verbose(" config %s %s", print_xf(cfg->cfg_type,
cfg->cfg.address.addr_af, cpxfs),
print_host((struct sockaddr *)&cfg->cfg.address.addr, NULL,
0));
print_addr(&cfg->cfg.address.addr));
}
if (pol->pol_iface != 0 && if_indextoname(pol->pol_iface, iface) != NULL)

View File

@ -1,4 +1,4 @@
/* $OpenBSD: util.c,v 1.40 2020/08/15 11:31:17 tobhe Exp $ */
/* $OpenBSD: util.c,v 1.41 2023/06/13 12:34:12 tb Exp $ */
/*
* Copyright (c) 2010-2013 Reyk Floeter <reyk@openbsd.org>
@ -669,6 +669,12 @@ print_host(struct sockaddr *sa, char *buf, size_t len)
return (buf);
}
const char *
print_addr(void *addr)
{
return print_host(addr, NULL, 0);
}
char *
get_string(uint8_t *ptr, size_t len)
{

View File

@ -1,4 +1,4 @@
/* $OpenBSD: vroute.c,v 1.18 2023/02/10 19:51:08 tobhe Exp $ */
/* $OpenBSD: vroute.c,v 1.19 2023/06/13 12:34:12 tb Exp $ */
/*
* Copyright (c) 2021 Tobias Heider <tobhe@openbsd.org>
@ -840,9 +840,9 @@ vroute_doroute(struct iked *env, int flags, int addrs, int rdomain, uint8_t type
flags & RTF_HOST ? "H" : "",
flags & RTF_GATEWAY ? "G" : "",
addrs,
addrs & RTA_DST ? print_host(dest, NULL, 0) : "<>",
addrs & RTA_NETMASK ? print_host(mask, NULL, 0) : "<>",
addrs & RTA_GATEWAY ? print_host(addr, NULL, 0) : "<>");
addrs & RTA_DST ? print_addr(dest) : "<>",
addrs & RTA_NETMASK ? print_addr(mask) : "<>",
addrs & RTA_GATEWAY ? print_addr(addr) : "<>");
if (writev(ivr->ivr_rtsock, iov, iovcnt) == -1) {
if ((type == RTM_ADD && errno != EEXIST) ||
@ -933,9 +933,7 @@ vroute_doaddr(struct iked *env, char *ifname, struct sockaddr *addr,
memcpy(&req.ifra_mask, mask, sizeof(req.ifra_addr));
log_debug("%s: %s inet %s netmask %s", __func__,
add ? "add" : "del",
print_host((struct sockaddr *)addr, NULL, 0),
print_host((struct sockaddr *)mask, NULL, 0));
add ? "add" : "del", print_addr(addr), print_addr(mask));
ioreq = add ? SIOCAIFADDR : SIOCDIFADDR;
if (ioctl(ivr->ivr_iosock, ioreq, &req) == -1) {
@ -955,9 +953,7 @@ vroute_doaddr(struct iked *env, char *ifname, struct sockaddr *addr,
sizeof(req6.ifra_prefixmask));
log_debug("%s: %s inet6 %s netmask %s", __func__,
add ? "add" : "del",
print_host((struct sockaddr *)addr, NULL, 0),
print_host((struct sockaddr *)mask, NULL, 0));
add ? "add" : "del", print_addr(addr), print_addr(mask));
ioreq = add ? SIOCAIFADDR_IN6 : SIOCDIFADDR_IN6;
if (ioctl(ivr->ivr_iosock6, ioreq, &req6) == -1) {

View File

@ -4596,7 +4596,11 @@ static int amdgpu_device_recover_vram(struct amdgpu_device *adev)
dev_info(adev->dev, "recover vram bo from shadow start\n");
mutex_lock(&adev->shadow_list_lock);
list_for_each_entry(vmbo, &adev->shadow_list, shadow_list) {
shadow = &vmbo->bo;
/* If vm is compute context or adev is APU, shadow will be NULL */
if (!vmbo->shadow)
continue;
shadow = vmbo->shadow;
/* No need to recover an evicted BO */
if (shadow->tbo.resource->mem_type != TTM_PL_TT ||
shadow->tbo.resource->start == AMDGPU_BO_INVALID_OFFSET ||

View File

@ -21,6 +21,8 @@
*
*/
#include <linux/firmware.h>
#include "amdgpu_mes.h"
#include "amdgpu.h"
#include "soc15_common.h"
@ -1423,3 +1425,60 @@ error_pasid:
kfree(vm);
return 0;
}
int amdgpu_mes_init_microcode(struct amdgpu_device *adev, int pipe)
{
const struct mes_firmware_header_v1_0 *mes_hdr;
struct amdgpu_firmware_info *info;
char ucode_prefix[30];
char fw_name[40];
int r;
amdgpu_ucode_ip_version_decode(adev, GC_HWIP, ucode_prefix, sizeof(ucode_prefix));
snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mes%s.bin",
ucode_prefix,
pipe == AMDGPU_MES_SCHED_PIPE ? "" : "1");
r = amdgpu_ucode_request(adev, &adev->mes.fw[pipe], fw_name);
if (r)
goto out;
mes_hdr = (const struct mes_firmware_header_v1_0 *)
adev->mes.fw[pipe]->data;
adev->mes.uc_start_addr[pipe] =
le32_to_cpu(mes_hdr->mes_uc_start_addr_lo) |
((uint64_t)(le32_to_cpu(mes_hdr->mes_uc_start_addr_hi)) << 32);
adev->mes.data_start_addr[pipe] =
le32_to_cpu(mes_hdr->mes_data_start_addr_lo) |
((uint64_t)(le32_to_cpu(mes_hdr->mes_data_start_addr_hi)) << 32);
if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
int ucode, ucode_data;
if (pipe == AMDGPU_MES_SCHED_PIPE) {
ucode = AMDGPU_UCODE_ID_CP_MES;
ucode_data = AMDGPU_UCODE_ID_CP_MES_DATA;
} else {
ucode = AMDGPU_UCODE_ID_CP_MES1;
ucode_data = AMDGPU_UCODE_ID_CP_MES1_DATA;
}
info = &adev->firmware.ucode[ucode];
info->ucode_id = ucode;
info->fw = adev->mes.fw[pipe];
adev->firmware.fw_size +=
roundup2(le32_to_cpu(mes_hdr->mes_ucode_size_bytes),
PAGE_SIZE);
info = &adev->firmware.ucode[ucode_data];
info->ucode_id = ucode_data;
info->fw = adev->mes.fw[pipe];
adev->firmware.fw_size +=
roundup2(le32_to_cpu(mes_hdr->mes_ucode_data_size_bytes),
PAGE_SIZE);
}
return 0;
out:
amdgpu_ucode_release(&adev->mes.fw[pipe]);
return r;
}

View File

@ -91,14 +91,12 @@ struct amdgpu_mes {
struct amdgpu_bo *ucode_fw_obj[AMDGPU_MAX_MES_PIPES];
uint64_t ucode_fw_gpu_addr[AMDGPU_MAX_MES_PIPES];
uint32_t *ucode_fw_ptr[AMDGPU_MAX_MES_PIPES];
uint32_t ucode_fw_version[AMDGPU_MAX_MES_PIPES];
uint64_t uc_start_addr[AMDGPU_MAX_MES_PIPES];
/* mes ucode data */
struct amdgpu_bo *data_fw_obj[AMDGPU_MAX_MES_PIPES];
uint64_t data_fw_gpu_addr[AMDGPU_MAX_MES_PIPES];
uint32_t *data_fw_ptr[AMDGPU_MAX_MES_PIPES];
uint32_t data_fw_version[AMDGPU_MAX_MES_PIPES];
uint64_t data_start_addr[AMDGPU_MAX_MES_PIPES];
/* eop gpu obj */
@ -310,6 +308,7 @@ struct amdgpu_mes_funcs {
int amdgpu_mes_ctx_get_offs(struct amdgpu_ring *ring, unsigned int id_offs);
int amdgpu_mes_init_microcode(struct amdgpu_device *adev, int pipe);
int amdgpu_mes_init(struct amdgpu_device *adev);
void amdgpu_mes_fini(struct amdgpu_device *adev);

View File

@ -41,6 +41,7 @@ static int amdgpu_sched_process_priority_override(struct amdgpu_device *adev,
#ifdef notyet
struct fd f = fdget(fd);
struct amdgpu_fpriv *fpriv;
struct amdgpu_ctx_mgr *mgr;
struct amdgpu_ctx *ctx;
uint32_t id;
int r;
@ -54,8 +55,11 @@ static int amdgpu_sched_process_priority_override(struct amdgpu_device *adev,
return r;
}
idr_for_each_entry(&fpriv->ctx_mgr.ctx_handles, ctx, id)
mgr = &fpriv->ctx_mgr;
mutex_lock(&mgr->lock);
idr_for_each_entry(&mgr->ctx_handles, ctx, id)
amdgpu_ctx_priority_override(ctx, priority);
mutex_unlock(&mgr->lock);
fdput(f);
return 0;

View File

@ -1095,3 +1095,39 @@ void amdgpu_ucode_ip_version_decode(struct amdgpu_device *adev, int block_type,
snprintf(ucode_prefix, len, "%s_%d_%d_%d", ip_name, maj, min, rev);
}
/*
* amdgpu_ucode_request - Fetch and validate amdgpu microcode
*
* @adev: amdgpu device
* @fw: pointer to load firmware to
* @fw_name: firmware to load
*
* This is a helper that will use request_firmware and amdgpu_ucode_validate
* to load and run basic validation on firmware. If the load fails, remap
* the error code to -ENODEV, so that early_init functions will fail to load.
*/
int amdgpu_ucode_request(struct amdgpu_device *adev, const struct firmware **fw,
const char *fw_name)
{
int err = request_firmware(fw, fw_name, adev->dev);
if (err)
return -ENODEV;
err = amdgpu_ucode_validate(*fw);
if (err)
dev_dbg(adev->dev, "\"%s\" failed to validate\n", fw_name);
return err;
}
/*
* amdgpu_ucode_release - Release firmware microcode
*
* @fw: pointer to firmware to release
*/
void amdgpu_ucode_release(const struct firmware **fw)
{
release_firmware(*fw);
*fw = NULL;
}

View File

@ -543,6 +543,9 @@ void amdgpu_ucode_print_sdma_hdr(const struct common_firmware_header *hdr);
void amdgpu_ucode_print_psp_hdr(const struct common_firmware_header *hdr);
void amdgpu_ucode_print_gpu_info_hdr(const struct common_firmware_header *hdr);
int amdgpu_ucode_validate(const struct firmware *fw);
int amdgpu_ucode_request(struct amdgpu_device *adev, const struct firmware **fw,
const char *fw_name);
void amdgpu_ucode_release(const struct firmware **fw);
bool amdgpu_ucode_hdr_version(union amdgpu_firmware_header *hdr,
uint16_t hdr_major, uint16_t hdr_minor);

View File

@ -3798,7 +3798,8 @@ static int gfx_v9_0_hw_fini(void *handle)
{
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
amdgpu_irq_put(adev, &adev->gfx.cp_ecc_error_irq, 0);
if (amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
amdgpu_irq_put(adev, &adev->gfx.cp_ecc_error_irq, 0);
amdgpu_irq_put(adev, &adev->gfx.priv_reg_irq, 0);
amdgpu_irq_put(adev, &adev->gfx.priv_inst_irq, 0);

View File

@ -1143,7 +1143,6 @@ static int gmc_v10_0_hw_fini(void *handle)
return 0;
}
amdgpu_irq_put(adev, &adev->gmc.ecc_irq, 0);
amdgpu_irq_put(adev, &adev->gmc.vm_fault, 0);
return 0;

View File

@ -932,7 +932,6 @@ static int gmc_v11_0_hw_fini(void *handle)
return 0;
}
amdgpu_irq_put(adev, &adev->gmc.ecc_irq, 0);
amdgpu_irq_put(adev, &adev->gmc.vm_fault, 0);
gmc_v11_0_gart_disable(adev);

View File

@ -1900,7 +1900,6 @@ static int gmc_v9_0_hw_fini(void *handle)
if (adev->mmhub.funcs->update_power_gating)
adev->mmhub.funcs->update_power_gating(adev, false);
amdgpu_irq_put(adev, &adev->gmc.ecc_irq, 0);
amdgpu_irq_put(adev, &adev->gmc.vm_fault, 0);
return 0;

View File

@ -54,6 +54,7 @@ static int jpeg_v3_0_early_init(void *handle)
switch (adev->ip_versions[UVD_HWIP][0]) {
case IP_VERSION(3, 1, 1):
case IP_VERSION(3, 1, 2):
break;
default:
harvest = RREG32_SOC15(JPEG, 0, mmCC_UVD_HARVESTING);

View File

@ -375,93 +375,6 @@ static const struct amdgpu_mes_funcs mes_v10_1_funcs = {
.resume_gang = mes_v10_1_resume_gang,
};
static int mes_v10_1_init_microcode(struct amdgpu_device *adev,
enum admgpu_mes_pipe pipe)
{
const char *chip_name;
char fw_name[30];
int err;
const struct mes_firmware_header_v1_0 *mes_hdr;
struct amdgpu_firmware_info *info;
switch (adev->ip_versions[GC_HWIP][0]) {
case IP_VERSION(10, 1, 10):
chip_name = "navi10";
break;
case IP_VERSION(10, 3, 0):
chip_name = "sienna_cichlid";
break;
default:
BUG();
}
if (pipe == AMDGPU_MES_SCHED_PIPE)
snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mes.bin",
chip_name);
else
snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mes1.bin",
chip_name);
err = request_firmware(&adev->mes.fw[pipe], fw_name, adev->dev);
if (err)
return err;
err = amdgpu_ucode_validate(adev->mes.fw[pipe]);
if (err) {
release_firmware(adev->mes.fw[pipe]);
adev->mes.fw[pipe] = NULL;
return err;
}
mes_hdr = (const struct mes_firmware_header_v1_0 *)
adev->mes.fw[pipe]->data;
adev->mes.ucode_fw_version[pipe] =
le32_to_cpu(mes_hdr->mes_ucode_version);
adev->mes.ucode_fw_version[pipe] =
le32_to_cpu(mes_hdr->mes_ucode_data_version);
adev->mes.uc_start_addr[pipe] =
le32_to_cpu(mes_hdr->mes_uc_start_addr_lo) |
((uint64_t)(le32_to_cpu(mes_hdr->mes_uc_start_addr_hi)) << 32);
adev->mes.data_start_addr[pipe] =
le32_to_cpu(mes_hdr->mes_data_start_addr_lo) |
((uint64_t)(le32_to_cpu(mes_hdr->mes_data_start_addr_hi)) << 32);
if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
int ucode, ucode_data;
if (pipe == AMDGPU_MES_SCHED_PIPE) {
ucode = AMDGPU_UCODE_ID_CP_MES;
ucode_data = AMDGPU_UCODE_ID_CP_MES_DATA;
} else {
ucode = AMDGPU_UCODE_ID_CP_MES1;
ucode_data = AMDGPU_UCODE_ID_CP_MES1_DATA;
}
info = &adev->firmware.ucode[ucode];
info->ucode_id = ucode;
info->fw = adev->mes.fw[pipe];
adev->firmware.fw_size +=
roundup2(le32_to_cpu(mes_hdr->mes_ucode_size_bytes),
PAGE_SIZE);
info = &adev->firmware.ucode[ucode_data];
info->ucode_id = ucode_data;
info->fw = adev->mes.fw[pipe];
adev->firmware.fw_size +=
roundup2(le32_to_cpu(mes_hdr->mes_ucode_data_size_bytes),
PAGE_SIZE);
}
return 0;
}
static void mes_v10_1_free_microcode(struct amdgpu_device *adev,
enum admgpu_mes_pipe pipe)
{
release_firmware(adev->mes.fw[pipe]);
adev->mes.fw[pipe] = NULL;
}
static int mes_v10_1_allocate_ucode_buffer(struct amdgpu_device *adev,
enum admgpu_mes_pipe pipe)
{
@ -1019,10 +932,6 @@ static int mes_v10_1_sw_init(void *handle)
if (!adev->enable_mes_kiq && pipe == AMDGPU_MES_KIQ_PIPE)
continue;
r = mes_v10_1_init_microcode(adev, pipe);
if (r)
return r;
r = mes_v10_1_allocate_eop_buf(adev, pipe);
if (r)
return r;
@ -1059,8 +968,7 @@ static int mes_v10_1_sw_fini(void *handle)
amdgpu_bo_free_kernel(&adev->mes.eop_gpu_obj[pipe],
&adev->mes.eop_gpu_addr[pipe],
NULL);
mes_v10_1_free_microcode(adev, pipe);
amdgpu_ucode_release(&adev->mes.fw[pipe]);
}
amdgpu_bo_free_kernel(&adev->gfx.kiq.ring.mqd_obj,
@ -1229,6 +1137,22 @@ static int mes_v10_1_resume(void *handle)
return amdgpu_mes_resume(adev);
}
static int mes_v10_0_early_init(void *handle)
{
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
int pipe, r;
for (pipe = 0; pipe < AMDGPU_MAX_MES_PIPES; pipe++) {
if (!adev->enable_mes_kiq && pipe == AMDGPU_MES_KIQ_PIPE)
continue;
r = amdgpu_mes_init_microcode(adev, pipe);
if (r)
return r;
}
return 0;
}
static int mes_v10_0_late_init(void *handle)
{
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
@ -1241,6 +1165,7 @@ static int mes_v10_0_late_init(void *handle)
static const struct amd_ip_funcs mes_v10_1_ip_funcs = {
.name = "mes_v10_1",
.early_init = mes_v10_0_early_init,
.late_init = mes_v10_0_late_init,
.sw_init = mes_v10_1_sw_init,
.sw_fini = mes_v10_1_sw_fini,

View File

@ -453,84 +453,6 @@ static const struct amdgpu_mes_funcs mes_v11_0_funcs = {
.misc_op = mes_v11_0_misc_op,
};
static int mes_v11_0_init_microcode(struct amdgpu_device *adev,
enum admgpu_mes_pipe pipe)
{
char fw_name[30];
char ucode_prefix[30];
int err;
const struct mes_firmware_header_v1_0 *mes_hdr;
struct amdgpu_firmware_info *info;
amdgpu_ucode_ip_version_decode(adev, GC_HWIP, ucode_prefix, sizeof(ucode_prefix));
if (pipe == AMDGPU_MES_SCHED_PIPE)
snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mes.bin",
ucode_prefix);
else
snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mes1.bin",
ucode_prefix);
err = request_firmware(&adev->mes.fw[pipe], fw_name, adev->dev);
if (err)
return err;
err = amdgpu_ucode_validate(adev->mes.fw[pipe]);
if (err) {
release_firmware(adev->mes.fw[pipe]);
adev->mes.fw[pipe] = NULL;
return err;
}
mes_hdr = (const struct mes_firmware_header_v1_0 *)
adev->mes.fw[pipe]->data;
adev->mes.ucode_fw_version[pipe] =
le32_to_cpu(mes_hdr->mes_ucode_version);
adev->mes.ucode_fw_version[pipe] =
le32_to_cpu(mes_hdr->mes_ucode_data_version);
adev->mes.uc_start_addr[pipe] =
le32_to_cpu(mes_hdr->mes_uc_start_addr_lo) |
((uint64_t)(le32_to_cpu(mes_hdr->mes_uc_start_addr_hi)) << 32);
adev->mes.data_start_addr[pipe] =
le32_to_cpu(mes_hdr->mes_data_start_addr_lo) |
((uint64_t)(le32_to_cpu(mes_hdr->mes_data_start_addr_hi)) << 32);
if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
int ucode, ucode_data;
if (pipe == AMDGPU_MES_SCHED_PIPE) {
ucode = AMDGPU_UCODE_ID_CP_MES;
ucode_data = AMDGPU_UCODE_ID_CP_MES_DATA;
} else {
ucode = AMDGPU_UCODE_ID_CP_MES1;
ucode_data = AMDGPU_UCODE_ID_CP_MES1_DATA;
}
info = &adev->firmware.ucode[ucode];
info->ucode_id = ucode;
info->fw = adev->mes.fw[pipe];
adev->firmware.fw_size +=
roundup2(le32_to_cpu(mes_hdr->mes_ucode_size_bytes),
PAGE_SIZE);
info = &adev->firmware.ucode[ucode_data];
info->ucode_id = ucode_data;
info->fw = adev->mes.fw[pipe];
adev->firmware.fw_size +=
roundup2(le32_to_cpu(mes_hdr->mes_ucode_data_size_bytes),
PAGE_SIZE);
}
return 0;
}
static void mes_v11_0_free_microcode(struct amdgpu_device *adev,
enum admgpu_mes_pipe pipe)
{
release_firmware(adev->mes.fw[pipe]);
adev->mes.fw[pipe] = NULL;
}
static int mes_v11_0_allocate_ucode_buffer(struct amdgpu_device *adev,
enum admgpu_mes_pipe pipe)
{
@ -1098,10 +1020,6 @@ static int mes_v11_0_sw_init(void *handle)
if (!adev->enable_mes_kiq && pipe == AMDGPU_MES_KIQ_PIPE)
continue;
r = mes_v11_0_init_microcode(adev, pipe);
if (r)
return r;
r = mes_v11_0_allocate_eop_buf(adev, pipe);
if (r)
return r;
@ -1138,8 +1056,7 @@ static int mes_v11_0_sw_fini(void *handle)
amdgpu_bo_free_kernel(&adev->mes.eop_gpu_obj[pipe],
&adev->mes.eop_gpu_addr[pipe],
NULL);
mes_v11_0_free_microcode(adev, pipe);
amdgpu_ucode_release(&adev->mes.fw[pipe]);
}
amdgpu_bo_free_kernel(&adev->gfx.kiq.ring.mqd_obj,
@ -1334,6 +1251,22 @@ static int mes_v11_0_resume(void *handle)
return amdgpu_mes_resume(adev);
}
static int mes_v11_0_early_init(void *handle)
{
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
int pipe, r;
for (pipe = 0; pipe < AMDGPU_MAX_MES_PIPES; pipe++) {
if (!adev->enable_mes_kiq && pipe == AMDGPU_MES_KIQ_PIPE)
continue;
r = amdgpu_mes_init_microcode(adev, pipe);
if (r)
return r;
}
return 0;
}
static int mes_v11_0_late_init(void *handle)
{
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
@ -1348,6 +1281,7 @@ static int mes_v11_0_late_init(void *handle)
static const struct amd_ip_funcs mes_v11_0_ip_funcs = {
.name = "mes_v11_0",
.early_init = mes_v11_0_early_init,
.late_init = mes_v11_0_late_init,
.sw_init = mes_v11_0_sw_init,
.sw_fini = mes_v11_0_sw_fini,

View File

@ -1941,9 +1941,11 @@ static int sdma_v4_0_hw_fini(void *handle)
return 0;
}
for (i = 0; i < adev->sdma.num_instances; i++) {
amdgpu_irq_put(adev, &adev->sdma.ecc_irq,
AMDGPU_SDMA_IRQ_INSTANCE0 + i);
if (amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__SDMA)) {
for (i = 0; i < adev->sdma.num_instances; i++) {
amdgpu_irq_put(adev, &adev->sdma.ecc_irq,
AMDGPU_SDMA_IRQ_INSTANCE0 + i);
}
}
sdma_v4_0_ctx_switch_enable(adev, false);

View File

@ -715,7 +715,7 @@ static int soc21_common_early_init(void *handle)
AMD_PG_SUPPORT_VCN_DPG |
AMD_PG_SUPPORT_GFX_PG |
AMD_PG_SUPPORT_JPEG;
adev->external_rev_id = adev->rev_id + 0x1;
adev->external_rev_id = adev->rev_id + 0x80;
break;
default:

View File

@ -39,6 +39,7 @@
#include "dc/dc_edid_parser.h"
#include "dc/dc_stat.h"
#include "amdgpu_dm_trace.h"
#include "dc/inc/dc_link_ddc.h"
#include "vid.h"
#include "amdgpu.h"
@ -2256,6 +2257,14 @@ static void s3_handle_mst(struct drm_device *dev, bool suspend)
if (suspend) {
drm_dp_mst_topology_mgr_suspend(mgr);
} else {
/* if extended timeout is supported in hardware,
* default to LTTPR timeout (3.2ms) first as a W/A for DP link layer
* CTS 4.2.1.1 regression introduced by CTS specs requirement update.
*/
dc_link_aux_try_to_configure_timeout(aconnector->dc_link->ddc, LINK_AUX_DEFAULT_LTTPR_TIMEOUT_PERIOD);
if (!dp_is_lttpr_present(aconnector->dc_link))
dc_link_aux_try_to_configure_timeout(aconnector->dc_link->ddc, LINK_AUX_DEFAULT_TIMEOUT_PERIOD);
ret = drm_dp_mst_topology_mgr_resume(mgr, true);
if (ret < 0) {
dm_helpers_dp_mst_stop_top_mgr(aconnector->dc_link->ctx,
@ -7588,6 +7597,13 @@ static void amdgpu_dm_commit_cursors(struct drm_atomic_state *state)
handle_cursor_update(plane, old_plane_state);
}
static inline uint32_t get_mem_type(struct drm_framebuffer *fb)
{
struct amdgpu_bo *abo = gem_to_amdgpu_bo(fb->obj[0]);
return abo->tbo.resource ? abo->tbo.resource->mem_type : 0;
}
static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
struct dc_state *dc_state,
struct drm_device *dev,
@ -7661,6 +7677,8 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
continue;
dc_plane = dm_new_plane_state->dc_state;
if (!dc_plane)
continue;
bundle->surface_updates[planes_count].surface = dc_plane;
if (new_pcrtc_state->color_mgmt_changed) {
@ -7705,11 +7723,13 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
/*
* Only allow immediate flips for fast updates that don't
* change FB pitch, DCC state, rotation or mirroing.
* change memory domain, FB pitch, DCC state, rotation or
* mirroring.
*/
bundle->flip_addrs[planes_count].flip_immediate =
crtc->state->async_flip &&
acrtc_state->update_type == UPDATE_TYPE_FAST;
acrtc_state->update_type == UPDATE_TYPE_FAST &&
get_mem_type(old_plane_state->fb) == get_mem_type(fb);
timestamp_ns = ktime_get_ns();
bundle->flip_addrs[planes_count].flip_timestamp_in_us = div_u64(timestamp_ns, 1000);
@ -9203,8 +9223,9 @@ static int dm_update_plane_state(struct dc *dc,
return -EINVAL;
}
if (dm_old_plane_state->dc_state)
dc_plane_state_release(dm_old_plane_state->dc_state);
dc_plane_state_release(dm_old_plane_state->dc_state);
dm_new_plane_state->dc_state = NULL;
*lock_and_validation_needed = true;
@ -9741,6 +9762,7 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
ret = compute_mst_dsc_configs_for_state(state, dm_state->context, vars);
if (ret) {
DRM_DEBUG_DRIVER("compute_mst_dsc_configs_for_state() failed\n");
ret = -EINVAL;
goto fail;
}

View File

@ -1368,6 +1368,7 @@ int pre_validate_dsc(struct drm_atomic_state *state,
ret = pre_compute_mst_dsc_configs_for_state(state, local_dc_state, vars);
if (ret != 0) {
DRM_INFO_ONCE("pre_compute_mst_dsc_configs_for_state() failed\n");
ret = -EINVAL;
goto clean_exit;
}

View File

@ -333,8 +333,8 @@ void dcn31_smu_set_zstate_support(struct clk_mgr_internal *clk_mgr, enum dcn_zst
(support == DCN_ZSTATE_SUPPORT_ALLOW_Z10_ONLY))
support = DCN_ZSTATE_SUPPORT_DISALLOW;
if (support == DCN_ZSTATE_SUPPORT_ALLOW_Z10_ONLY)
if (support == DCN_ZSTATE_SUPPORT_ALLOW_Z10_ONLY ||
support == DCN_ZSTATE_SUPPORT_ALLOW_Z8_Z10_ONLY)
param = 1;
else
param = 0;

View File

@ -349,8 +349,6 @@ void dcn314_smu_set_zstate_support(struct clk_mgr_internal *clk_mgr, enum dcn_zs
if (!clk_mgr->smu_present)
return;
// Arg[15:0] = 8/9/0 for Z8/Z9/disallow -> existing bits
// Arg[16] = Disallow Z9 -> new bit
switch (support) {
case DCN_ZSTATE_SUPPORT_ALLOW:
@ -369,6 +367,16 @@ void dcn314_smu_set_zstate_support(struct clk_mgr_internal *clk_mgr, enum dcn_zs
param = (1 << 10);
break;
case DCN_ZSTATE_SUPPORT_ALLOW_Z8_Z10_ONLY:
msg_id = VBIOSSMC_MSG_AllowZstatesEntry;
param = (1 << 10) | (1 << 8);
break;
case DCN_ZSTATE_SUPPORT_ALLOW_Z8_ONLY:
msg_id = VBIOSSMC_MSG_AllowZstatesEntry;
param = (1 << 8);
break;
default: //DCN_ZSTATE_SUPPORT_UNKNOWN
msg_id = VBIOSSMC_MSG_AllowZstatesEntry;
param = 0;

View File

@ -756,6 +756,8 @@ void dcn32_clk_mgr_construct(
struct pp_smu_funcs *pp_smu,
struct dccg *dccg)
{
struct clk_log_info log_info = {0};
clk_mgr->base.ctx = ctx;
clk_mgr->base.funcs = &dcn32_funcs;
if (ASICREV_IS_GC_11_0_2(clk_mgr->base.ctx->asic_id.hw_internal_rev)) {
@ -789,6 +791,7 @@ void dcn32_clk_mgr_construct(
clk_mgr->base.clks.ref_dtbclk_khz = 268750;
}
/* integer part is now VCO frequency in kHz */
clk_mgr->base.dentist_vco_freq_khz = dcn32_get_vco_frequency_from_reg(clk_mgr);
@ -796,6 +799,8 @@ void dcn32_clk_mgr_construct(
if (clk_mgr->base.dentist_vco_freq_khz == 0)
clk_mgr->base.dentist_vco_freq_khz = 4300000; /* Updated as per HW docs */
dcn32_dump_clk_registers(&clk_mgr->base.boot_snapshot, &clk_mgr->base, &log_info);
if (ctx->dc->debug.disable_dtb_ref_clk_switch &&
clk_mgr->base.clks.ref_dtbclk_khz != clk_mgr->base.boot_snapshot.dtbclk) {
clk_mgr->base.clks.ref_dtbclk_khz = clk_mgr->base.boot_snapshot.dtbclk;

View File

@ -3381,7 +3381,7 @@ bool dc_link_setup_psr(struct dc_link *link,
case FAMILY_YELLOW_CARP:
case AMDGPU_FAMILY_GC_10_3_6:
case AMDGPU_FAMILY_GC_11_0_1:
if (dc->debug.disable_z10)
if (dc->debug.disable_z10 || dc->debug.psr_skip_crtc_disable)
psr_context->psr_level.bits.SKIP_CRTC_DISABLE = true;
break;
default:

View File

@ -1707,6 +1707,9 @@ bool dc_remove_plane_from_context(
struct dc_stream_status *stream_status = NULL;
struct resource_pool *pool = dc->res_pool;
if (!plane_state)
return true;
for (i = 0; i < context->stream_count; i++)
if (context->streams[i] == stream) {
stream_status = &context->stream_status[i];

View File

@ -491,6 +491,8 @@ enum dcn_pwr_state {
enum dcn_zstate_support_state {
DCN_ZSTATE_SUPPORT_UNKNOWN,
DCN_ZSTATE_SUPPORT_ALLOW,
DCN_ZSTATE_SUPPORT_ALLOW_Z8_ONLY,
DCN_ZSTATE_SUPPORT_ALLOW_Z8_Z10_ONLY,
DCN_ZSTATE_SUPPORT_ALLOW_Z10_ONLY,
DCN_ZSTATE_SUPPORT_DISALLOW,
};
@ -764,7 +766,6 @@ struct dc_debug_options {
bool disable_mem_low_power;
bool pstate_enabled;
bool disable_dmcu;
bool disable_psr;
bool force_abm_enable;
bool disable_stereo_support;
bool vsr_support;
@ -780,6 +781,7 @@ struct dc_debug_options {
unsigned int force_odm_combine; //bit vector based on otg inst
unsigned int seamless_boot_odm_combine;
unsigned int force_odm_combine_4to1; //bit vector based on otg inst
int minimum_z8_residency_time;
bool disable_z9_mpc;
unsigned int force_fclk_khz;
bool enable_tri_buf;
@ -828,6 +830,7 @@ struct dc_debug_options {
int crb_alloc_policy_min_disp_count;
bool disable_z10;
bool enable_z9_disable_interface;
bool psr_skip_crtc_disable;
union dpia_debug_options dpia_debug;
bool disable_fixed_vs_aux_timeout_wa;
bool force_disable_subvp;

View File

@ -117,7 +117,7 @@ struct psr_settings {
* Add a struct dc_panel_config under dc_link
*/
struct dc_panel_config {
// extra panel power sequence parameters
/* extra panel power sequence parameters */
struct pps {
unsigned int extra_t3_ms;
unsigned int extra_t7_ms;
@ -127,13 +127,21 @@ struct dc_panel_config {
unsigned int extra_t12_ms;
unsigned int extra_post_OUI_ms;
} pps;
// ABM
/* PSR */
struct psr {
bool disable_psr;
bool disallow_psrsu;
bool rc_disable;
bool rc_allow_static_screen;
bool rc_allow_fullscreen_VPB;
} psr;
/* ABM */
struct varib {
unsigned int varibright_feature_enable;
unsigned int def_varibright_level;
unsigned int abm_config_setting;
} varib;
// edp DSC
/* edp DSC */
struct dsc {
bool disable_dsc_edp;
unsigned int force_dsc_edp_policy;

View File

@ -726,11 +726,15 @@ void dcn10_hubp_pg_control(
}
}
static void power_on_plane(
static void power_on_plane_resources(
struct dce_hwseq *hws,
int plane_id)
{
DC_LOGGER_INIT(hws->ctx->logger);
if (hws->funcs.dpp_root_clock_control)
hws->funcs.dpp_root_clock_control(hws, plane_id, true);
if (REG(DC_IP_REQUEST_CNTL)) {
REG_SET(DC_IP_REQUEST_CNTL, 0,
IP_REQUEST_EN, 1);
@ -1237,11 +1241,15 @@ void dcn10_plane_atomic_power_down(struct dc *dc,
hws->funcs.hubp_pg_control(hws, hubp->inst, false);
dpp->funcs->dpp_reset(dpp);
REG_SET(DC_IP_REQUEST_CNTL, 0,
IP_REQUEST_EN, 0);
DC_LOG_DEBUG(
"Power gated front end %d\n", hubp->inst);
}
if (hws->funcs.dpp_root_clock_control)
hws->funcs.dpp_root_clock_control(hws, dpp->inst, false);
}
/* disable HW used by plane.
@ -2450,7 +2458,7 @@ static void dcn10_enable_plane(
undo_DEGVIDCN10_253_wa(dc);
power_on_plane(dc->hwseq,
power_on_plane_resources(dc->hwseq,
pipe_ctx->plane_res.hubp->inst);
/* enable DCFCLK current DCHUB */
@ -3369,7 +3377,9 @@ static bool dcn10_can_pipe_disable_cursor(struct pipe_ctx *pipe_ctx)
for (test_pipe = pipe_ctx->top_pipe; test_pipe;
test_pipe = test_pipe->top_pipe) {
// Skip invisible layer and pipe-split plane on same layer
if (!test_pipe->plane_state->visible || test_pipe->plane_state->layer_index == cur_layer)
if (!test_pipe->plane_state ||
!test_pipe->plane_state->visible ||
test_pipe->plane_state->layer_index == cur_layer)
continue;
r2 = test_pipe->plane_res.scl_data.recout;

View File

@ -1087,11 +1087,15 @@ void dcn20_blank_pixel_data(
}
static void dcn20_power_on_plane(
static void dcn20_power_on_plane_resources(
struct dce_hwseq *hws,
struct pipe_ctx *pipe_ctx)
{
DC_LOGGER_INIT(hws->ctx->logger);
if (hws->funcs.dpp_root_clock_control)
hws->funcs.dpp_root_clock_control(hws, pipe_ctx->plane_res.dpp->inst, true);
if (REG(DC_IP_REQUEST_CNTL)) {
REG_SET(DC_IP_REQUEST_CNTL, 0,
IP_REQUEST_EN, 1);
@ -1115,7 +1119,7 @@ static void dcn20_enable_plane(struct dc *dc, struct pipe_ctx *pipe_ctx,
//if (dc->debug.sanity_checks) {
// dcn10_verify_allow_pstate_change_high(dc);
//}
dcn20_power_on_plane(dc->hwseq, pipe_ctx);
dcn20_power_on_plane_resources(dc->hwseq, pipe_ctx);
/* enable DCFCLK current DCHUB */
pipe_ctx->plane_res.hubp->funcs->hubp_clk_cntl(pipe_ctx->plane_res.hubp, true);

View File

@ -671,12 +671,15 @@ static const struct dc_debug_options debug_defaults_diags = {
.disable_pplib_wm_range = true,
.disable_stutter = true,
.disable_48mhz_pwrdwn = true,
.disable_psr = true,
.enable_tri_buf = true,
.use_max_lb = true
};
static const struct dc_panel_config panel_config_defaults = {
.psr = {
.disable_psr = false,
.disallow_psrsu = false,
},
.ilr = {
.optimize_edp_link_rate = true,
},

View File

@ -723,7 +723,6 @@ static const struct dc_debug_options debug_defaults_drv = {
.underflow_assert_delay_us = 0xFFFFFFFF,
.dwb_fi_phase = -1, // -1 = disable,
.dmub_command_table = true,
.disable_psr = false,
.use_max_lb = true,
.exit_idle_opt_for_cursor_updates = true
};
@ -742,11 +741,17 @@ static const struct dc_debug_options debug_defaults_diags = {
.scl_reset_length10 = true,
.dwb_fi_phase = -1, // -1 = disable
.dmub_command_table = true,
.disable_psr = true,
.enable_tri_buf = true,
.use_max_lb = true
};
static const struct dc_panel_config panel_config_defaults = {
.psr = {
.disable_psr = false,
.disallow_psrsu = false,
},
};
static void dcn30_dpp_destroy(struct dpp **dpp)
{
kfree(TO_DCN20_DPP(*dpp));
@ -2214,6 +2219,11 @@ void dcn30_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params
}
}
static void dcn30_get_panel_config_defaults(struct dc_panel_config *panel_config)
{
*panel_config = panel_config_defaults;
}
static const struct resource_funcs dcn30_res_pool_funcs = {
.destroy = dcn30_destroy_resource_pool,
.link_enc_create = dcn30_link_encoder_create,
@ -2233,6 +2243,7 @@ static const struct resource_funcs dcn30_res_pool_funcs = {
.release_post_bldn_3dlut = dcn30_release_post_bldn_3dlut,
.update_bw_bounding_box = dcn30_update_bw_bounding_box,
.patch_unknown_plane_state = dcn20_patch_unknown_plane_state,
.get_panel_config_defaults = dcn30_get_panel_config_defaults,
};
#define CTX ctx

View File

@ -112,10 +112,16 @@ static const struct dc_debug_options debug_defaults_diags = {
.dwb_fi_phase = -1, // -1 = disable
.dmub_command_table = true,
.enable_tri_buf = true,
.disable_psr = true,
.use_max_lb = true
};
static const struct dc_panel_config panel_config_defaults = {
.psr = {
.disable_psr = false,
.disallow_psrsu = false,
},
};
enum dcn302_clk_src_array_id {
DCN302_CLK_SRC_PLL0,
DCN302_CLK_SRC_PLL1,
@ -1132,6 +1138,11 @@ void dcn302_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_param
DC_FP_END();
}
static void dcn302_get_panel_config_defaults(struct dc_panel_config *panel_config)
{
*panel_config = panel_config_defaults;
}
static struct resource_funcs dcn302_res_pool_funcs = {
.destroy = dcn302_destroy_resource_pool,
.link_enc_create = dcn302_link_encoder_create,
@ -1151,6 +1162,7 @@ static struct resource_funcs dcn302_res_pool_funcs = {
.release_post_bldn_3dlut = dcn30_release_post_bldn_3dlut,
.update_bw_bounding_box = dcn302_update_bw_bounding_box,
.patch_unknown_plane_state = dcn20_patch_unknown_plane_state,
.get_panel_config_defaults = dcn302_get_panel_config_defaults,
};
static struct dc_cap_funcs cap_funcs = {

View File

@ -96,7 +96,13 @@ static const struct dc_debug_options debug_defaults_diags = {
.dwb_fi_phase = -1, // -1 = disable
.dmub_command_table = true,
.enable_tri_buf = true,
.disable_psr = true,
};
static const struct dc_panel_config panel_config_defaults = {
.psr = {
.disable_psr = false,
.disallow_psrsu = false,
},
};
enum dcn303_clk_src_array_id {
@ -1055,6 +1061,10 @@ static void dcn303_destroy_resource_pool(struct resource_pool **pool)
*pool = NULL;
}
static void dcn303_get_panel_config_defaults(struct dc_panel_config *panel_config)
{
*panel_config = panel_config_defaults;
}
void dcn303_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params)
{
@ -1082,6 +1092,7 @@ static struct resource_funcs dcn303_res_pool_funcs = {
.release_post_bldn_3dlut = dcn30_release_post_bldn_3dlut,
.update_bw_bounding_box = dcn303_update_bw_bounding_box,
.patch_unknown_plane_state = dcn20_patch_unknown_plane_state,
.get_panel_config_defaults = dcn303_get_panel_config_defaults,
};
static struct dc_cap_funcs cap_funcs = {

View File

@ -66,17 +66,8 @@ void dccg31_update_dpp_dto(struct dccg *dccg, int dpp_inst, int req_dppclk)
REG_UPDATE(DPPCLK_DTO_CTRL,
DPPCLK_DTO_ENABLE[dpp_inst], 1);
} else {
//DTO must be enabled to generate a 0Hz clock output
if (dccg->ctx->dc->debug.root_clock_optimization.bits.dpp) {
REG_UPDATE(DPPCLK_DTO_CTRL,
DPPCLK_DTO_ENABLE[dpp_inst], 1);
REG_SET_2(DPPCLK_DTO_PARAM[dpp_inst], 0,
DPPCLK0_DTO_PHASE, 0,
DPPCLK0_DTO_MODULO, 1);
} else {
REG_UPDATE(DPPCLK_DTO_CTRL,
DPPCLK_DTO_ENABLE[dpp_inst], 0);
}
REG_UPDATE(DPPCLK_DTO_CTRL,
DPPCLK_DTO_ENABLE[dpp_inst], 0);
}
dccg->pipe_dppclk_khz[dpp_inst] = req_dppclk;
}

View File

@ -911,6 +911,10 @@ static const struct dc_debug_options debug_defaults_diags = {
};
static const struct dc_panel_config panel_config_defaults = {
.psr = {
.disable_psr = false,
.disallow_psrsu = false,
},
.ilr = {
.optimize_edp_link_rate = true,
},

View File

@ -289,8 +289,31 @@ static void dccg314_set_valid_pixel_rate(
dccg314_set_dtbclk_dto(dccg, &dto_params);
}
static void dccg314_dpp_root_clock_control(
struct dccg *dccg,
unsigned int dpp_inst,
bool clock_on)
{
struct dcn_dccg *dccg_dcn = TO_DCN_DCCG(dccg);
if (clock_on) {
/* turn off the DTO and leave phase/modulo at max */
REG_UPDATE(DPPCLK_DTO_CTRL, DPPCLK_DTO_ENABLE[dpp_inst], 0);
REG_SET_2(DPPCLK_DTO_PARAM[dpp_inst], 0,
DPPCLK0_DTO_PHASE, 0xFF,
DPPCLK0_DTO_MODULO, 0xFF);
} else {
/* turn on the DTO to generate a 0hz clock */
REG_UPDATE(DPPCLK_DTO_CTRL, DPPCLK_DTO_ENABLE[dpp_inst], 1);
REG_SET_2(DPPCLK_DTO_PARAM[dpp_inst], 0,
DPPCLK0_DTO_PHASE, 0,
DPPCLK0_DTO_MODULO, 1);
}
}
static const struct dccg_funcs dccg314_funcs = {
.update_dpp_dto = dccg31_update_dpp_dto,
.dpp_root_clock_control = dccg314_dpp_root_clock_control,
.get_dccg_ref_freq = dccg31_get_dccg_ref_freq,
.dccg_init = dccg31_init,
.set_dpstreamclk = dccg314_set_dpstreamclk,

View File

@ -392,6 +392,16 @@ void dcn314_set_pixels_per_cycle(struct pipe_ctx *pipe_ctx)
pix_per_cycle);
}
void dcn314_dpp_root_clock_control(struct dce_hwseq *hws, unsigned int dpp_inst, bool clock_on)
{
if (!hws->ctx->dc->debug.root_clock_optimization.bits.dpp)
return;
if (hws->ctx->dc->res_pool->dccg->funcs->dpp_root_clock_control)
hws->ctx->dc->res_pool->dccg->funcs->dpp_root_clock_control(
hws->ctx->dc->res_pool->dccg, dpp_inst, clock_on);
}
void dcn314_hubp_pg_control(struct dce_hwseq *hws, unsigned int hubp_inst, bool power_on)
{
struct dc_context *ctx = hws->ctx;

View File

@ -43,4 +43,6 @@ void dcn314_set_pixels_per_cycle(struct pipe_ctx *pipe_ctx);
void dcn314_hubp_pg_control(struct dce_hwseq *hws, unsigned int hubp_inst, bool power_on);
void dcn314_dpp_root_clock_control(struct dce_hwseq *hws, unsigned int dpp_inst, bool clock_on);
#endif /* __DC_HWSS_DCN314_H__ */

View File

@ -137,6 +137,7 @@ static const struct hwseq_private_funcs dcn314_private_funcs = {
.plane_atomic_disable = dcn20_plane_atomic_disable,
.plane_atomic_power_down = dcn10_plane_atomic_power_down,
.enable_power_gating_plane = dcn314_enable_power_gating_plane,
.dpp_root_clock_control = dcn314_dpp_root_clock_control,
.hubp_pg_control = dcn314_hubp_pg_control,
.program_all_writeback_pipes_in_tree = dcn30_program_all_writeback_pipes_in_tree,
.update_odm = dcn314_update_odm,

View File

@ -884,6 +884,8 @@ 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,
.psr_skip_crtc_disable = true,
.disable_dmcu = true,
.force_abm_enable = false,
.timing_trace = false,
@ -940,6 +942,10 @@ static const struct dc_debug_options debug_defaults_diags = {
};
static const struct dc_panel_config panel_config_defaults = {
.psr = {
.disable_psr = false,
.disallow_psrsu = false,
},
.ilr = {
.optimize_edp_link_rate = true,
},

View File

@ -907,6 +907,10 @@ static const struct dc_debug_options debug_defaults_diags = {
};
static const struct dc_panel_config panel_config_defaults = {
.psr = {
.disable_psr = false,
.disallow_psrsu = false,
},
.ilr = {
.optimize_edp_link_rate = true,
},

View File

@ -906,6 +906,10 @@ static const struct dc_debug_options debug_defaults_diags = {
};
static const struct dc_panel_config panel_config_defaults = {
.psr = {
.disable_psr = false,
.disallow_psrsu = false,
},
.ilr = {
.optimize_edp_link_rate = true,
},

View File

@ -984,6 +984,7 @@ void dcn32_init_hw(struct dc *dc)
if (dc->ctx->dmub_srv) {
dc_dmub_srv_query_caps_cmd(dc->ctx->dmub_srv->dmub);
dc->caps.dmub_caps.psr = dc->ctx->dmub_srv->dmub->feature_caps.psr;
dc->caps.dmub_caps.mclk_sw = dc->ctx->dmub_srv->dmub->feature_caps.fw_assisted_mclk_switch;
}
/* Enable support for ODM and windowed MPO if policy flag is set */

View File

@ -1984,7 +1984,7 @@ int dcn32_populate_dml_pipes_from_context(
// In general cases we want to keep the dram clock change requirement
// (prefer configs that support MCLK switch). Only override to false
// for SubVP
if (subvp_in_use)
if (context->bw_ctx.bw.dcn.clk.fw_based_mclk_switching || subvp_in_use)
context->bw_ctx.dml.soc.dram_clock_change_requirement_final = false;
else
context->bw_ctx.dml.soc.dram_clock_change_requirement_final = true;
@ -2037,6 +2037,14 @@ static struct resource_funcs dcn32_res_pool_funcs = {
.remove_phantom_pipes = dcn32_remove_phantom_pipes,
};
static uint32_t read_pipe_fuses(struct dc_context *ctx)
{
uint32_t value = REG_READ(CC_DC_PIPE_DIS);
/* DCN32 support max 4 pipes */
value = value & 0xf;
return value;
}
static bool dcn32_resource_construct(
uint8_t num_virtual_links,
@ -2079,7 +2087,7 @@ static bool dcn32_resource_construct(
pool->base.res_cap = &res_cap_dcn32;
/* max number of pipes for ASIC before checking for pipe fuses */
num_pipes = pool->base.res_cap->num_timing_generator;
pipe_fuses = REG_READ(CC_DC_PIPE_DIS);
pipe_fuses = read_pipe_fuses(ctx);
for (i = 0; i < pool->base.res_cap->num_timing_generator; i++)
if (pipe_fuses & 1 << i)

View File

@ -1621,6 +1621,14 @@ static struct resource_funcs dcn321_res_pool_funcs = {
.remove_phantom_pipes = dcn32_remove_phantom_pipes,
};
static uint32_t read_pipe_fuses(struct dc_context *ctx)
{
uint32_t value = REG_READ(CC_DC_PIPE_DIS);
/* DCN321 support max 4 pipes */
value = value & 0xf;
return value;
}
static bool dcn321_resource_construct(
uint8_t num_virtual_links,
@ -1663,7 +1671,7 @@ static bool dcn321_resource_construct(
pool->base.res_cap = &res_cap_dcn321;
/* max number of pipes for ASIC before checking for pipe fuses */
num_pipes = pool->base.res_cap->num_timing_generator;
pipe_fuses = REG_READ(CC_DC_PIPE_DIS);
pipe_fuses = read_pipe_fuses(ctx);
for (i = 0; i < pool->base.res_cap->num_timing_generator; i++)
if (pipe_fuses & 1 << i)

View File

@ -963,6 +963,8 @@ static enum dcn_zstate_support_state decide_zstate_support(struct dc *dc, struc
* 2. single eDP, on link 0, 1 plane and stutter period > 5ms
* Z10 only cases:
* 1. single eDP, on link 0, 1 plane and stutter period >= 5ms
* Z8 cases:
* 1. stutter period sufficient
* Zstate not allowed cases:
* 1. Everything else
*/
@ -971,6 +973,9 @@ 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];
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;
if (dc_extended_blank_supported(dc)) {
for (i = 0; i < dc->res_pool->pipe_count; i++) {
@ -983,18 +988,20 @@ static enum dcn_zstate_support_state decide_zstate_support(struct dc *dc, struc
}
}
}
/* zstate only supported on PWRSEQ0 and when there's <2 planes*/
if (link->link_index != 0 || stream_status->plane_count > 1)
/* Don't support multi-plane configurations */
if (stream_status->plane_count > 1)
return DCN_ZSTATE_SUPPORT_DISALLOW;
if (context->bw_ctx.dml.vba.StutterPeriod > 5000.0 || optimized_min_dst_y_next_start_us > 5000)
if (is_pwrseq0 && (context->bw_ctx.dml.vba.StutterPeriod > 5000.0 || optimized_min_dst_y_next_start_us > 5000))
return DCN_ZSTATE_SUPPORT_ALLOW;
else if (link->psr_settings.psr_version == DC_PSR_VERSION_1 && !dc->debug.disable_psr)
return DCN_ZSTATE_SUPPORT_ALLOW_Z10_ONLY;
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;
else
return DCN_ZSTATE_SUPPORT_DISALLOW;
} else
return allow_z8 ? DCN_ZSTATE_SUPPORT_ALLOW_Z8_ONLY : DCN_ZSTATE_SUPPORT_DISALLOW;
} else {
return DCN_ZSTATE_SUPPORT_DISALLOW;
}
}
void dcn20_calculate_dlg_params(

View File

@ -368,7 +368,9 @@ void dcn30_fpu_update_soc_for_wm_a(struct dc *dc, struct dc_state *context)
dc_assert_fp_enabled();
if (dc->clk_mgr->bw_params->wm_table.nv_entries[WM_A].valid) {
context->bw_ctx.dml.soc.dram_clock_change_latency_us = dc->clk_mgr->bw_params->wm_table.nv_entries[WM_A].dml_input.pstate_latency_us;
if (!context->bw_ctx.bw.dcn.clk.fw_based_mclk_switching ||
context->bw_ctx.dml.soc.dram_clock_change_latency_us == 0)
context->bw_ctx.dml.soc.dram_clock_change_latency_us = dc->clk_mgr->bw_params->wm_table.nv_entries[WM_A].dml_input.pstate_latency_us;
context->bw_ctx.dml.soc.sr_enter_plus_exit_time_us = dc->clk_mgr->bw_params->wm_table.nv_entries[WM_A].dml_input.sr_enter_plus_exit_time_us;
context->bw_ctx.dml.soc.sr_exit_time_us = dc->clk_mgr->bw_params->wm_table.nv_entries[WM_A].dml_input.sr_exit_time_us;
}
@ -520,9 +522,21 @@ void dcn30_fpu_calculate_wm_and_dlg(
pipe_idx++;
}
DC_FP_START();
// WA: restrict FPO to use first non-strobe mode (NV24 BW issue)
if (context->bw_ctx.bw.dcn.clk.fw_based_mclk_switching &&
dc->dml.soc.num_chans <= 4 &&
context->bw_ctx.dml.vba.DRAMSpeed <= 1700 &&
context->bw_ctx.dml.vba.DRAMSpeed >= 1500) {
for (i = 0; i < dc->dml.soc.num_states; i++) {
if (dc->dml.soc.clock_limits[i].dram_speed_mts > 1700) {
context->bw_ctx.dml.vba.DRAMSpeed = dc->dml.soc.clock_limits[i].dram_speed_mts;
break;
}
}
}
dcn20_calculate_dlg_params(dc, context, pipes, pipe_cnt, vlevel);
DC_FP_END();
if (!pstate_en)
/* Restore full p-state latency */

View File

@ -148,8 +148,8 @@ struct _vcs_dpi_soc_bounding_box_st dcn3_14_soc = {
.num_states = 5,
.sr_exit_time_us = 16.5,
.sr_enter_plus_exit_time_us = 18.5,
.sr_exit_z8_time_us = 442.0,
.sr_enter_plus_exit_z8_time_us = 560.0,
.sr_exit_z8_time_us = 268.0,
.sr_enter_plus_exit_z8_time_us = 393.0,
.writeback_latency_us = 12.0,
.dram_channel_width_bytes = 4,
.round_trip_ping_latency_dcfclk_cycles = 106,

View File

@ -1200,9 +1200,7 @@ static void dcn32_full_validate_bw_helper(struct dc *dc,
}
} else {
// Most populate phantom DLG params before programming hardware / timing for phantom pipe
DC_FP_START();
dcn32_helper_populate_phantom_dlg_params(dc, context, pipes, *pipe_cnt);
DC_FP_END();
/* Call validate_apply_pipe_split flags after calling DML getters for
* phantom dlg params, or some of the VBA params indicating pipe split
@ -1503,11 +1501,8 @@ bool dcn32_internal_validate_bw(struct dc *dc,
dml_log_pipe_params(&context->bw_ctx.dml, pipes, pipe_cnt);
if (!fast_validate) {
DC_FP_START();
if (!fast_validate)
dcn32_full_validate_bw_helper(dc, context, pipes, &vlevel, split, merge, &pipe_cnt);
DC_FP_END();
}
if (fast_validate ||
(dc->debug.dml_disallow_alternate_prefetch_modes &&
@ -2172,9 +2167,7 @@ static int build_synthetic_soc_states(struct clk_bw_params *bw_params,
entry.fabricclk_mhz = 0;
entry.dram_speed_mts = 0;
DC_FP_START();
insert_entry_into_table_sorted(table, num_entries, &entry);
DC_FP_END();
}
// Insert the max DCFCLK
@ -2182,9 +2175,7 @@ static int build_synthetic_soc_states(struct clk_bw_params *bw_params,
entry.fabricclk_mhz = 0;
entry.dram_speed_mts = 0;
DC_FP_START();
insert_entry_into_table_sorted(table, num_entries, &entry);
DC_FP_END();
// Insert the UCLK DPMS
for (i = 0; i < num_uclk_dpms; i++) {
@ -2192,9 +2183,7 @@ static int build_synthetic_soc_states(struct clk_bw_params *bw_params,
entry.fabricclk_mhz = 0;
entry.dram_speed_mts = bw_params->clk_table.entries[i].memclk_mhz * 16;
DC_FP_START();
insert_entry_into_table_sorted(table, num_entries, &entry);
DC_FP_END();
}
// If FCLK is coarse grained, insert individual DPMs.
@ -2204,9 +2193,7 @@ static int build_synthetic_soc_states(struct clk_bw_params *bw_params,
entry.fabricclk_mhz = bw_params->clk_table.entries[i].fclk_mhz;
entry.dram_speed_mts = 0;
DC_FP_START();
insert_entry_into_table_sorted(table, num_entries, &entry);
DC_FP_END();
}
}
// If FCLK fine grained, only insert max
@ -2215,9 +2202,7 @@ static int build_synthetic_soc_states(struct clk_bw_params *bw_params,
entry.fabricclk_mhz = max_fclk_mhz;
entry.dram_speed_mts = 0;
DC_FP_START();
insert_entry_into_table_sorted(table, num_entries, &entry);
DC_FP_END();
}
// At this point, the table contains all "points of interest" based on

View File

@ -807,7 +807,8 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
v->SwathHeightY[k],
v->SwathHeightC[k],
TWait,
v->DRAMSpeedPerState[mode_lib->vba.VoltageLevel] <= MEM_STROBE_FREQ_MHZ ?
(v->DRAMSpeedPerState[mode_lib->vba.VoltageLevel] <= MEM_STROBE_FREQ_MHZ ||
v->DCFCLKPerState[mode_lib->vba.VoltageLevel] <= MIN_DCFCLK_FREQ_MHZ) ?
mode_lib->vba.ip.min_prefetch_in_strobe_us : 0,
/* Output */
&v->DSTXAfterScaler[k],
@ -3288,7 +3289,7 @@ void dml32_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l
v->swath_width_chroma_ub_this_state[k],
v->SwathHeightYThisState[k],
v->SwathHeightCThisState[k], v->TWait,
v->DRAMSpeedPerState[i] <= MEM_STROBE_FREQ_MHZ ?
(v->DRAMSpeedPerState[i] <= MEM_STROBE_FREQ_MHZ || v->DCFCLKState[i][j] <= MIN_DCFCLK_FREQ_MHZ) ?
mode_lib->vba.ip.min_prefetch_in_strobe_us : 0,
/* Output */

View File

@ -52,6 +52,7 @@
#define BPP_BLENDED_PIPE 0xffffffff
#define MEM_STROBE_FREQ_MHZ 1600
#define MIN_DCFCLK_FREQ_MHZ 200
#define MEM_STROBE_MAX_DELIVERY_TIME_US 60.0
struct display_mode_lib;

View File

@ -106,16 +106,16 @@ struct _vcs_dpi_soc_bounding_box_st dcn3_21_soc = {
.clock_limits = {
{
.state = 0,
.dcfclk_mhz = 1564.0,
.fabricclk_mhz = 400.0,
.dispclk_mhz = 2150.0,
.dppclk_mhz = 2150.0,
.dcfclk_mhz = 1434.0,
.fabricclk_mhz = 2250.0,
.dispclk_mhz = 1720.0,
.dppclk_mhz = 1720.0,
.phyclk_mhz = 810.0,
.phyclk_d18_mhz = 667.0,
.phyclk_d32_mhz = 625.0,
.phyclk_d32_mhz = 313.0,
.socclk_mhz = 1200.0,
.dscclk_mhz = 716.667,
.dram_speed_mts = 1600.0,
.dscclk_mhz = 573.333,
.dram_speed_mts = 16000.0,
.dtbclk_mhz = 1564.0,
},
},
@ -125,14 +125,14 @@ struct _vcs_dpi_soc_bounding_box_st dcn3_21_soc = {
.sr_exit_z8_time_us = 285.0,
.sr_enter_plus_exit_z8_time_us = 320,
.writeback_latency_us = 12.0,
.round_trip_ping_latency_dcfclk_cycles = 263,
.round_trip_ping_latency_dcfclk_cycles = 207,
.urgent_latency_pixel_data_only_us = 4,
.urgent_latency_pixel_mixed_with_vm_data_us = 4,
.urgent_latency_vm_data_only_us = 4,
.fclk_change_latency_us = 20,
.usr_retraining_latency_us = 2,
.smn_latency_us = 2,
.mall_allocated_for_dcn_mbytes = 64,
.fclk_change_latency_us = 7,
.usr_retraining_latency_us = 0,
.smn_latency_us = 0,
.mall_allocated_for_dcn_mbytes = 32,
.urgent_out_of_order_return_per_channel_pixel_only_bytes = 4096,
.urgent_out_of_order_return_per_channel_pixel_and_vm_bytes = 4096,
.urgent_out_of_order_return_per_channel_vm_only_bytes = 4096,

View File

@ -148,18 +148,21 @@ struct dccg_funcs {
struct dccg *dccg,
int inst);
void (*set_pixel_rate_div)(
struct dccg *dccg,
uint32_t otg_inst,
enum pixel_rate_div k1,
enum pixel_rate_div k2);
void (*set_pixel_rate_div)(struct dccg *dccg,
uint32_t otg_inst,
enum pixel_rate_div k1,
enum pixel_rate_div k2);
void (*set_valid_pixel_rate)(
struct dccg *dccg,
int ref_dtbclk_khz,
int otg_inst,
int pixclk_khz);
void (*set_valid_pixel_rate)(
struct dccg *dccg,
int ref_dtbclk_khz,
int otg_inst,
int pixclk_khz);
void (*dpp_root_clock_control)(
struct dccg *dccg,
unsigned int dpp_inst,
bool clock_on);
};
#endif //__DAL_DCCG_H__

View File

@ -115,6 +115,10 @@ struct hwseq_private_funcs {
void (*plane_atomic_disable)(struct dc *dc, struct pipe_ctx *pipe_ctx);
void (*enable_power_gating_plane)(struct dce_hwseq *hws,
bool enable);
void (*dpp_root_clock_control)(
struct dce_hwseq *hws,
unsigned int dpp_inst,
bool clock_on);
void (*dpp_pg_control)(struct dce_hwseq *hws,
unsigned int dpp_inst,
bool power_on);

View File

@ -130,12 +130,13 @@ void dmub_dcn32_reset(struct dmub_srv *dmub)
REG_WRITE(DMCUB_INBOX1_WPTR, 0);
REG_WRITE(DMCUB_OUTBOX1_RPTR, 0);
REG_WRITE(DMCUB_OUTBOX1_WPTR, 0);
REG_WRITE(DMCUB_OUTBOX0_RPTR, 0);
REG_WRITE(DMCUB_OUTBOX0_WPTR, 0);
REG_WRITE(DMCUB_SCRATCH0, 0);
}
void dmub_dcn32_reset_release(struct dmub_srv *dmub)
{
REG_WRITE(DMCUB_GPINT_DATAIN1, 0);
REG_UPDATE(MMHUBBUB_SOFT_RESET, DMUIF_SOFT_RESET, 0);
REG_WRITE(DMCUB_SCRATCH15, dmub->psp_version & 0x001100FF);
REG_UPDATE_2(DMCUB_CNTL, DMCUB_ENABLE, 1, DMCUB_TRACEPORT_EN, 1);

View File

@ -36,6 +36,8 @@
#define amdgpu_dpm_enable_bapm(adev, e) \
((adev)->powerplay.pp_funcs->enable_bapm((adev)->powerplay.pp_handle, (e)))
#define amdgpu_dpm_is_legacy_dpm(adev) ((adev)->powerplay.pp_handle == (adev))
int amdgpu_dpm_get_sclk(struct amdgpu_device *adev, bool low)
{
const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
@ -1414,15 +1416,24 @@ int amdgpu_dpm_get_smu_prv_buf_details(struct amdgpu_device *adev,
int amdgpu_dpm_is_overdrive_supported(struct amdgpu_device *adev)
{
struct pp_hwmgr *hwmgr = adev->powerplay.pp_handle;
struct smu_context *smu = adev->powerplay.pp_handle;
if (is_support_sw_smu(adev)) {
struct smu_context *smu = adev->powerplay.pp_handle;
if ((is_support_sw_smu(adev) && smu->od_enabled) ||
(is_support_sw_smu(adev) && smu->is_apu) ||
(!is_support_sw_smu(adev) && hwmgr->od_enabled))
return true;
return (smu->od_enabled || smu->is_apu);
} else {
struct pp_hwmgr *hwmgr;
return false;
/*
* dpm on some legacy asics don't carry od_enabled member
* as its pp_handle is casted directly from adev.
*/
if (amdgpu_dpm_is_legacy_dpm(adev))
return false;
hwmgr = (struct pp_hwmgr *)adev->powerplay.pp_handle;
return hwmgr->od_enabled;
}
}
int amdgpu_dpm_set_pp_table(struct amdgpu_device *adev,

View File

@ -1210,7 +1210,7 @@ static void gen11_dsi_powerup_panel(struct intel_encoder *encoder)
/* panel power on related mipi dsi vbt sequences */
intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_POWER_ON);
intel_dsi_msleep(intel_dsi, intel_dsi->panel_on_delay);
drm_msleep(intel_dsi->panel_on_delay);
intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_DEASSERT_RESET);
intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_INIT_OTP);
intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_DISPLAY_ON);

View File

@ -776,17 +776,6 @@ void intel_dsi_vbt_exec_sequence(struct intel_dsi *intel_dsi,
#endif
}
void intel_dsi_msleep(struct intel_dsi *intel_dsi, int msec)
{
struct intel_connector *connector = intel_dsi->attached_connector;
/* For v3 VBTs in vid-mode the delays are part of the VBT sequences */
if (is_vid_mode(intel_dsi) && connector->panel.vbt.dsi.seq_version >= 3)
return;
drm_msleep(msec);
}
void intel_dsi_log_params(struct intel_dsi *intel_dsi)
{
struct drm_i915_private *i915 = to_i915(intel_dsi->base.base.dev);

View File

@ -16,7 +16,6 @@ void intel_dsi_vbt_gpio_init(struct intel_dsi *intel_dsi, bool panel_is_on);
void intel_dsi_vbt_gpio_cleanup(struct intel_dsi *intel_dsi);
void intel_dsi_vbt_exec_sequence(struct intel_dsi *intel_dsi,
enum mipi_seq seq_id);
void intel_dsi_msleep(struct intel_dsi *intel_dsi, int msec);
void intel_dsi_log_params(struct intel_dsi *intel_dsi);
#endif /* __INTEL_DSI_VBT_H__ */

View File

@ -85,6 +85,10 @@ static u16 skl_scaler_calc_phase(int sub, int scale, bool chroma_cosited)
#define ICL_MAX_SRC_H 4096
#define ICL_MAX_DST_W 5120
#define ICL_MAX_DST_H 4096
#define MTL_MAX_SRC_W 4096
#define MTL_MAX_SRC_H 8192
#define MTL_MAX_DST_W 8192
#define MTL_MAX_DST_H 8192
#define SKL_MIN_YUV_420_SRC_W 16
#define SKL_MIN_YUV_420_SRC_H 16
@ -101,6 +105,10 @@ skl_update_scaler(struct intel_crtc_state *crtc_state, bool force_detach,
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
const struct drm_display_mode *adjusted_mode =
&crtc_state->hw.adjusted_mode;
int pipe_src_w = drm_rect_width(&crtc_state->pipe_src);
int pipe_src_h = drm_rect_height(&crtc_state->pipe_src);
int min_src_w, min_src_h, min_dst_w, min_dst_h;
int max_src_w, max_src_h, max_dst_w, max_dst_h;
/*
* Src coordinates are already rotated by 270 degrees for
@ -155,15 +163,33 @@ skl_update_scaler(struct intel_crtc_state *crtc_state, bool force_detach,
return -EINVAL;
}
min_src_w = SKL_MIN_SRC_W;
min_src_h = SKL_MIN_SRC_H;
min_dst_w = SKL_MIN_DST_W;
min_dst_h = SKL_MIN_DST_H;
if (DISPLAY_VER(dev_priv) < 11) {
max_src_w = SKL_MAX_SRC_W;
max_src_h = SKL_MAX_SRC_H;
max_dst_w = SKL_MAX_DST_W;
max_dst_h = SKL_MAX_DST_H;
} else if (DISPLAY_VER(dev_priv) < 14) {
max_src_w = ICL_MAX_SRC_W;
max_src_h = ICL_MAX_SRC_H;
max_dst_w = ICL_MAX_DST_W;
max_dst_h = ICL_MAX_DST_H;
} else {
max_src_w = MTL_MAX_SRC_W;
max_src_h = MTL_MAX_SRC_H;
max_dst_w = MTL_MAX_DST_W;
max_dst_h = MTL_MAX_DST_H;
}
/* range checks */
if (src_w < SKL_MIN_SRC_W || src_h < SKL_MIN_SRC_H ||
dst_w < SKL_MIN_DST_W || dst_h < SKL_MIN_DST_H ||
(DISPLAY_VER(dev_priv) >= 11 &&
(src_w > ICL_MAX_SRC_W || src_h > ICL_MAX_SRC_H ||
dst_w > ICL_MAX_DST_W || dst_h > ICL_MAX_DST_H)) ||
(DISPLAY_VER(dev_priv) < 11 &&
(src_w > SKL_MAX_SRC_W || src_h > SKL_MAX_SRC_H ||
dst_w > SKL_MAX_DST_W || dst_h > SKL_MAX_DST_H))) {
if (src_w < min_src_w || src_h < min_src_h ||
dst_w < min_dst_w || dst_h < min_dst_h ||
src_w > max_src_w || src_h > max_src_h ||
dst_w > max_dst_w || dst_h > max_dst_h) {
drm_dbg_kms(&dev_priv->drm,
"scaler_user index %u.%u: src %ux%u dst %ux%u "
"size is out of scaler range\n",
@ -172,6 +198,21 @@ skl_update_scaler(struct intel_crtc_state *crtc_state, bool force_detach,
return -EINVAL;
}
/*
* The pipe scaler does not use all the bits of PIPESRC, at least
* on the earlier platforms. So even when we're scaling a plane
* the *pipe* source size must not be too large. For simplicity
* we assume the limits match the scaler source size limits. Might
* not be 100% accurate on all platforms, but good enough for now.
*/
if (pipe_src_w > max_src_w || pipe_src_h > max_src_h) {
drm_dbg_kms(&dev_priv->drm,
"scaler_user index %u.%u: pipe src size %ux%u "
"is out of scaler range\n",
crtc->pipe, scaler_user, pipe_src_w, pipe_src_h);
return -EINVAL;
}
/* mark this plane as a scaler user in crtc_state */
scaler_state->scaler_users |= (1 << scaler_user);
drm_dbg_kms(&dev_priv->drm, "scaler_user index %u.%u: "

View File

@ -782,7 +782,6 @@ static void intel_dsi_pre_enable(struct intel_atomic_state *state,
{
struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
struct intel_connector *connector = to_intel_connector(conn_state->connector);
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
enum pipe pipe = crtc->pipe;
enum port port;
@ -830,21 +829,10 @@ static void intel_dsi_pre_enable(struct intel_atomic_state *state,
if (!IS_GEMINILAKE(dev_priv))
intel_dsi_prepare(encoder, pipe_config);
/* Give the panel time to power-on and then deassert its reset */
intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_POWER_ON);
/*
* Give the panel time to power-on and then deassert its reset.
* Depending on the VBT MIPI sequences version the deassert-seq
* may contain the necessary delay, intel_dsi_msleep() will skip
* the delay in that case. If there is no deassert-seq, then an
* unconditional msleep is used to give the panel time to power-on.
*/
if (connector->panel.vbt.dsi.sequence[MIPI_SEQ_DEASSERT_RESET]) {
intel_dsi_msleep(intel_dsi, intel_dsi->panel_on_delay);
intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_DEASSERT_RESET);
} else {
drm_msleep(intel_dsi->panel_on_delay);
}
drm_msleep(intel_dsi->panel_on_delay);
intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_DEASSERT_RESET);
if (IS_GEMINILAKE(dev_priv)) {
glk_cold_boot = glk_dsi_enable_io(encoder);
@ -878,7 +866,7 @@ static void intel_dsi_pre_enable(struct intel_atomic_state *state,
drm_msleep(20); /* XXX */
for_each_dsi_port(port, intel_dsi->ports)
dpi_send_cmd(intel_dsi, TURN_ON, false, port);
intel_dsi_msleep(intel_dsi, 100);
drm_msleep(100);
intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_DISPLAY_ON);
@ -1006,7 +994,7 @@ static void intel_dsi_post_disable(struct intel_atomic_state *state,
/* Assert reset */
intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_ASSERT_RESET);
intel_dsi_msleep(intel_dsi, intel_dsi->panel_off_delay);
drm_msleep(intel_dsi->panel_off_delay);
intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_POWER_OFF);
intel_dsi->panel_power_off_time = ktime_get_boottime();

View File

@ -1133,6 +1133,8 @@ static const struct intel_gt_definition xelpmp_extra_gt[] = {
static const struct intel_device_info mtl_info = {
XE_HP_FEATURES,
XE_LPDP_FEATURES,
.__runtime.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) |
BIT(TRANSCODER_C) | BIT(TRANSCODER_D),
/*
* Real graphics IP version will be obtained from hardware GMD_ID
* register. Value provided here is just for sanity checking.

View File

@ -7840,8 +7840,8 @@ enum skl_power_gate {
#define _PLANE_CSC_RY_GY_1(pipe) _PIPE(pipe, _PLANE_CSC_RY_GY_1_A, \
_PLANE_CSC_RY_GY_1_B)
#define _PLANE_CSC_RY_GY_2(pipe) _PIPE(pipe, _PLANE_INPUT_CSC_RY_GY_2_A, \
_PLANE_INPUT_CSC_RY_GY_2_B)
#define _PLANE_CSC_RY_GY_2(pipe) _PIPE(pipe, _PLANE_CSC_RY_GY_2_A, \
_PLANE_CSC_RY_GY_2_B)
#define PLANE_CSC_COEFF(pipe, plane, index) _MMIO_PLANE(plane, \
_PLANE_CSC_RY_GY_1(pipe) + (index) * 4, \
_PLANE_CSC_RY_GY_2(pipe) + (index) * 4)

View File

@ -240,6 +240,8 @@
#define DP_DSC_SUPPORT 0x060 /* DP 1.4 */
# define DP_DSC_DECOMPRESSION_IS_SUPPORTED (1 << 0)
# define DP_DSC_PASSTHROUGH_IS_SUPPORTED (1 << 1)
# define DP_DSC_DYNAMIC_PPS_UPDATE_SUPPORT_COMP_TO_COMP (1 << 2)
# define DP_DSC_DYNAMIC_PPS_UPDATE_SUPPORT_UNCOMP_TO_COMP (1 << 3)
#define DP_DSC_REV 0x061
# define DP_DSC_MAJOR_MASK (0xf << 0)
@ -278,12 +280,14 @@
#define DP_DSC_BLK_PREDICTION_SUPPORT 0x066
# define DP_DSC_BLK_PREDICTION_IS_SUPPORTED (1 << 0)
# define DP_DSC_RGB_COLOR_CONV_BYPASS_SUPPORT (1 << 1)
#define DP_DSC_MAX_BITS_PER_PIXEL_LOW 0x067 /* eDP 1.4 */
#define DP_DSC_MAX_BITS_PER_PIXEL_HI 0x068 /* eDP 1.4 */
# define DP_DSC_MAX_BITS_PER_PIXEL_HI_MASK (0x3 << 0)
# define DP_DSC_MAX_BITS_PER_PIXEL_HI_SHIFT 8
# define DP_DSC_MAX_BPP_DELTA_VERSION_MASK (0x3 << 5) /* eDP 1.5 & DP 2.0 */
# define DP_DSC_MAX_BPP_DELTA_AVAILABILITY (1 << 7) /* eDP 1.5 & DP 2.0 */
#define DP_DSC_DEC_COLOR_FORMAT_CAP 0x069
# define DP_DSC_RGB (1 << 0)
@ -345,11 +349,13 @@
# define DP_DSC_24_PER_DP_DSC_SINK (1 << 2)
#define DP_DSC_BITS_PER_PIXEL_INC 0x06F
# define DP_DSC_RGB_YCbCr444_MAX_BPP_DELTA_MASK 0x1f
# define DP_DSC_RGB_YCbCr420_MAX_BPP_DELTA_MASK 0xe0
# define DP_DSC_BITS_PER_PIXEL_1_16 0x0
# define DP_DSC_BITS_PER_PIXEL_1_8 0x1
# define DP_DSC_BITS_PER_PIXEL_1_4 0x2
# define DP_DSC_BITS_PER_PIXEL_1_2 0x3
# define DP_DSC_BITS_PER_PIXEL_1 0x4
# define DP_DSC_BITS_PER_PIXEL_1_1 0x4
#define DP_PSR_SUPPORT 0x070 /* XXX 1.2? */
# define DP_PSR_IS_SUPPORTED 1

View File

@ -181,9 +181,8 @@ static inline u16
drm_edp_dsc_sink_output_bpp(const u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE])
{
return dsc_dpcd[DP_DSC_MAX_BITS_PER_PIXEL_LOW - DP_DSC_SUPPORT] |
(dsc_dpcd[DP_DSC_MAX_BITS_PER_PIXEL_HI - DP_DSC_SUPPORT] &
DP_DSC_MAX_BITS_PER_PIXEL_HI_MASK <<
DP_DSC_MAX_BITS_PER_PIXEL_HI_SHIFT);
((dsc_dpcd[DP_DSC_MAX_BITS_PER_PIXEL_HI - DP_DSC_SUPPORT] &
DP_DSC_MAX_BITS_PER_PIXEL_HI_MASK) << 8);
}
static inline u32

View File

@ -1,4 +1,4 @@
$OpenBSD: pcidevs,v 1.2038 2023/06/12 01:12:33 jsg Exp $
$OpenBSD: pcidevs,v 1.2039 2023/06/13 02:43:39 jcs Exp $
/* $NetBSD: pcidevs,v 1.30 1997/06/24 06:20:24 thorpej Exp $ */
/*
@ -8632,6 +8632,7 @@ product SANDISK PCSN520_2 0x5004 PC SN520
product SANDISK WDSXXXG3X0C 0x5006 WD Black NVMe
product SANDISK PCSN530 0x5008 PC SN530
product SANDISK SN850 0x5011 SN850
product SANDISK PCSN740 0x5015 PC SN740
/* Sangoma products */
product SANGOMA A10X 0x0300 A10x

View File

@ -2,7 +2,7 @@
* THIS FILE AUTOMATICALLY GENERATED. DO NOT EDIT.
*
* generated from:
* OpenBSD: pcidevs,v 1.2038 2023/06/12 01:12:33 jsg Exp
* OpenBSD: pcidevs,v 1.2039 2023/06/13 02:43:39 jcs Exp
*/
/* $NetBSD: pcidevs,v 1.30 1997/06/24 06:20:24 thorpej Exp $ */
@ -8637,6 +8637,7 @@
#define PCI_PRODUCT_SANDISK_WDSXXXG3X0C 0x5006 /* WD Black NVMe */
#define PCI_PRODUCT_SANDISK_PCSN530 0x5008 /* PC SN530 */
#define PCI_PRODUCT_SANDISK_SN850 0x5011 /* SN850 */
#define PCI_PRODUCT_SANDISK_PCSN740 0x5015 /* PC SN740 */
/* Sangoma products */
#define PCI_PRODUCT_SANGOMA_A10X 0x0300 /* A10x */

View File

@ -2,7 +2,7 @@
* THIS FILE AUTOMATICALLY GENERATED. DO NOT EDIT.
*
* generated from:
* OpenBSD: pcidevs,v 1.2038 2023/06/12 01:12:33 jsg Exp
* OpenBSD: pcidevs,v 1.2039 2023/06/13 02:43:39 jcs Exp
*/
/* $NetBSD: pcidevs,v 1.30 1997/06/24 06:20:24 thorpej Exp $ */
@ -31047,6 +31047,10 @@ static const struct pci_known_product pci_known_products[] = {
PCI_VENDOR_SANDISK, PCI_PRODUCT_SANDISK_SN850,
"SN850",
},
{
PCI_VENDOR_SANDISK, PCI_PRODUCT_SANDISK_PCSN740,
"PC SN740",
},
{
PCI_VENDOR_SANGOMA, PCI_PRODUCT_SANGOMA_A10X,
"A10x",

View File

@ -1,4 +1,4 @@
/* $OpenBSD: entry.c,v 1.57 2023/06/04 17:27:27 millert Exp $ */
/* $OpenBSD: entry.c,v 1.58 2023/06/13 15:36:21 millert Exp $ */
/*
* Copyright 1988,1990,1993,1994 by Paul Vixie
@ -69,7 +69,8 @@ static const char *DowNames[] = {
static int get_list(bitstr_t *, int, int, const char *[], int, FILE *),
get_range(bitstr_t *, int, int, const char *[], int, FILE *),
get_number(int *, int, const char *[], int, FILE *, const char *),
set_element(bitstr_t *, int, int, int);
set_element(bitstr_t *, int, int, int),
set_range(bitstr_t *, int, int, int, int, int);
void
free_entry(entry *e)
@ -142,38 +143,56 @@ load_entry(FILE *file, void (*error_func)(const char *), struct passwd *pw,
if (!strcmp("reboot", cmd)) {
e->flags |= WHEN_REBOOT;
} else if (!strcmp("yearly", cmd) || !strcmp("annually", cmd)){
bit_set(e->minute, 0);
bit_set(e->hour, 0);
bit_set(e->dom, 0);
bit_set(e->month, 0);
bit_nset(e->dow, 0, (LAST_DOW-FIRST_DOW+1));
set_element(e->minute, FIRST_MINUTE, LAST_MINUTE,
FIRST_MINUTE);
set_element(e->hour, FIRST_HOUR, LAST_HOUR, FIRST_HOUR);
set_element(e->dom, FIRST_DOM, LAST_DOM, FIRST_DOM);
set_element(e->month, FIRST_MONTH, LAST_MONTH,
FIRST_MONTH);
set_range(e->dow, FIRST_DOW, LAST_DOW, FIRST_DOW,
LAST_DOW, 1);
e->flags |= DOW_STAR;
} else if (!strcmp("monthly", cmd)) {
bit_set(e->minute, 0);
bit_set(e->hour, 0);
bit_set(e->dom, 0);
bit_nset(e->month, 0, (LAST_MONTH-FIRST_MONTH+1));
bit_nset(e->dow, 0, (LAST_DOW-FIRST_DOW+1));
set_element(e->minute, FIRST_MINUTE, LAST_MINUTE,
FIRST_MINUTE);
set_element(e->hour, FIRST_HOUR, LAST_HOUR, FIRST_HOUR);
set_element(e->dom, FIRST_DOM, LAST_DOM, FIRST_DOM);
set_range(e->month, FIRST_MONTH, LAST_MONTH,
FIRST_MONTH, LAST_MONTH, 1);
set_range(e->dow, FIRST_DOW, LAST_DOW, FIRST_DOW,
LAST_DOW, 1);
e->flags |= DOW_STAR;
} else if (!strcmp("weekly", cmd)) {
bit_set(e->minute, 0);
bit_set(e->hour, 0);
bit_nset(e->dom, 0, (LAST_DOM-FIRST_DOM+1));
bit_nset(e->month, 0, (LAST_MONTH-FIRST_MONTH+1));
bit_set(e->dow, 0);
set_element(e->minute, FIRST_MINUTE, LAST_MINUTE,
FIRST_MINUTE);
set_element(e->hour, FIRST_HOUR, LAST_HOUR, FIRST_HOUR);
set_range(e->dom, FIRST_DOM, LAST_DOM, FIRST_DOM,
LAST_DOM, 1);
set_range(e->month, FIRST_MONTH, LAST_MONTH,
FIRST_MONTH, LAST_MONTH, 1);
set_element(e->dow, FIRST_DOW, LAST_DOW, FIRST_DOW);
e->flags |= DOW_STAR;
} else if (!strcmp("daily", cmd) || !strcmp("midnight", cmd)) {
bit_set(e->minute, 0);
bit_set(e->hour, 0);
bit_nset(e->dom, 0, (LAST_DOM-FIRST_DOM+1));
bit_nset(e->month, 0, (LAST_MONTH-FIRST_MONTH+1));
bit_nset(e->dow, 0, (LAST_DOW-FIRST_DOW+1));
set_element(e->minute, FIRST_MINUTE, LAST_MINUTE,
FIRST_MINUTE);
set_element(e->hour, FIRST_HOUR, LAST_HOUR, FIRST_HOUR);
set_range(e->dom, FIRST_DOM, LAST_DOM, FIRST_DOM,
LAST_DOM, 1);
set_range(e->month, FIRST_MONTH, LAST_MONTH,
FIRST_MONTH, LAST_MONTH, 1);
set_range(e->dow, FIRST_DOW, LAST_DOW, FIRST_DOW,
LAST_DOW, 1);
} else if (!strcmp("hourly", cmd)) {
bit_set(e->minute, 0);
bit_nset(e->hour, 0, (LAST_HOUR-FIRST_HOUR+1));
bit_nset(e->dom, 0, (LAST_DOM-FIRST_DOM+1));
bit_nset(e->month, 0, (LAST_MONTH-FIRST_MONTH+1));
bit_nset(e->dow, 0, (LAST_DOW-FIRST_DOW+1));
set_element(e->minute, FIRST_MINUTE, LAST_MINUTE,
FIRST_MINUTE);
set_range(e->hour, FIRST_HOUR, LAST_HOUR, FIRST_HOUR,
LAST_HOUR, 1);
set_range(e->dom, FIRST_DOM, LAST_DOM, FIRST_DOM,
LAST_DOM, 1);
set_range(e->month, FIRST_MONTH, LAST_MONTH,
FIRST_MONTH, LAST_MONTH, 1);
set_range(e->dow, FIRST_DOW, LAST_DOW,
FIRST_DOW, LAST_DOW, 1);
e->flags |= HR_STAR;
} else {
ecode = e_timespec;
@ -426,7 +445,7 @@ get_list(bitstr_t *bits, int low, int high, const char *names[],
/* clear the bit string, since the default is 'off'.
*/
bit_nclear(bits, 0, (high-low+1));
bit_nclear(bits, 0, high - low);
/* process all ranges
*/
@ -458,7 +477,7 @@ get_range(bitstr_t *bits, int low, int high, const char *names[],
* number "-" number ["/" number]
*/
int i, num1, num2, num3, rndstep;
int num1, num2, num3, rndstep;
num1 = low;
num2 = high;
@ -578,11 +597,10 @@ get_range(bitstr_t *bits, int low, int high, const char *names[],
* proposed conceptually by bob@acornrc, syntactically
* designed then implemented by paul vixie).
*/
for (i = num1; i <= num2; i += num3)
if (set_element(bits, low, high, i) == EOF) {
unget_char(ch, file);
return (EOF);
}
if (set_range(bits, low, high, num1, num2, num3) == EOF) {
unget_char(ch, file);
return (EOF);
}
return (ch);
}
@ -643,7 +661,27 @@ set_element(bitstr_t *bits, int low, int high, int number)
if (number < low || number > high)
return (EOF);
number -= low;
bit_set(bits, (number-low));
bit_set(bits, number);
return (0);
}
static int
set_range(bitstr_t *bits, int low, int high, int start, int stop, int step)
{
int i;
if (start < low || stop > high)
return (EOF);
start -= low;
stop -= low;
if (step == 1) {
bit_nset(bits, start, stop);
} else {
for (i = start; i <= stop; i += step)
bit_set(bits, i);
}
return (0);
}

View File

@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
# $OpenBSD: Add.pm,v 1.194 2023/05/27 09:58:26 espie Exp $
# $OpenBSD: Add.pm,v 1.195 2023/06/13 09:07:16 espie Exp $
#
# Copyright (c) 2003-2014 Marc Espie <espie@openbsd.org>
#
@ -15,8 +15,7 @@
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
use strict;
use warnings;
use v5.36;
package OpenBSD::Add;
use OpenBSD::Error;
@ -25,9 +24,8 @@ use OpenBSD::ArcCheck;
use OpenBSD::Paths;
use File::Copy;
sub manpages_index
sub manpages_index($state)
{
my ($state) = @_;
return unless defined $state->{addman};
my $destdir = $state->{destdir};
@ -44,9 +42,8 @@ sub manpages_index
delete $state->{addman};
}
sub register_installation
sub register_installation($plist, $state)
{
my ($plist, $state) = @_;
if ($state->{not}) {
$plist->to_cache;
} else {
@ -58,17 +55,13 @@ sub register_installation
}
}
sub validate_plist
sub validate_plist($plist, $state, $set)
{
my ($plist, $state, $set) = @_;
$plist->prepare_for_addition($state, $plist->pkgname, $set);
}
sub record_partial_installation
sub record_partial_installation($plist, $state, $h)
{
my ($plist, $state, $h) = @_;
use OpenBSD::PackingElement;
my $n = $plist->make_shallow_copy($h);
@ -96,10 +89,8 @@ sub record_partial_installation
return $borked;
}
sub perform_installation
sub perform_installation($handle, $state)
{
my ($handle, $state) = @_;
return if $state->defines('stub');
$state->{partial} = $handle->{partial};
@ -111,9 +102,8 @@ sub perform_installation
}
}
sub skip_to_the_end
sub skip_to_the_end($handle, $state, $tied, $p)
{
my ($handle, $state, $tied, $p) = @_;
$state->tweak_header("skipping");
for my $e (values %$tied) {
$e->tie($state);
@ -130,10 +120,8 @@ sub skip_to_the_end
}
}
sub perform_extraction
sub perform_extraction($handle, $state)
{
my ($handle, $state) = @_;
return if $state->defines('stub');
$handle->{partial} = {};
@ -195,18 +183,15 @@ sub perform_extraction
my $user_tagged = {};
sub extract_pkgname
sub extract_pkgname($pkgname)
{
my $pkgname = shift;
$pkgname =~ s/^.*\///;
$pkgname =~ s/\.tgz$//;
return $pkgname;
}
sub tweak_package_status
sub tweak_package_status($pkgname, $state)
{
my ($pkgname, $state) = @_;
$pkgname = extract_pkgname($pkgname);
return 0 unless is_installed($pkgname);
return 0 unless $user_tagged->{$pkgname};
@ -224,10 +209,8 @@ sub tweak_package_status
return 0;
}
sub tweak_plist_status
sub tweak_plist_status($plist, $state)
{
my ($plist, $state) = @_;
my $pkgname = $plist->pkgname;
if ($state->defines('FW_UPDATE')) {
$plist->has('firmware') or
@ -239,9 +222,9 @@ sub tweak_plist_status
}
}
sub tag_user_packages
sub tag_user_packages(@p)
{
for my $set (@_) {
for my $set (@p) {
for my $n ($set->newer_names) {
$user_tagged->{OpenBSD::PackageName::url2pkgname($n)} = 1;
}
@ -278,28 +261,26 @@ use OpenBSD::Error;
my ($uidcache, $gidcache);
# $self->prepare_for_addition($state, $pkgname, $set)
sub prepare_for_addition
sub prepare_for_addition($, $, $, $)
{
}
# $self->find_extractible($state, $wanted, $tied):
# sort item into wanted (needed from archive) / tied (already there)
sub find_extractible
sub find_extractible($, $, $, $)
{
}
sub extract
sub extract($self, $state)
{
my ($self, $state) = @_;
$state->{partial}{$self} = 1;
if ($state->{interrupted}) {
die "Interrupted";
}
}
sub install
sub install($self, $state)
{
my ($self, $state) = @_;
# XXX "normal" items are already in partial, but NOT stuff
# that's install-only, like symlinks and dirs...
$state->{partial}{$self} = 1;
@ -308,14 +289,13 @@ sub install
}
}
sub copy_info
# $self->copy_info($dest, $state)
sub copy_info($, $, $)
{
}
sub set_modes
sub set_modes($self, $state, $name)
{
my ($self, $state, $name) = @_;
if (defined $self->{owner} || defined $self->{group}) {
require OpenBSD::IdCache;
@ -350,14 +330,13 @@ package OpenBSD::PackingElement::Meta;
# XXX stuff that's invisible to find_extractible should be considered extracted
# for the most part, otherwise we create broken partial packages
sub find_extractible
sub find_extractible($self, $state, $wanted, $tied)
{
my ($self, $state, $wanted, $tied) = @_;
$state->{partial}{$self} = 1;
}
package OpenBSD::PackingElement::Cwd;
sub find_extractible
sub find_extractible # forwarder
{
&OpenBSD::PackingElement::Meta::find_extractible;
}
@ -365,10 +344,8 @@ sub find_extractible
package OpenBSD::PackingElement::ExtraInfo;
use OpenBSD::Error;
sub prepare_for_addition
sub prepare_for_addition($self, $state, $pkgname, $)
{
my ($self, $state, $pkgname) = @_;
if ($state->{ftp_only} && $self->{ftp} ne 'yes') {
$state->errsay("Package #1 is not for ftp", $pkgname);
$state->{problems}++;
@ -378,13 +355,11 @@ sub prepare_for_addition
package OpenBSD::PackingElement::NewAuth;
use OpenBSD::Error;
sub add_entry
sub add_entry($, $l, @p)
{
shift; # get rid of self
my $l = shift;
while (@_ >= 2) {
my $f = shift;
my $v = shift;
while (@p >= 2) {
my $f = shift @p;
my $v = shift @p;
next if !defined $v or $v eq '';
if ($v =~ m/^\!(.*)$/o) {
push(@$l, $f, $1);
@ -394,9 +369,8 @@ sub add_entry
}
}
sub prepare_for_addition
sub prepare_for_addition($self, $state, $pkgname, $)
{
my ($self, $state, $pkgname) = @_;
my $ok = $self->check;
if (defined $ok) {
if ($ok == 0) {
@ -408,9 +382,8 @@ sub prepare_for_addition
$self->{okay} = $ok;
}
sub install
sub install($self, $state)
{
my ($self, $state) = @_;
$self->SUPER::install($state);
my $auth = $self->name;
$state->say("adding #1 #2", $self->type, $auth) if $state->verbose >= 2;
@ -424,12 +397,10 @@ sub install
package OpenBSD::PackingElement::NewUser;
sub command { OpenBSD::Paths->useradd }
sub command($) { OpenBSD::Paths->useradd }
sub build_args
sub build_args($self, $l)
{
my ($self, $l) = @_;
$self->add_entry($l,
'-u', $self->{uid},
'-g', $self->{group},
@ -441,12 +412,10 @@ sub build_args
package OpenBSD::PackingElement::NewGroup;
sub command { OpenBSD::Paths->groupadd }
sub command($) { OpenBSD::Paths->groupadd }
sub build_args
sub build_args($self, $l)
{
my ($self, $l) = @_;
$self->add_entry($l, '-g', $self->{gid});
}
@ -456,9 +425,8 @@ use File::Basename;
use File::Path;
use OpenBSD::Temp;
sub find_extractible
sub find_extractible($self, $state, $wanted, $tied)
{
my ($self, $state, $wanted, $tied) = @_;
if ($self->{tieto} || $self->{link} || $self->{symlink}) {
$tied->{$self->name} = $self;
} else {
@ -466,9 +434,8 @@ sub find_extractible
}
}
sub prepare_for_addition
sub prepare_for_addition($self, $state, $pkgname, $)
{
my ($self, $state, $pkgname) = @_;
my $fname = $self->retrieve_fullname($state, $pkgname);
# check for collisions with existing stuff
if ($state->vstat->exists($fname)) {
@ -489,9 +456,8 @@ sub prepare_for_addition
}
}
sub prepare_to_extract
sub prepare_to_extract($self, $state, $file)
{
my ($self, $state, $file) = @_;
my $fullname = $self->fullname;
my $destdir = $state->{destdir};
@ -504,9 +470,8 @@ sub prepare_to_extract
$file->{destdir} = $destdir;
}
sub find_safe_dir
sub find_safe_dir($self, $state)
{
my ($self, $state) = @_;
# figure out a safe directory where to put the temp file
my $fullname = $self->fullname;
@ -539,9 +504,8 @@ sub find_safe_dir
return $d;
}
sub create_temp
sub create_temp($self, $d, $state)
{
my ($self, $d, $state) = @_;
my $fullname = $self->fullname;
my ($fh, $tempname) = OpenBSD::Temp::permanent_file($d, "pkg");
$self->{tempname} = $tempname;
@ -556,9 +520,8 @@ sub create_temp
return ($fh, $tempname);
}
sub may_create_temp
sub may_create_temp($self, $d, $state)
{
my ($self, $d, $state) = @_;
if ($self->{avoid_temp}) {
if (open(my $fh, '>', $self->{avoid_temp})) {
return ($fh, $self->{avoid_temp});
@ -568,9 +531,8 @@ sub may_create_temp
return $self->create_temp($d, $state);
}
sub tie
sub tie($self, $state)
{
my ($self, $state) = @_;
if (defined $self->{link} || defined $self->{symlink}) {
return;
}
@ -602,10 +564,8 @@ sub tie
}
sub extract
sub extract($self, $state, $file)
{
my ($self, $state, $file) = @_;
$self->SUPER::extract($state);
my $d = $self->find_safe_dir($state);
@ -636,9 +596,8 @@ sub extract
}
}
sub install
sub install($self, $state)
{
my ($self, $state) = @_;
$self->SUPER::install($state);
my $fullname = $self->fullname;
my $destdir = $state->{destdir};
@ -677,17 +636,14 @@ sub install
}
package OpenBSD::PackingElement::Extra;
sub find_extractible
sub find_extractible($self, $state, $wanted, $tied)
{
my ($self, $state, $wanted, $tied) = @_;
$state->{current_set}{known_extra}{$self->fullname} = 1;
}
package OpenBSD::PackingElement::RcScript;
sub install
sub install($self, $state)
{
my ($self, $state) = @_;
$state->{add_rcscripts}{$self->fullname} = 1;
$self->SUPER::install($state);
}
@ -696,9 +652,8 @@ package OpenBSD::PackingElement::Sample;
use OpenBSD::Error;
use File::Copy;
sub prepare_for_addition
sub prepare_for_addition($self, $state, $pkgname, $)
{
my ($self, $state, $pkgname) = @_;
if (!defined $self->{copyfrom}) {
$state->errsay("\@sample element #1 does not reference a valid file",
$self->fullname);
@ -720,22 +675,18 @@ sub prepare_for_addition
}
}
sub find_extractible
sub find_extractible($self, $state, $wanted, $tied)
{
my ($self, $state, $wanted, $tied) = @_;
$state->{current_set}{known_sample}{$self->fullname} = 1;
}
# $self->extract($state)
sub extract
sub extract($, $)
{
}
sub install
sub install($self, $state)
{
my ($self, $state) = @_;
$self->SUPER::install($state);
my $destdir = $state->{destdir};
my $filename = $destdir.$self->fullname;
@ -776,20 +727,19 @@ sub install
}
package OpenBSD::PackingElement::Sampledir;
sub extract
sub extract($, $)
{
}
sub install
sub install # forwarder
{
&OpenBSD::PackingElement::Dir::install;
}
package OpenBSD::PackingElement::Mandir;
sub install
sub install($self, $state)
{
my ($self, $state) = @_;
$self->SUPER::install($state);
if (!$state->{current_set}{known_mandirs}{$self->fullname}) {
$state->log("You may wish to add #1 to /etc/man.conf",
@ -799,9 +749,8 @@ sub install
package OpenBSD::PackingElement::Manpage;
sub install
sub install($self, $state)
{
my ($self, $state) = @_;
$self->SUPER::install($state);
$self->register_manpage($state, 'addman');
}
@ -810,9 +759,8 @@ package OpenBSD::PackingElement::InfoFile;
use File::Basename;
use OpenBSD::Error;
sub install
sub install($self, $state)
{
my ($self, $state) = @_;
$self->SUPER::install($state);
return if $state->{not};
my $fullname = $state->{destdir}.$self->fullname;
@ -821,9 +769,8 @@ sub install
}
package OpenBSD::PackingElement::Shell;
sub install
sub install($self, $state)
{
my ($self, $state) = @_;
$self->SUPER::install($state);
return if $state->{not};
my $fullname = $self->fullname;
@ -843,9 +790,8 @@ sub install
}
package OpenBSD::PackingElement::Dir;
sub extract
sub extract($self, $state)
{
my ($self, $state) = @_;
my $fullname = $self->fullname;
my $destdir = $state->{destdir};
@ -857,9 +803,8 @@ sub extract
$state->make_path($destdir.$fullname, $fullname);
}
sub install
sub install($self, $state)
{
my ($self, $state) = @_;
$self->SUPER::install($state);
my $fullname = $self->fullname;
my $destdir = $state->{destdir};
@ -874,38 +819,32 @@ sub install
package OpenBSD::PackingElement::Exec;
use OpenBSD::Error;
sub install
sub install($self, $state)
{
my ($self, $state) = @_;
$self->SUPER::install($state);
if ($self->should_run($state)) {
$self->run($state);
}
}
sub should_run() { 1 }
sub should_run($, $) { 1 }
package OpenBSD::PackingElement::ExecAdd;
sub should_run
sub should_run($self, $state)
{
my ($self, $state) = @_;
return !$state->replacing;
}
package OpenBSD::PackingElement::ExecUpdate;
sub should_run
sub should_run($self, $state)
{
my ($self, $state) = @_;
return $state->replacing;
}
package OpenBSD::PackingElement::Tag;
sub install
sub install($self, $state)
{
my ($self, $state) = @_;
for my $d (@{$self->{definition_list}}) {
$d->add_tag($self, "install", $state);
}
@ -913,9 +852,8 @@ sub install
package OpenBSD::PackingElement::Lib;
sub install
sub install($self, $state)
{
my ($self, $state) = @_;
$self->SUPER::install($state);
$self->mark_ldconfig_directory($state);
}
@ -924,9 +862,8 @@ package OpenBSD::PackingElement::SpecialFile;
use OpenBSD::PackageInfo;
use OpenBSD::Error;
sub copy_info
sub copy_info($self, $dest, $state)
{
my ($self, $dest, $state) = @_;
require File::Copy;
File::Copy::move($self->fullname, $dest) or
@ -934,27 +871,24 @@ sub copy_info
$self->fullname, $dest, $!);
}
sub extract
sub extract($self, $state)
{
my ($self, $state) = @_;
$self->may_verify_digest($state);
}
sub find_extractible
sub find_extractible($self, $state, $, $)
{
my ($self, $state) = @_;
$self->may_verify_digest($state);
}
package OpenBSD::PackingElement::FCONTENTS;
sub copy_info
sub copy_info($, $, $)
{
}
package OpenBSD::PackingElement::AskUpdate;
sub prepare_for_addition
sub prepare_for_addition($self, $state, $pkgname, $set)
{
my ($self, $state, $pkgname, $set) = @_;
my @old = $set->older_names;
if ($self->spec->match_ref(\@old) > 0) {
my $key = "update_".OpenBSD::PackageName::splitstem($pkgname);
@ -974,9 +908,8 @@ sub prepare_for_addition
}
package OpenBSD::PackingElement::FDISPLAY;
sub install
sub install($self, $state)
{
my ($self, $state) = @_;
my $d = $self->{d};
if (!$state->{current_set}{known_displays}{$self->{d}->key}) {
$self->prepare($state);
@ -985,9 +918,8 @@ sub install
}
package OpenBSD::PackingElement::FUNDISPLAY;
sub find_extractible
sub find_extractible($self, $state, $wanted, $tied)
{
my ($self, $state, $wanted, $tied) = @_;
$state->{current_set}{known_displays}{$self->{d}->key} = 1;
$self->SUPER::find_extractible($state, $wanted, $tied);
}

View File

@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
# $OpenBSD: AddCreateDelete.pm,v 1.51 2023/05/27 09:59:51 espie Exp $
# $OpenBSD: AddCreateDelete.pm,v 1.52 2023/06/13 09:07:16 espie Exp $
#
# Copyright (c) 2007-2014 Marc Espie <espie@openbsd.org>
#
@ -16,8 +16,7 @@
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
use strict;
use warnings;
use v5.36;
# common behavior to pkg_add, pkg_delete, pkg_create
@ -27,61 +26,42 @@ our @ISA = qw(OpenBSD::State);
use OpenBSD::State;
use OpenBSD::ProgressMeter;
sub init
sub init($self, @p)
{
my $self = shift;
$self->{progressmeter} = OpenBSD::ProgressMeter->new;
$self->{bad} = 0;
$self->SUPER::init(@_);
$self->SUPER::init(@p);
$self->{export_level}++;
}
sub progress
sub progress($self)
{
my $self = shift;
return $self->{progressmeter};
}
sub not
sub not($self)
{
my $self = shift;
return $self->{not};
}
sub sync_display
sub sync_display($self)
{
my $self = shift;
$self->progress->clear;
}
sub add_interactive_options
sub add_interactive_options($self)
{
my $self = shift;
$self->{has_interactive_options} = 1;
return $self;
}
sub interactive_class
sub handle_options($state, $opt_string, @usage)
{
my ($class, $i) = @_;
if ($i) {
require OpenBSD::Interactive;
return 'OpenBSD::Interactive';
} else {
return 'OpenBSD::InteractiveStub';
}
}
sub handle_options
{
my ($state, $opt_string, @usage) = @_;
my $i;
if ($state->{has_interactive_options}) {
$opt_string .= 'iI';
$state->{opt}{i} = sub {
$state->{opt}{i} = sub() {
$i++;
};
};
@ -100,64 +80,65 @@ sub handle_options
$state->{interactive} = $state->interactive_class($i)->new($state, $i);
}
sub is_interactive
sub interactive_class($, $i)
{
return shift->{interactive}->is_interactive;
if ($i) {
require OpenBSD::Interactive;
return 'OpenBSD::Interactive';
} else {
return 'OpenBSD::InteractiveStub';
}
}
sub find_window_size
sub is_interactive($self)
{
return $self->{interactive}->is_interactive;
}
sub find_window_size($state)
{
my $state = shift;
$state->SUPER::find_window_size;
$state->{progressmeter}->compute_playfield;
}
sub handle_continue
sub handle_continue($state)
{
my $state = shift;
$state->SUPER::handle_continue;
$state->{progressmeter}->handle_continue;
}
sub confirm_defaults_to_no
sub confirm_defaults_to_no($self, @p)
{
my $self = shift;
return $self->{interactive}->confirm($self->f(@_), 0);
return $self->{interactive}->confirm($self->f(@p), 0);
}
sub confirm_defaults_to_yes
sub confirm_defaults_to_yes($self, @p)
{
my $self = shift;
return $self->{interactive}->confirm($self->f(@_), 1);
return $self->{interactive}->confirm($self->f(@p), 1);
}
sub ask_list
sub ask_list($self, @p)
{
my $self = shift;
return $self->{interactive}->ask_list(@_);
return $self->{interactive}->ask_list(@p);
}
sub vsystem
sub vsystem($self, @p)
{
my $self = shift;
if ($self->verbose < 2) {
$self->system(@_);
$self->system(@p);
} else {
$self->verbose_system(@_);
$self->verbose_system(@p);
}
}
sub system
sub system($self, @p)
{
my $self = shift;
$self->SUPER::system(@_);
$self->SUPER::system(@p);
}
sub run_makewhatis
sub run_makewhatis($state, $opts, $l)
{
my ($state, $opts, $l) = @_;
my $braindead = sub { chdir('/'); };
my $braindead = sub() { chdir('/'); };
while (@$l > 1000) {
my @b = splice(@$l, 0, 1000);
$state->vsystem($braindead,
@ -167,43 +148,36 @@ sub run_makewhatis
OpenBSD::Paths->makewhatis, @$opts, '--', @$l);
}
# TODO the maze of ntogo/todo/... is a mess
sub ntogo
# TODO this stuff is definitely not as clear as it could be
sub ntogo($self, $offset = 0)
{
my ($self, $offset) = @_;
return $self->{wantntogo} ?
$self->progress->ntogo($self, $offset) :
$self->f("ok");
}
sub ntogo_string
sub ntogo_string($self, $offset = 0)
{
my ($self, $offset) = @_;
return $self->{wantntogo} ?
$self->f(" (#1)", $self->ntodo($offset // 0)) :
$self->f(" (#1)", $self->ntodo($offset)) :
$self->f("");
}
sub solve_dependency
sub solve_dependency($self, $solver, $dep, $package)
{
my ($self, $solver, $dep, $package) = @_;
return $solver->really_solve_dependency($self, $dep, $package);
}
package OpenBSD::AddCreateDelete;
use OpenBSD::Error;
sub handle_options
sub handle_options($self, $opt_string, $state, @usage)
{
my ($self, $opt_string, $state, @usage) = @_;
$state->handle_options($opt_string, $self, @usage);
}
sub try_and_run_command
sub try_and_run_command($self, $state)
{
my ($self, $state) = @_;
if ($state->defines('pkg-debug')) {
$self->run_command($state);
} else {
@ -221,25 +195,22 @@ sub try_and_run_command
}
package OpenBSD::InteractiveStub;
sub new
sub new($class, $, $)
{
my $class = shift;
bless {}, $class;
}
sub ask_list
sub ask_list($, $, @values)
{
my ($self, $prompt, @values) = @_;
return $values[0];
}
sub confirm
sub confirm($, $, $yesno)
{
my ($self, $prompt, $yesno) = @_;
return $yesno;
}
sub is_interactive
sub is_interactive($)
{
return 0;
}

View File

@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
# $OpenBSD: AddDelete.pm,v 1.98 2023/05/27 10:00:23 espie Exp $
# $OpenBSD: AddDelete.pm,v 1.99 2023/06/13 09:07:17 espie Exp $
#
# Copyright (c) 2007-2010 Marc Espie <espie@openbsd.org>
#
@ -16,39 +16,34 @@
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
use strict;
use warnings;
use v5.36;
# common behavior to pkg_add / pkg_delete
package main;
our $not;
package OpenBSD::PackingElement::FileObject;
sub retrieve_fullname
sub retrieve_fullname($self, $state, $pkgname)
{
my ($self, $state, $pkgname) = @_;
return $state->{destdir}.$self->fullname;
}
package OpenBSD::PackingElement::FileBase;
sub retrieve_size
sub retrieve_size($self)
{
my $self = shift;
return $self->{size};
}
package OpenBSD::PackingElement::SpecialFile;
use OpenBSD::PackageInfo;
sub retrieve_fullname
sub retrieve_fullname($self, $state, $pkgname)
{
my ($self, $state, $pkgname);
return installed_info($pkgname).$self->name;
}
package OpenBSD::PackingElement::FCONTENTS;
sub retrieve_size
sub retrieve_size($self)
{
my $self = shift;
my $size = 0;
my $cname = $self->fullname;
if (defined $cname) {
@ -65,10 +60,8 @@ use OpenBSD::PackageInfo;
use OpenBSD::AddCreateDelete;
our @ISA = qw(OpenBSD::AddCreateDelete);
sub do_the_main_work
sub do_the_main_work($self, $state)
{
my ($self, $state) = @_;
if ($state->{bad}) {
return;
}
@ -91,24 +84,20 @@ sub do_the_main_work
return $dielater;
}
sub handle_end_tags
sub handle_end_tags($self, $state)
{
my ($self, $state) = @_;
return if !defined $state->{tags}{atend};
$state->progress->for_list("Running tags",
[keys %{$state->{tags}{atend}}],
sub {
my $k = shift;
sub($k) {
return if $state->{tags}{deleted}{$k};
return if $state->{tags}{superseded}{$k};
$state->{tags}{atend}{$k}->run_tag($state);
});
}
sub run_command
sub run_command($self, $state)
{
my ($self, $state) = @_;
lock_db($state->{not}, $state) unless $state->defines('nolock');
$state->check_root;
$self->process_parameters($state);
@ -129,10 +118,8 @@ sub run_command
rethrow $dielater;
}
sub parse_and_run
sub parse_and_run($self, $cmd)
{
my ($self, $cmd) = @_;
my $state = $self->new_state($cmd);
$state->handle_options;
@ -167,19 +154,17 @@ sub parse_and_run
}
# $self->silence_children($state)
sub silence_children
sub silence_children($, $)
{
1
}
# nothing to do
sub tweak_list
sub tweak_list($, $)
{
}
sub process_setlist
sub process_setlist($self, $state)
{
my ($self, $state) = @_;
$state->tracker->todo(@{$state->{setlist}});
# this is the actual very small loop that processes all sets
while (my $set = shift @{$state->{setlist}}) {
@ -193,22 +178,19 @@ sub process_setlist
}
package OpenBSD::SharedItemsRecorder;
sub new
sub new($class)
{
my $class = shift;
return bless {}, $class;
}
sub is_empty
sub is_empty($self)
{
my $self = shift;
return !(defined $self->{dirs} or defined $self->{users} or
defined $self->{groups});
}
sub cleanup
sub cleanup($self, $state)
{
my ($self, $state) = @_;
return if $self->is_empty or $state->{not};
require OpenBSD::SharedItems;
@ -220,12 +202,10 @@ use OpenBSD::Vstat;
use OpenBSD::Log;
our @ISA = qw(OpenBSD::AddCreateDelete::State);
sub handle_options
sub handle_options($state, $opt_string, @usage)
{
my ($state, $opt_string, @usage) = @_;
$state->{extra_stats} = 0;
$state->{opt}{V} = sub {
$state->{opt}{V} = sub() {
$state->{extra_stats}++;
};
$state->{no_exports} = 1;
@ -271,52 +251,46 @@ sub handle_options
$state->{destdir} = $base;
}
sub init
sub init($self, @p)
{
my $self = shift;
$self->{l} = OpenBSD::Log->new($self);
$self->{vstat} = OpenBSD::Vstat->new($self);
$self->{status} = OpenBSD::Status->new;
$self->{recorder} = OpenBSD::SharedItemsRecorder->new;
$self->{v} = 0;
$self->SUPER::init(@_);
$self->SUPER::init(@p);
$self->{export_level}++;
}
sub syslog
sub syslog($self, @p)
{
my $self = shift;
return unless $self->{loglevel};
Sys::Syslog::syslog('info', $self->f(@_));
Sys::Syslog::syslog('info', $self->f(@p));
}
sub ntodo
sub ntodo($state, $offset)
{
my ($state, $offset) = @_;
return $state->tracker->sets_todo($offset);
}
# one-level dependencies tree, for nicer printouts
sub build_deptree
sub build_deptree($state, $set, @deps)
{
my ($state, $set, @deps) = @_;
if (defined $state->{deptree}{$set}) {
$set = $state->{deptree}{$set};
}
for my $dep (@deps) {
$state->{deptree}{$dep} = $set unless
defined $state->{deptree}{$dep};
$state->{deptree}{$dep} = $set
unless defined $state->{deptree}{$dep};
}
}
sub deptree_header
sub deptree_header($state, $pkg)
{
my ($state, $pkg) = @_;
if (defined $state->{deptree}->{$pkg}) {
my $s = $state->{deptree}->{$pkg}->real_set;
if (defined $state->{deptree}{$pkg}) {
my $s = $state->{deptree}{$pkg}->real_set;
if ($s eq $pkg) {
delete $state->{deptree}->{$pkg};
delete $state->{deptree}{$pkg};
} else {
return $s->short_print.':';
}
@ -324,26 +298,22 @@ sub deptree_header
return '';
}
sub vstat
sub vstat($self)
{
my $self = shift;
return $self->{vstat};
}
sub log
sub log($self, @p)
{
my $self = shift;
if (@_ == 0) {
if (@p == 0) {
return $self->{l};
} else {
$self->{l}->say(@_);
$self->{l}->say(@p);
}
}
sub run_quirks
sub run_quirks($state, $sub)
{
my ($state, $sub) = @_;
if (!exists $state->{quirks}) {
eval {
use lib ('/usr/local/libdata/perl5/site_perl');
@ -373,9 +343,8 @@ sub run_quirks
}
}
sub check_root
sub check_root($state)
{
my $state = shift;
if ($< && !$state->defines('nonroot')) {
if ($state->{not}) {
$state->errsay("#1 should be run as root",
@ -386,15 +355,13 @@ sub check_root
}
}
sub choose_location
sub choose_location($state, $name, $list, $is_quirks = 0)
{
my ($state, $name, $list, $is_quirks) = @_;
if (@$list == 0) {
if (!$is_quirks) {
$state->errsay("Can't find #1", $name);
$state->run_quirks(
sub {
my $quirks = shift;
sub($quirks) {
$quirks->filter_obsolete([$name], $state);
});
}
@ -407,7 +374,7 @@ sub choose_location
if ($state->is_interactive) {
$h{'<None>'} = undef;
$state->progress->clear;
my $cmp = sub {
my $cmp = sub { # XXX prototypable ?
return -1 if !defined $h{$a};
return 1 if !defined $h{$b};
my $r = $h{$a}->pkgname->to_pattern cmp
@ -428,36 +395,30 @@ sub choose_location
}
}
sub status
sub status($self)
{
my $self = shift;
return $self->{status};
}
sub replacing
sub replacing($self)
{
my $self = shift;
return $self->{replacing};
}
OpenBSD::Auto::cache(ldconfig,
sub {
my $self = shift;
sub($self) {
return OpenBSD::LdConfig->new($self);
});
# if we're not running as root, allow some stuff when not under /usr/local
sub allow_nonroot
sub allow_nonroot($state, $path)
{
my ($state, $path) = @_;
return $state->defines('nonroot') &&
$path !~ m,^\Q$state->{localbase}/\E,;
}
sub make_path
sub make_path($state, $path, $fullname)
{
my ($state, $path, $fullname) = @_;
require File::Path;
if ($state->allow_nonroot($fullname)) {
eval {
@ -471,16 +432,14 @@ sub make_path
# this is responsible for running ldconfig when needed
package OpenBSD::LdConfig;
sub new
sub new($class, $state)
{
my ($class, $state) = @_;
bless { state => $state, todo => 0 }, $class;
}
# called once to figure out which directories are actually used
sub init
sub init($self)
{
my $self = shift;
my $state = $self->{state};
my $destdir = $state->{destdir};
@ -508,9 +467,8 @@ sub init
}
# called from libs to figure out whether ldconfig should be rerun
sub mark_directory
sub mark_directory($self, $name)
{
my ($self, $name) = @_;
if (!defined $self->{path}) {
$self->init;
}
@ -522,9 +480,8 @@ sub mark_directory
}
# call before running any command (or at end) to run ldconfig just in time
sub ensure
sub ensure($self)
{
my $self = shift;
if ($self->{todo}) {
my $state = $self->{state};
$state->vsystem(@{$self->{ldconfig}}, "-R")
@ -536,12 +493,10 @@ sub ensure
# the object that gets displayed during status updates
package OpenBSD::Status;
sub print
sub print($self, $state)
{
my ($self, $state) = @_;
my $what = $self->{what};
$what //= "Processing";
$what //= 'Processing';
my $object;
if (defined $self->{object}) {
$object = $self->{object};
@ -558,33 +513,28 @@ sub print
}
}
sub set
sub set($self, $set)
{
my ($self, $set) = @_;
delete $self->{object};
$self->{set} = $set;
return $self;
}
sub object
sub object($self, $object)
{
my ($self, $object) = @_;
delete $self->{set};
$self->{object} = $object;
return $self;
}
sub what
sub what($self, $what = undef)
{
my ($self, $what) = @_;
$self->{what} = $what;
return $self;
}
sub new
sub new($class)
{
my $class = shift;
bless {}, $class;
}

View File

@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
# $OpenBSD: ArcCheck.pm,v 1.41 2023/05/27 10:00:48 espie Exp $
# $OpenBSD: ArcCheck.pm,v 1.42 2023/06/13 09:07:17 espie Exp $
#
# Copyright (c) 2005-2006 Marc Espie <espie@openbsd.org>
#
@ -34,20 +34,18 @@
# $o->validate_meta($item) or
# error...
use strict;
use warnings;
use v5.36;
use OpenBSD::Ustar;
package OpenBSD::Ustar::Object;
use POSIX;
sub is_allowed() { 0 }
sub is_allowed($) { 0 }
# match archive header link name against actual link name
sub _check_linkname
sub _check_linkname($self, $linkname)
{
my ($self, $linkname) = @_;
my $c = $self->{linkname};
if ($self->isHardLink && defined $self->{cwd}) {
$c = $self->{cwd}.'/'.$c;
@ -55,16 +53,13 @@ sub _check_linkname
return $c eq $linkname;
}
sub _errsay
sub _errsay($o, @msg)
{
my ($self, @args) = @_;
$self->{archive}{state}->errsay(@args);
$o->{archive}{state}->errsay(@msg);
}
sub validate_meta
sub validate_meta($o, $item)
{
my ($o, $item) = @_;
$o->{cwd} = $item->cwd;
if (defined $item->{symlink} || $o->isSymLink) {
if (!defined $item->{symlink}) {
@ -120,10 +115,8 @@ sub validate_meta
return $o->verify_modes($item);
}
sub _strip_modes
sub _strip_modes($o, $item)
{
my ($o, $item) = @_;
my $result = $o->{mode};
# disallow writable files/dirs without explicit annotation
@ -149,16 +142,14 @@ sub _strip_modes
return $result;
}
sub _printable_mode
sub _printable_mode($o)
{
my $o = shift;
return sprintf("%4o",
$o->{mode} & (S_IRWXU | S_IRWXG | S_IRWXO | S_ISUID | S_ISGID));
}
sub verify_modes
sub verify_modes($o, $item)
{
my ($o, $item) = @_;
my $result = 1;
if (!defined $item->{owner}) {
@ -186,21 +177,20 @@ sub verify_modes
}
package OpenBSD::Ustar::HardLink;
sub is_allowed() { 1 }
sub is_allowed($) { 1 }
package OpenBSD::Ustar::SoftLink;
sub is_allowed() { 1 }
sub is_allowed($) { 1 }
package OpenBSD::Ustar::File;
sub is_allowed() { 1 }
sub is_allowed($) { 1 }
package OpenBSD::Ustar;
use POSIX;
# prepare item according to pkg_create's rules.
sub prepare_long
sub prepare_long($self, $item)
{
my ($self, $item) = @_;
my $entry;
if (defined $item->{wtempname}) {
$entry = $self->prepare($item->{wtempname}, '');

View File

@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
# $OpenBSD: BaseState.pm,v 1.2 2023/06/07 15:09:01 espie Exp $
# $OpenBSD: BaseState.pm,v 1.3 2023/06/13 09:07:17 espie Exp $
#
# Copyright (c) 2007-2022 Marc Espie <espie@openbsd.org>
#
@ -16,36 +16,33 @@
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
use strict;
use warnings;
use v5.36;
package OpenBSD::BaseState;
use Carp;
sub can_output
sub can_output($)
{
1;
}
sub sync_display
sub sync_display($)
{
}
my $forbidden = qr{[^[:print:]\s]};
sub safe
sub safe($self, $string)
{
my ($self, $string) = @_;
$string =~ s/$forbidden/?/g;
return $string;
}
sub f
sub f($self, @p)
{
my $self = shift;
if (@_ == 0) {
if (@p == 0) {
return undef;
}
my ($fmt, @l) = @_;
my ($fmt, @l) = @p;
# is there anything to format, actually ?
if ($fmt =~ m/\#\d/) {
@ -60,85 +57,71 @@ sub f
return $fmt;
}
sub _fatal
sub _fatal($self, @p)
{
my $self = shift;
# implementation note: to print "fatal errors" elsewhere,
# the way is to eval { croak @_}; and decide what to do with $@.
delete $SIG{__DIE__};
$self->sync_display;
croak @_, "\n";
croak @p, "\n";
}
sub fatal
sub fatal($self, @p)
{
my $self = shift;
$self->_fatal($self->f(@_));
$self->_fatal($self->f(@p));
}
sub _fhprint
sub _fhprint($self, $fh, @p)
{
my $self = shift;
my $fh = shift;
$self->sync_display;
print $fh @_;
print $fh @p;
}
sub _print
sub _print($self, @p)
{
my $self = shift;
$self->_fhprint(\*STDOUT, @_) if $self->can_output;
$self->_fhprint(\*STDOUT, @p) if $self->can_output;
}
sub _errprint
sub _errprint($self, @p)
{
my $self = shift;
$self->_fhprint(\*STDERR, @_);
$self->_fhprint(\*STDERR, @p);
}
sub fhprint
sub fhprint($self, $fh, @p)
{
my $self = shift;
my $fh = shift;
$self->_fhprint($fh, $self->f(@_));
$self->_fhprint($fh, $self->f(@p));
}
sub fhsay
sub fhsay($self, $fh, @p)
{
my $self = shift;
my $fh = shift;
if (@_ == 0) {
if (@p == 0) {
$self->_fhprint($fh, "\n");
} else {
$self->_fhprint($fh, $self->f(@_), "\n");
$self->_fhprint($fh, $self->f(@p), "\n");
}
}
sub print
sub print($self, @p)
{
my $self = shift;
$self->fhprint(\*STDOUT, @_) if $self->can_output;
$self->fhprint(\*STDOUT, @p) if $self->can_output;
}
sub say
sub say($self, @p)
{
my $self = shift;
$self->fhsay(\*STDOUT, @_) if $self->can_output;
$self->fhsay(\*STDOUT, @p) if $self->can_output;
}
sub errprint
sub errprint($self, @p)
{
my $self = shift;
$self->fhprint(\*STDERR, @_);
$self->fhprint(\*STDERR, @p);
}
sub errsay
sub errsay($self, @p)
{
my $self = shift;
$self->fhsay(\*STDERR, @_);
$self->fhsay(\*STDERR, @p);
}
my @signal_name = ();
sub fillup_names
sub fillup_names($)
{
{
# XXX force autoload
@ -170,10 +153,8 @@ sub fillup_names
$signal_name[29] = 'INFO';
}
sub find_signal
sub find_signal($self, $number)
{
my ($self, $number) = @_;
if (@signal_name == 0) {
$self->fillup_names;
}
@ -181,11 +162,8 @@ sub find_signal
return $signal_name[$number] || $number;
}
sub child_error
sub child_error($self, $error = $?)
{
my ($self, $error) = @_;
$error //= $?;
my $extra = "";
if ($error & 128) {
@ -199,20 +177,19 @@ sub child_error
}
}
sub _system
sub _system($self, @p)
{
my $self = shift;
$self->sync_display;
my ($todo, $todo2);
if (ref $_[0] eq 'CODE') {
$todo = shift;
if (ref $p[0] eq 'CODE') {
$todo = shift @p;
} else {
$todo = sub {};
$todo = sub() {};
}
if (ref $_[0] eq 'CODE') {
$todo2 = shift;
if (ref $p[0] eq 'CODE') {
$todo2 = shift @p;
} else {
$todo2 = sub {};
$todo2 = sub() {};
}
my $r = fork;
if (!defined $r) {
@ -220,7 +197,7 @@ sub _system
} elsif ($r == 0) {
$DB::inhibit_exit = 0;
&$todo();
exec {$_[0]} @_ or
exec {$p[0]} @p or
exit 1;
} else {
&$todo2();
@ -229,27 +206,24 @@ sub _system
}
}
sub system
sub system($self, @p)
{
my $self = shift;
my $r = $self->_system(@_);
my $r = $self->_system(@p);
if ($r != 0) {
if (ref $_[0] eq 'CODE') {
shift;
if (ref $p[0] eq 'CODE') {
shift @p;
}
if (ref $_[0] eq 'CODE') {
shift;
if (ref $p[0] eq 'CODE') {
shift @p;
}
$self->errsay("system(#1) failed: #2",
join(", ", @_), $self->child_error);
join(", ", @p), $self->child_error);
}
return $r;
}
sub verbose_system
sub verbose_system($self, @p)
{
my $self = shift;
my @p = @_;
if (ref $p[0]) {
shift @p;
}
@ -258,7 +232,7 @@ sub verbose_system
}
$self->print("Running #1", join(' ', @p));
my $r = $self->_system(@_);
my $r = $self->_system(@p);
if ($r != 0) {
$self->say("... failed: #1", $self->child_error);
} else {
@ -266,40 +240,36 @@ sub verbose_system
}
}
sub copy_file
sub copy_file($self, @p)
{
my $self = shift;
require File::Copy;
my $r = File::Copy::copy(@_);
my $r = File::Copy::copy(@p);
if (!$r) {
$self->say("copy(#1) failed: #2", join(',', @_), $!);
$self->say("copy(#1) failed: #2", join(',', @p), $!);
}
return $r;
}
sub unlink
sub unlink($self, $verbose, @p)
{
my $self = shift;
my $verbose = shift;
my $r = unlink @_;
if ($r != @_) {
my $r = unlink @p;
if ($r != @p) {
$self->say("rm #1 failed: removed only #2 targets, #3",
join(' ', @_), $r, $!);
join(' ', @p), $r, $!);
} elsif ($verbose) {
$self->say("rm #1", join(' ', @_));
$self->say("rm #1", join(' ', @p));
}
return $r;
}
sub copy
sub copy($self, @p)
{
my $self = shift;
require File::Copy;
my $r = File::Copy::copy(@_);
my $r = File::Copy::copy(@p);
if (!$r) {
$self->say("copy(#1) failed: #2", join(',', @_), $!);
$self->say("copy(#1) failed: #2", join(',', @p), $!);
}
return $r;
}

View File

@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
# $OpenBSD: CollisionReport.pm,v 1.48 2019/09/04 12:27:38 espie Exp $
# $OpenBSD: CollisionReport.pm,v 1.49 2023/06/13 09:07:17 espie Exp $
#
# Copyright (c) 2003-2006 Marc Espie <espie@openbsd.org>
#
@ -15,18 +15,16 @@
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
use strict;
use warnings;
use v5.36;
package OpenBSD::PackingElement;
sub handle_collisions
sub handle_collisions($, $, $, $)
{
}
package OpenBSD::PackingElement::FileBase;
sub handle_collisions
sub handle_collisions($self, $todo, $pkg, $bypkg)
{
my ($self, $todo, $pkg, $bypkg) = @_;
my $name = $self->fullname;
if (defined $todo->{$name}) {
push(@{$bypkg->{$pkg}}, $name);
@ -38,9 +36,8 @@ package OpenBSD::CollisionReport;
use OpenBSD::PackingList;
use OpenBSD::PackageInfo;
sub find_collisions
sub find_collisions($todo, $state)
{
my ($todo, $state) = @_;
my $verbose = $state->verbose >= 3;
my $bypkg = {};
for my $name (keys %$todo) {
@ -68,10 +65,8 @@ sub find_collisions
return $bypkg;
}
sub collision_report
sub collision_report($list, $state, $set)
{
my ($list, $state, $set) = @_;
my $destdir = $state->{destdir};
if ($state->defines('removecollisions')) {

View File

@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
# $OpenBSD: Delete.pm,v 1.167 2023/05/27 10:01:08 espie Exp $
# $OpenBSD: Delete.pm,v 1.168 2023/06/13 09:07:17 espie Exp $
#
# Copyright (c) 2003-2014 Marc Espie <espie@openbsd.org>
#
@ -15,8 +15,7 @@
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
use strict;
use warnings;
use v5.36;
package OpenBSD::Delete;
use OpenBSD::Error;
@ -25,9 +24,8 @@ use OpenBSD::RequiredBy;
use OpenBSD::Paths;
use File::Basename;
sub keep_old_files
sub keep_old_files($state, $plist)
{
my ($state, $plist) = @_;
my $p = OpenBSD::PackingList->new;
my $borked = borked_package($plist->pkgname);
$p->set_infodir(installed_info($borked));
@ -39,9 +37,8 @@ sub keep_old_files
return $borked;
}
sub manpages_unindex
sub manpages_unindex($state)
{
my ($state) = @_;
return unless defined $state->{rmman};
my $destdir = $state->{destdir};
@ -57,17 +54,13 @@ sub manpages_unindex
delete $state->{rmman};
}
sub validate_plist
sub validate_plist($plist, $state)
{
my ($plist, $state) = @_;
$plist->prepare_for_deletion($state, $plist->pkgname);
}
sub remove_packing_info
sub remove_packing_info($plist, $state)
{
my ($plist, $state) = @_;
my $dir = $plist->infodir;
for my $fname (info_names()) {
@ -79,9 +72,8 @@ sub remove_packing_info
$state->fatal("can't finish removing directory #1: #2", $dir, $!);
}
sub delete_handle
sub delete_handle($handle, $state)
{
my ($handle, $state) = @_;
my $pkgname = $handle->pkgname;
my $plist = $handle->plist;
if ($plist->has('firmware') && !$state->defines('FW_UPDATE')) {
@ -107,10 +99,8 @@ sub delete_handle
delete_plist($plist, $state);
}
sub unregister_dependencies
sub unregister_dependencies($plist, $state)
{
my ($plist, $state) = @_;
my $pkgname = $plist->pkgname;
my $l = OpenBSD::Requiring->new($pkgname);
@ -127,10 +117,8 @@ sub unregister_dependencies
$l->erase;
}
sub delete_plist
sub delete_plist($plist, $state)
{
my ($plist, $state) = @_;
my $pkgname = $plist->pkgname;
$state->{pkgname} = $pkgname;
if (!$state->defines('stub')) {
@ -156,9 +144,8 @@ sub delete_plist
package OpenBSD::PackingElement;
sub rename_file_to_temp
sub rename_file_to_temp($self, $state)
{
my ($self, $state) = @_;
require OpenBSD::Temp;
my $n = $self->realname($state);
@ -181,39 +168,36 @@ sub rename_file_to_temp
}
# $self->prepare_for_deletion($state, $pkgname)
sub prepare_for_deletion
sub prepare_for_deletion($, $, $)
{
}
# $self->delete($state)
sub delete
sub delete($, $)
{
}
# $self->record_shared($recorder, $pkgname)
sub record_shared
sub record_shared($, $, $)
{
}
sub copy_old_stuff
sub copy_old_stuff($self, $plist, $state)
{
}
package OpenBSD::PackingElement::Cwd;
sub copy_old_stuff
sub copy_old_stuff($self, $plist, $state)
{
my ($self, $plist, $state) = @_;
$self->add_object($plist);
}
package OpenBSD::PackingElement::FileObject;
use File::Basename;
sub mark_directory
sub mark_directory($self, $state, $dir)
{
my ($self, $state, $dir) = @_;
$state->{dirs_okay}{$dir} = 1;
my $d2 = dirname($dir);
if ($d2 ne $dir) {
@ -221,17 +205,13 @@ sub mark_directory
}
}
sub mark_dir
sub mark_dir($self, $state)
{
my ($self, $state) = @_;
$self->mark_directory($state, dirname($self->fullname));
}
sub do_not_delete
sub do_not_delete($self, $state)
{
my ($self, $state) = @_;
my $realname = $self->realname($state);
$state->{baddelete} = 1;
$self->{stillaround} = 1;
@ -252,27 +232,23 @@ sub do_not_delete
package OpenBSD::PackingElement::DirlikeObject;
sub mark_dir
sub mark_dir($self, $state)
{
my ($self, $state) = @_;
$self->mark_directory($state, $self->fullname);
}
package OpenBSD::PackingElement::RcScript;
# XXX we should check stuff more thoroughly
sub delete
sub delete($self, $state)
{
my ($self, $state) = @_;
$state->{delete_rcscripts}{$self->fullname} = 1;
$self->SUPER::delete($state);
}
package OpenBSD::PackingElement::NewUser;
sub delete
sub delete($self, $state)
{
my ($self, $state) = @_;
if ($state->verbose >= 2) {
$state->say("rmuser: #1", $self->name);
}
@ -280,17 +256,14 @@ sub delete
$self->record_shared($state->{recorder}, $state->{pkgname});
}
sub record_shared
sub record_shared($self, $recorder, $pkgname)
{
my ($self, $recorder, $pkgname) = @_;
$recorder->{users}{$self->name} = $pkgname;
}
package OpenBSD::PackingElement::NewGroup;
sub delete
sub delete($self, $state)
{
my ($self, $state) = @_;
if ($state->verbose >= 2) {
$state->say("rmgroup: #1", $self->name);
}
@ -298,24 +271,20 @@ sub delete
$self->record_shared($state->{recorder}, $state->{pkgname});
}
sub record_shared
sub record_shared($self, $recorder, $pkgname)
{
my ($self, $recorder, $pkgname) = @_;
$recorder->{groups}{$self->name} = $pkgname;
}
package OpenBSD::PackingElement::DirBase;
sub prepare_for_deletion
sub prepare_for_deletion($self, $state, $pkgname)
{
my ($self, $state, $pkgname) = @_;
$state->vstat->remove_directory(
$self->retrieve_fullname($state, $pkgname), $self);
}
sub delete
sub delete($self, $state)
{
my ($self, $state) = @_;
if ($state->verbose >= 5) {
$state->say("rmdir: #1", $self->fullname);
}
@ -323,66 +292,59 @@ sub delete
$self->record_shared($state->{recorder}, $state->{pkgname});
}
sub record_shared
sub record_shared($self, $recorder, $pkgname)
{
my ($self, $recorder, $pkgname) = @_;
# enough for the entry to exist, we only record interesting
# entries more thoroughly
$recorder->{dirs}{$self->fullname} //= [];
}
package OpenBSD::PackingElement::Mandir;
sub record_shared
sub record_shared($self, $recorder, $pkgname)
{
my ($self, $recorder, $pkgname) = @_;
$self->{pkgname} = $pkgname;
push(@{$recorder->{dirs}{$self->fullname}} , $self);
}
package OpenBSD::PackingElement::Fontdir;
sub record_shared
sub record_shared($self, $recorder, $pkgname)
{
my ($self, $recorder, $pkgname) = @_;
$self->{pkgname} = $pkgname;
push(@{$recorder->{dirs}{$self->fullname}} , $self);
$recorder->{fonts_todo}{$self->fullname} = 1;
}
package OpenBSD::PackingElement::Infodir;
sub record_shared
sub record_shared # forwarder
{
&OpenBSD::PackingElement::Mandir::record_shared;
}
package OpenBSD::PackingElement::Unexec;
sub delete
sub delete($self, $state)
{
my ($self, $state) = @_;
if ($self->should_run($state)) {
$self->run($state);
}
}
sub should_run { 1 }
sub should_run($, $) { 1 }
package OpenBSD::PackingElement::UnexecDelete;
sub should_run
sub should_run($self, $state)
{
my ($self, $state) = @_;
return !$state->replacing;
}
package OpenBSD::PackingElement::UnexecUpdate;
sub should_run
sub should_run($self, $state)
{
my ($self, $state) = @_;
return $state->replacing;
}
package OpenBSD::PackingElement::DefineTag::Atend;
sub delete
sub delete($self, $state)
{
my ($self, $state) = @_;
if (!$state->replacing) {
$state->{tags}{deleted}{$self->name} = 1;
}
@ -390,10 +352,8 @@ sub delete
package OpenBSD::PackingElement::Tag;
sub delete
sub delete($self, $state)
{
my ($self, $state) = @_;
for my $d (@{$self->{definition_list}}) {
$d->add_tag($self, "delete", $state);
}
@ -402,10 +362,8 @@ sub delete
package OpenBSD::PackingElement::FileBase;
use OpenBSD::Error;
sub prepare_for_deletion
sub prepare_for_deletion($self, $state, $pkgname)
{
my ($self, $state, $pkgname) = @_;
my $fname = $self->retrieve_fullname($state, $pkgname);
my $s;
my $size = $self->{tied} ? 0 : $self->retrieve_size;
@ -420,9 +378,8 @@ sub prepare_for_deletion
}
}
sub is_intact
sub is_intact($self, $state, $realname)
{
my ($self, $state, $realname) = @_;
return 1 if defined($self->{link}) or $self->{nochecksum};
if (!defined $self->{d}) {
if ($self->fullname eq $realname) {
@ -447,9 +404,8 @@ sub is_intact
return 0;
}
sub delete
sub delete($self, $state)
{
my ($self, $state) = @_;
my $realname = $self->realname($state);
return if defined $state->{current_set}{dont_delete}{$realname};
@ -502,10 +458,8 @@ sub delete
}
}
sub copy_old_stuff
sub copy_old_stuff($self, $plist, $state)
{
my ($self, $plist, $state) = @_;
if (defined $self->{stillaround}) {
delete $self->{stillaround};
if ($state->replacing) {
@ -518,26 +472,24 @@ sub copy_old_stuff
package OpenBSD::PackingElement::SpecialFile;
use OpenBSD::PackageInfo;
sub copy_old_stuff
sub copy_old_stuff($, $, $)
{
}
package OpenBSD::PackingElement::Meta;
sub copy_old_stuff
sub copy_old_stuff($self, $plist, $state)
{
my ($self, $plist, $state) = @_;
$self->add_object($plist);
}
package OpenBSD::PackingElement::DigitalSignature;
sub copy_old_stuff
sub copy_old_stuff($, $, $)
{
}
package OpenBSD::PackingElement::FDESC;
sub copy_old_stuff
sub copy_old_stuff($self, $plist, $state)
{
my ($self, $plist, $state) = @_;
require File::Copy;
File::Copy::copy($self->fullname, $plist->infodir);
@ -548,9 +500,8 @@ package OpenBSD::PackingElement::Sample;
use OpenBSD::Error;
use File::Basename;
sub delete
sub delete($self, $state)
{
my ($self, $state) = @_;
my $realname = $self->realname($state);
my $orig = $self->{copyfrom};
@ -603,9 +554,8 @@ sub delete
package OpenBSD::PackingElement::InfoFile;
use File::Basename;
use OpenBSD::Error;
sub delete
sub delete($self, $state)
{
my ($self, $state) = @_;
unless ($state->{not}) {
my $fullname = $state->{destdir}.$self->fullname;
$state->vsystem(OpenBSD::Paths->install_info,
@ -615,9 +565,8 @@ sub delete
}
package OpenBSD::PackingElement::Shell;
sub delete
sub delete($self, $state)
{
my ($self, $state) = @_;
unless ($state->{not}) {
my $destdir = $state->{destdir};
my $fullname = $self->fullname;
@ -645,9 +594,8 @@ sub delete
package OpenBSD::PackingElement::Extra;
use File::Basename;
sub delete
sub delete($self, $state)
{
my ($self, $state) = @_;
return if defined $state->{current_set}{known_extra}{$self->fullname};
my $realname = $self->realname($state);
if ($state->verbose >= 2 && $state->{extra}) {
@ -666,9 +614,8 @@ sub delete
package OpenBSD::PackingElement::Extradir;
sub delete
sub delete($self, $state)
{
my ($self, $state) = @_;
return unless $state->{extra};
return if defined $state->{current_set}{known_extra}{$self->fullname};
my $realname = $self->realname($state);
@ -682,9 +629,8 @@ sub delete
package OpenBSD::PackingElement::ExtraUnexec;
sub delete
sub delete($self, $state)
{
my ($self, $state) = @_;
if ($state->{extra}) {
$self->run($state);
} else {
@ -693,34 +639,29 @@ sub delete
}
package OpenBSD::PackingElement::Lib;
sub delete
sub delete($self, $state)
{
my ($self, $state) = @_;
$self->SUPER::delete($state);
$self->mark_ldconfig_directory($state);
}
package OpenBSD::PackingElement::Depend;
sub copy_old_stuff
sub copy_old_stuff($self, $plist, $state)
{
my ($self, $plist, $state) = @_;
OpenBSD::PackingElement::Comment->add($plist,
"\@".$self->keyword." ".$self->stringize);
}
package OpenBSD::PackingElement::FDISPLAY;
sub delete
sub delete($self, $state)
{
my ($self, $state) = @_;
$state->{current_set}{known_displays}{$self->{d}->key} = 1;
$self->SUPER::delete($state);
}
package OpenBSD::PackingElement::FUNDISPLAY;
sub delete
sub delete($self, $state)
{
my ($self, $state) = @_;
my $d = $self->{d};
if (!$state->{current_set}{known_displays}{$self->{d}->key}) {
$self->prepare($state);
@ -729,9 +670,8 @@ sub delete
}
package OpenBSD::PackingElement::Mandir;
sub delete
sub delete($self, $state)
{
my ($self, $state) = @_;
$state->{current_set}{known_mandirs}{$self->fullname} = 1;
$self->SUPER::delete($state);
}

View File

@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
# $OpenBSD: Dependencies.pm,v 1.174 2023/05/21 16:07:35 espie Exp $
# $OpenBSD: Dependencies.pm,v 1.175 2023/06/13 09:07:17 espie Exp $
#
# Copyright (c) 2005-2010 Marc Espie <espie@openbsd.org>
#
@ -14,55 +14,48 @@
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
use strict;
use warnings;
use v5.36;
use OpenBSD::Dependencies::SolverBase;
package _cache;
sub new
sub new($class, $v)
{
my ($class, $v) = @_;
bless \$v, $class;
}
sub pretty
sub pretty($self)
{
my $self = shift;
return ref($self)."(".$$self.")";
}
package _cache::self;
our @ISA=(qw(_cache));
sub do
sub do($v, $solver, $state, $dep, $package)
{
my ($v, $solver, $state, $dep, $package) = @_;
push(@{$package->{before}}, $$v);
return $$v;
}
package _cache::installed;
our @ISA=(qw(_cache));
sub do
sub do($v, $solver, $state, $dep, $package)
{
my ($v, $solver, $state, $dep, $package) = @_;
return $$v;
}
package _cache::bad;
our @ISA=(qw(_cache));
sub do
sub do($v, $solver, $state, $dep, $package)
{
my ($v, $solver, $state, $dep, $package) = @_;
return $$v;
}
package _cache::to_install;
our @ISA=(qw(_cache));
sub do
sub do($v, $solver, $state, $dep, $package)
{
my ($v, $solver, $state, $dep, $package) = @_;
if ($state->tracker->{uptodate}{$$v}) {
bless $v, "_cache::installed";
$solver->set_global($dep, $v);
@ -88,9 +81,8 @@ sub do
package _cache::to_update;
our @ISA=(qw(_cache));
sub do
sub do($v, $solver, $state, $dep, $package)
{
my ($v, $solver, $state, $dep, $package) = @_;
my $alt = $solver->find_dep_in_self($state, $dep);
if ($alt) {
$solver->set_cache($dep, _cache::self->new($alt));
@ -125,23 +117,18 @@ our @ISA = qw(OpenBSD::Dependencies::SolverBase);
use OpenBSD::PackageInfo;
sub merge
sub merge($solver, @extra)
{
my ($solver, @extra) = @_;
$solver->clone('cache', @extra);
}
sub new
sub new($class, $set)
{
my ($class, $set) = @_;
bless { set => $set, bad => [] }, $class;
}
sub check_for_loops
sub check_for_loops($self, $state)
{
my ($self, $state) = @_;
my $initial = $self->{set};
my @todo = ();
@ -185,10 +172,8 @@ sub check_for_loops
}
}
sub find_dep_in_repositories
sub find_dep_in_repositories($self, $state, $dep)
{
my ($self, $state, $dep) = @_;
return unless $dep->spec->is_valid;
my $default = $dep->{def};
@ -224,10 +209,8 @@ sub find_dep_in_repositories
}
}
sub find_dep_in_stuff_to_install
sub find_dep_in_stuff_to_install($self, $state, $dep)
{
my ($self, $state, $dep) = @_;
my $v = $self->find_candidate($dep,
keys %{$state->tracker->{uptodate}});
if ($v) {
@ -257,10 +240,8 @@ sub find_dep_in_stuff_to_install
return $v;
}
sub really_solve_dependency
sub really_solve_dependency($self, $state, $dep, $package)
{
my ($self, $state, $dep, $package) = @_;
my $v;
if ($state->{allow_replacing}) {
@ -318,10 +299,8 @@ sub really_solve_dependency
return $v;
}
sub check_depends
sub check_depends($self)
{
my $self = shift;
for my $dep ($self->dependencies) {
push(@{$self->{bad}}, $dep)
unless is_installed($dep) or
@ -330,10 +309,8 @@ sub check_depends
return $self->{bad};
}
sub register_dependencies
sub register_dependencies($self, $state)
{
my ($self, $state) = @_;
require OpenBSD::RequiredBy;
for my $pkg ($self->{set}->newer) {
my $pkgname = $pkg->pkgname;
@ -346,9 +323,8 @@ sub register_dependencies
}
}
sub repair_dependencies
sub repair_dependencies($self, $state)
{
my ($self, $state) = @_;
for my $p ($self->{set}->newer) {
my $pkgname = $p->pkgname;
for my $pkg (installed_packages(1)) {
@ -359,9 +335,8 @@ sub repair_dependencies
}
}
sub find_old_lib
sub find_old_lib($self, $state, $base, $pattern, $lib)
{
my ($self, $state, $base, $pattern, $lib) = @_;
require OpenBSD::Search;
@ -375,17 +350,13 @@ sub find_old_lib
return undef;
}
sub errsay_library
sub errsay_library($solver, $state, $h)
{
my ($solver, $state, $h) = @_;
$state->errsay("Can't install #1 because of libraries", $h->pkgname);
}
sub solve_old_depends
sub solve_old_depends($self, $state)
{
my ($self, $state) = @_;
$self->{old_dependencies} = {};
for my $package ($self->{set}->older) {
for my $dep (@{$package->dependency_info->{depend}}) {
@ -397,9 +368,8 @@ sub solve_old_depends
}
}
sub solve_handle_tags
sub solve_handle_tags($solver, $h, $state)
{
my ($solver, $h, $state) = @_;
my $plist = $h->plist;
return 1 if !defined $plist->{tags};
my $okay = 1;
@ -415,10 +385,8 @@ sub solve_handle_tags
return $okay;
}
sub solve_tags
sub solve_tags($solver, $state)
{
my ($solver, $state) = @_;
my $okay = 1;
for my $h ($solver->{set}->changed_handles) {
if (!$solver->solve_handle_tags($h, $state)) {
@ -433,14 +401,13 @@ sub solve_tags
}
package OpenBSD::PackingElement;
sub repair_dependency
sub repair_dependency($, $, $)
{
}
package OpenBSD::PackingElement::Dependency;
sub repair_dependency
sub repair_dependency($self, $requiring, $required)
{
my ($self, $requiring, $required) = @_;
if ($self->spec->filter($required) == 1) {
require OpenBSD::RequiredBy;
OpenBSD::RequiredBy->new($required)->add($requiring);

View File

@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
# $OpenBSD: SolverBase.pm,v 1.15 2023/05/27 10:08:45 espie Exp $
# $OpenBSD: SolverBase.pm,v 1.16 2023/06/13 09:07:18 espie Exp $
#
# Copyright (c) 2005-2018 Marc Espie <espie@openbsd.org>
#
@ -14,17 +14,18 @@
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
use strict;
use warnings;
use v5.36;
# generic dependencies lookup class: walk the dependency tree as far
# as necessary to resolve dependencies
package OpenBSD::lookup;
sub lookup
{
my ($self, $solver, $dependencies, $state, $obj) = @_;
# this is a template method that relies on subclasses defining
# find_in_already_done, find_in_extra_sources, find_in_new_source
# and find_elsewhere accordingly
sub lookup($self, $solver, $dependencies, $state, $obj)
{
my $known = $self->{known};
if (my $r = $self->find_in_already_done($solver, $state, $obj)) {
$dependencies->{$r} = 1;
@ -71,9 +72,8 @@ sub lookup
# While walking the dependency tree, we may loop back to an older package,
# because we're relying on dep lists on disk, that we haven't adjusted yet
# since we're just checking. We need to prepare for the update here as well!
sub may_adjust
sub may_adjust($self, $solver, $state, $dep)
{
my ($self, $solver, $state, $dep) = @_;
my $h = $solver->{set}{older}{$dep};
if (defined $h) {
$state->print("Detecting older #1...", $dep)
@ -93,19 +93,15 @@ sub may_adjust
return undef;
}
sub new
sub new($class, $solver)
{
my ($class, $solver) = @_;
# prepare for closure
my @todo = $solver->dependencies;
bless { todo => \@todo, done => {}, known => {} }, $class;
}
sub dump
sub dump($self, $state)
{
my ($self, $state) = @_;
return unless %{$self->{done}};
$state->say("Full dependency tree is #1",
join(' ', keys %{$self->{done}}));
@ -114,19 +110,14 @@ sub dump
package OpenBSD::lookup::library;
our @ISA=qw(OpenBSD::lookup);
sub say_found
sub say_found($self, $state, $obj, $where)
{
my ($self, $state, $obj, $where) = @_;
$state->say("found libspec #1 in #2", $obj->to_string, $where)
if $state->verbose >= 3;
}
sub find_in_already_done
sub find_in_already_done($self, $solver, $state, $obj)
{
my ($self, $solver, $state, $obj) = @_;
my $r = $solver->check_lib_spec($state, $solver->{localbase}, $obj,
$self->{known});
if ($r) {
@ -137,9 +128,8 @@ sub find_in_already_done
}
}
sub find_in_extra_sources
sub find_in_extra_sources($self, $solver, $state, $obj)
{
my ($self, $solver, $state, $obj) = @_;
return undef if !$obj->is_valid || defined $obj->{dir};
$state->shlibs->add_libs_from_system($state->{destdir});
@ -152,10 +142,8 @@ sub find_in_extra_sources
return undef;
}
sub find_in_new_source
sub find_in_new_source($self, $solver, $state, $obj, $dep)
{
my ($self, $solver, $state, $obj, $dep) = @_;
if (defined $solver->{set}{newer}{$dep}) {
$state->shlibs->add_libs_from_plist($solver->{set}{newer}{$dep}->plist);
} else {
@ -168,10 +156,8 @@ sub find_in_new_source
return undef;
}
sub find_elsewhere
sub find_elsewhere($self, $solver, $state, $obj)
{
my ($self, $solver, $state, $obj) = @_;
for my $n ($solver->{set}->newer) {
for my $dep (@{$n->dependency_info->{depend}}) {
my $r = $solver->find_old_lib($state,
@ -188,10 +174,8 @@ sub find_elsewhere
package OpenBSD::lookup::tag;
our @ISA=qw(OpenBSD::lookup);
sub new
sub new($class, $solver, $state)
{
my ($class, $solver, $state) = @_;
# prepare for closure
if (!defined $solver->{old_dependencies}) {
$solver->solve_old_depends($state);
@ -200,17 +184,16 @@ sub new
bless { todo => \@todo, done => {}, known => {} }, $class;
}
sub find_in_extra_sources
sub find_in_extra_sources($, $, $, $)
{
}
sub find_elsewhere
sub find_elsewhere($, $, $, $)
{
}
sub find_in_already_done
sub find_in_already_done($self, $solver, $state, $obj)
{
my ($self, $solver, $state, $obj) = @_;
my $r = $self->{known_tags}{$obj->name};
if (defined $r) {
my ($dep, $d) = @$r;
@ -222,9 +205,8 @@ sub find_in_already_done
return undef;
}
sub find_in_plist
sub find_in_plist($self, $plist, $dep)
{
my ($self, $plist, $dep) = @_;
if (defined $plist->{tags_definitions}) {
while (my ($name, $d) = each %{$plist->{tags_definitions}}) {
$self->{known_tags}{$name} = [$dep, $d];
@ -232,9 +214,8 @@ sub find_in_plist
}
}
sub find_in_new_source
sub find_in_new_source($self, $solver, $state, $obj, $dep)
{
my ($self, $solver, $state, $obj, $dep) = @_;
my $plist;
if (defined $solver->{set}{newer}{$dep}) {
@ -254,9 +235,8 @@ sub find_in_new_source
# both the solver and the conflict cache inherit from cloner
# they both want to merge several hashes from extra data.
package OpenBSD::Cloner;
sub clone
sub clone($self, $h, @extra)
{
my ($self, $h, @extra) = @_;
for my $extra (@extra) {
next unless defined $extra;
while (my ($k, $e) = each %{$extra->{$h}}) {
@ -274,34 +254,29 @@ our @ISA = qw(OpenBSD::Cloner);
my $global_cache = {};
sub cached
sub cached($self, $dep)
{
my ($self, $dep) = @_;
return $global_cache->{$dep->{pattern}} ||
$self->{cache}{$dep->{pattern}};
}
sub set_cache
sub set_cache($self, $dep, $value)
{
my ($self, $dep, $value) = @_;
$self->{cache}{$dep->{pattern}} = $value;
}
sub set_global
sub set_global($self, $dep, $value)
{
my ($self, $dep, $value) = @_;
$global_cache->{$dep->{pattern}} = $value;
}
sub global_cache
sub global_cache($self, $pattern)
{
my ($self, $pattern) = @_;
return $global_cache->{$pattern};
}
sub find_candidate
sub find_candidate($self, $dep, @list)
{
my ($self, $dep, @list) = @_;
my @candidates = $dep->spec->filter(@list);
if (@candidates >= 1) {
return $candidates[0];
@ -310,10 +285,8 @@ sub find_candidate
}
}
sub solve_dependency
sub solve_dependency($self, $state, $dep, $package)
{
my ($self, $state, $dep, $package) = @_;
my $v;
if (defined $self->cached($dep)) {
@ -335,10 +308,8 @@ sub solve_dependency
$state->solve_dependency($self, $dep, $package);
}
sub solve_depends
sub solve_depends($self, $state)
{
my ($self, $state) = @_;
$self->{all_dependencies} = {};
$self->{to_register} = {};
$self->{deplist} = {};
@ -358,9 +329,8 @@ sub solve_depends
return sort values %{$self->{deplist}};
}
sub solve_wantlibs
sub solve_wantlibs($solver, $state)
{
my ($solver, $state) = @_;
my $okay = 1;
my $lib_finder = OpenBSD::lookup::library->new($solver);
@ -384,9 +354,8 @@ sub solve_wantlibs
return $okay;
}
sub dump
sub dump($self, $state)
{
my ($self, $state) = @_;
if ($self->dependencies) {
$state->print("Direct dependencies for #1 resolve to #2",
$self->{set}->print, join(' ', $self->dependencies));
@ -397,9 +366,8 @@ sub dump
}
}
sub dependencies
sub dependencies($self)
{
my $self = shift;
if (wantarray) {
return keys %{$self->{all_dependencies}};
} else {
@ -407,9 +375,8 @@ sub dependencies
}
}
sub check_lib_spec
sub check_lib_spec($self, $state, $base, $spec, $dependencies)
{
my ($self, $state, $base, $spec, $dependencies) = @_;
my $r = $state->shlibs->lookup_libspec($base, $spec);
for my $candidate (@$r) {
if ($dependencies->{$candidate->origin}) {
@ -419,24 +386,19 @@ sub check_lib_spec
return;
}
sub find_dep_in_installed
sub find_dep_in_installed($self, $state, $dep)
{
my ($self, $state, $dep) = @_;
return $self->find_candidate($dep, @{$self->installed_list});
}
sub find_dep_in_self
sub find_dep_in_self($self, $state, $dep)
{
my ($self, $state, $dep) = @_;
return $self->find_candidate($dep, $self->{set}->newer_names,
$self->{set}->kept_names);
}
sub find_in_self
sub find_in_self($solver, $plist, $state, $tag)
{
my ($solver, $plist, $state, $tag) = @_;
return 0 unless defined $plist->{tags_definitions}{$tag->name};
$tag->{definition_list} = $plist->{tags_definitions}{$tag->name};
$tag->{found_in_self} = 1;
@ -447,8 +409,7 @@ sub find_in_self
use OpenBSD::PackageInfo;
OpenBSD::Auto::cache(installed_list,
sub {
my $self = shift;
sub($self) {
my @l = installed_packages();
for my $o ($self->{set}->older_names) {
@ -458,16 +419,14 @@ OpenBSD::Auto::cache(installed_list,
}
);
sub add_dep
sub add_dep($self, $d)
{
my ($self, $d) = @_;
$self->{deplist}{$d} = $d;
}
sub verify_tag
sub verify_tag($self, $tag, $state, $plist, $is_old)
{
my ($self, $tag, $state, $plist, $is_old) = @_;
my $bad_return = $is_old ? 1 : 0;
my $type = $is_old ? "Warning" : "Error";
my $msg = "#1 in #2: \@tag #3";

View File

@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
# $OpenBSD: Error.pm,v 1.42 2023/05/27 10:01:21 espie Exp $
# $OpenBSD: Error.pm,v 1.43 2023/06/13 09:07:17 espie Exp $
#
# Copyright (c) 2004-2010 Marc Espie <espie@openbsd.org>
#
@ -14,18 +14,15 @@
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
use strict;
use warnings;
use v5.36;
# this is a set of common classes related to error handling in pkg land
package OpenBSD::Auto;
sub cache :prototype(*&)
sub cache :prototype(*&)($sym, $code)
{
my ($sym, $code) = @_;
my $callpkg = caller;
my $actual = sub {
my $self = shift;
my $actual = sub($self) {
return $self->{$sym} //= &$code($self);
};
no strict 'refs';
@ -36,40 +33,35 @@ package OpenBSD::SigHandler;
# instead of "local" sighandlers, let's do objects that revert
# to their former state afterwards
sub new
sub new($class)
{
my $class = shift;
# keep previous state
bless {}, $class;
}
sub DESTROY
sub DESTROY($self)
{
my $self = shift;
while (my ($s, $v) = each %$self) {
$SIG{$s} = $v;
}
}
sub set
sub set($self, @p)
{
my $self = shift;
my $v = pop;
for my $s (@_) {
my $v = pop @p;
for my $s (@p) {
$self->{$s} = $SIG{$s};
$SIG{$s} = $v;
}
return $self;
}
sub intercept
sub intercept($self, @p)
{
my $self = shift;
my $v = pop;
return $self->set(@_,
sub {
my $sig = shift;
my $v = pop @p;
return $self->set(@p,
sub($sig, @) {
&$v($sig);
$SIG{$sig} = $self->{$sig};
kill -$sig, $$;
@ -93,9 +85,8 @@ my $atend = {};
# hash of code to run on fatal signals
my $cleanup = {};
sub cleanup
sub cleanup($class, $sig)
{
my ($class, $sig) = @_;
# XXX note that order of cleanup is "unpredictable"
for my $v (values %$cleanup) {
&$v($sig);
@ -106,34 +97,31 @@ END {
# XXX localize $? so that cleanup doesn't fuck up our exit code
local $?;
for my $v (values %$atend) {
&$v();
&$v(undef);
}
}
# register each code block "by name" so that we can re-register each
# block several times
sub register
sub register($class, $code)
{
my ($class, $code) = @_;
$cleanup->{$code} = $code;
}
sub atend
sub atend($class, $code)
{
my ($class, $code) = @_;
$cleanup->{$code} = $code;
$atend->{$code} = $code;
}
my $handler = sub {
my $sig = shift;
my $handler = sub($sig, @) {
__PACKAGE__->cleanup($sig);
# after cleanup, just propagate the signal
$SIG{$sig} = 'DEFAULT';
kill $sig, $$;
};
sub reset
sub reset($)
{
for my $sig (qw(INT QUIT HUP KILL TERM)) {
$SIG{$sig} = $handler;
@ -153,9 +141,8 @@ our ($FileName, $Line, $FullMessage);
our @INTetc = (qw(INT QUIT HUP TERM));
use Carp;
sub dienow
sub dienow($error, $handler)
{
my ($error, $handler) = @_;
if ($error) {
if ($error =~ m/^(.*?)(?:\s+at\s+(.*)\s+line\s+(\d+)\.?)?$/o) {
local $_ = $1;
@ -170,48 +157,44 @@ sub dienow
}
}
sub try :prototype(&@)
sub try :prototype(&@)($try, $catch)
{
my ($try, $catch) = @_;
eval { &$try };
eval { &$try() };
dienow($@, $catch);
}
sub throw
sub throw(@p)
{
croak @_;
croak @p;
}
sub rethrow
sub rethrow($e)
{
my $e = shift;
die $e if $e;
}
sub catch :prototype(&)
sub catch :prototype(&)($code)
{
bless $_[0], "OpenBSD::Error::catch";
bless $code, "OpenBSD::Error::catch";
}
sub rmtree
sub rmtree($class, @p)
{
my $class = shift;
require File::Path;
require Cwd;
# XXX make sure we live somewhere
Cwd::getcwd() || chdir('/');
File::Path::rmtree(@_);
File::Path::rmtree(@p);
}
package OpenBSD::Error::catch;
# TODO why keep the data we don't use ?...
sub exec
sub exec($self, $fullerror, $error, $filename, $line)
{
my ($self, $full, $e) = @_;
&$self;
&$self();
}
1;

View File

@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
# $OpenBSD: ForwardDependencies.pm,v 1.17 2021/10/12 09:06:37 espie Exp $
# $OpenBSD: ForwardDependencies.pm,v 1.18 2023/06/13 09:07:17 espie Exp $
#
# Copyright (c) 2009 Marc Espie <espie@openbsd.org>
#
@ -16,16 +16,14 @@
# handling of forward dependency adjustments
use strict;
use warnings;
use v5.36;
package OpenBSD::ForwardDependencies;
require OpenBSD::RequiredBy;
sub find
sub find($class, $set)
{
my ($class, $set) = @_;
my $forward = {};
for my $old ($set->older) {
for my $f (OpenBSD::RequiredBy->new($old->pkgname)->list) {
@ -36,10 +34,8 @@ sub find
bless { forward => $forward, set => $set}, $class;
}
sub find_belated_update
sub find_belated_update($set, $state, $old)
{
my ($set, $state, $old) = @_;
for my $n ($set->newer) {
if ($n->conflict_list->conflicts_with($old->pkgname)) {
if (defined $old->{update_found}) {
@ -54,9 +50,8 @@ sub find_belated_update
return $old->{update_found};
}
sub adjust
sub adjust($self, $state)
{
my ($self, $state) = @_;
my $set = $self->{set};
for my $f (keys %{$self->{forward}}) {
@ -93,9 +88,8 @@ sub adjust
}
}
sub dump
sub dump($self, $result, $state)
{
my ($self, $result, $state) = @_;
$state->say("#1 forward dependencies:", $self->{set}->print);
while (my ($pkg, $l) = each %$result) {
if (@$l == 1) {
@ -109,10 +103,8 @@ sub dump
}
}
sub check
sub check($self, $state)
{
my ($self, $state) = @_;
my @r = keys %{$self->{forward}};
my $set = $self->{set};
my $result = {};
@ -141,15 +133,13 @@ sub check
}
package OpenBSD::PackingElement;
sub check_forward_dependency
sub check_forward_dependency($, $, $, $, $)
{
}
package OpenBSD::PackingElement::Dependency;
sub check_forward_dependency
sub check_forward_dependency($self, $f, $old, $new, $r)
{
my ($self, $f, $old, $new, $r) = @_;
# nothing to validate if old dependency doesn't concern us.
return unless $self->spec->filter(@$old);
# nothing to do if new dependency just matches

View File

@ -1,7 +1,7 @@
#! /usr/bin/perl
# ex:ts=8 sw=4:
# $OpenBSD: FwUpdate.pm,v 1.34 2022/03/10 07:18:24 hastings Exp $
# $OpenBSD: FwUpdate.pm,v 1.35 2023/06/13 09:07:17 espie Exp $
#
# Copyright (c) 2014 Marc Espie <espie@openbsd.org>
#
@ -17,8 +17,7 @@
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
use strict;
use warnings;
use v5.36;
use OpenBSD::PkgAdd;
use OpenBSD::PackageRepository;
use OpenBSD::PackageLocator;
@ -26,9 +25,8 @@ use OpenBSD::PackageLocator;
package OpenBSD::FwUpdate::Locator;
our @ISA = qw(OpenBSD::PackageLocator);
sub add_default
sub add_default($self, $state, $p)
{
my ($self, $state, $p) = @_;
my $path = $state->opt('p');
if (!$path) {
my $dir = OpenBSD::Paths->os_directory;
@ -43,19 +41,18 @@ sub add_default
package OpenBSD::FwUpdate::State;
our @ISA = qw(OpenBSD::PkgAdd::State);
sub cache_directory
sub cache_directory($)
{
return undef;
}
sub locator
sub locator($)
{
return "OpenBSD::FwUpdate::Locator";
}
sub handle_options
sub handle_options($state)
{
my $state = shift;
$state->OpenBSD::State::handle_options('adinp:',
'[-adinv] [-D keyword] [-p path] [driver...]');
$state->{not} = $state->opt('n');
@ -83,53 +80,46 @@ sub handle_options
$state->{subst}->add('NO_SCP', 1);
}
sub finish_init
sub finish_init($state)
{
my $state = shift;
delete $state->{signer_list}; # XXX uncache value
$state->{subst}->add('FW_UPDATE', 1);
}
sub installed_drivers
sub installed_drivers($self)
{
my $self = shift;
return keys %{$self->{installed_drivers}};
}
sub is_installed
sub is_installed($self, $driver)
{
my ($self, $driver) = @_;
return $self->{installed_drivers}{$driver};
}
sub machine_drivers
sub machine_drivers($self)
{
my $self = shift;
return keys %{$self->{machine_drivers}};
}
sub all_drivers
sub all_drivers($self)
{
my $self = shift;
return keys %{$self->{all_drivers}};
}
sub is_needed
sub is_needed($self, $driver)
{
my ($self, $driver) = @_;
return $self->{machine_drivers}{$driver};
}
sub display_timestamp
sub display_timestamp($state, $pkgname, $timestamp)
{
my ($state, $pkgname, $timestamp) = @_;
return unless $state->verbose;
$state->SUPER::display_timestamp($pkgname, $timestamp);
}
sub fw_status
sub fw_status($state, $msg, $list)
{
my ($state, $msg, $list) = @_;
return if @$list == 0;
$state->say("#1: #2", $msg, join(' ', @$list));
}
@ -141,7 +131,7 @@ package OpenBSD::FwUpdate;
our @ISA = qw(OpenBSD::PkgAdd);
OpenBSD::Auto::cache(updater,
sub {
sub($) {
require OpenBSD::Update;
return OpenBSD::FwUpdate::Update->new;
});
@ -154,10 +144,8 @@ my %possible_drivers = map {($_, "$_-firmware")}
my %match = map {($_, qr{^\Q$_\E\d+\s+at\s})} (keys %possible_drivers);
$match{'intel'} = qr{^cpu\d+: Intel};
sub parse_dmesg
sub parse_dmesg($self, $f, $search, $found)
{
my ($self, $f, $search, $found) = @_;
while (<$f>) {
chomp;
for my $driver (keys %$search) {
@ -168,9 +156,8 @@ sub parse_dmesg
}
}
sub find_machine_drivers
sub find_machine_drivers($self, $state)
{
my ($self, $state) = @_;
$state->{machine_drivers} = {};
$state->{all_drivers} = \%possible_drivers;
my %search = %possible_drivers;
@ -188,15 +175,13 @@ sub find_machine_drivers
}
}
sub driver2firmware
sub driver2firmware($k)
{
my $k = shift;
return $possible_drivers{$k};
}
sub find_installed_drivers
sub find_installed_drivers($self, $state)
{
my ($self, $state) = @_;
my $inst = $state->repo->installed;
for my $driver (keys %possible_drivers) {
my $search = OpenBSD::Search::Stem->new(driver2firmware($driver));
@ -209,15 +194,13 @@ sub find_installed_drivers
}
sub new_state
sub new_state($self, $cmd)
{
my ($self, $cmd) = @_;
return OpenBSD::FwUpdate::State->new($cmd);
}
sub find_handle
sub find_handle($self, $state, $driver)
{
my ($self, $state, $driver) = @_;
my $pkgname = driver2firmware($driver);
my $set;
my $h = $state->is_installed($driver);
@ -229,9 +212,8 @@ sub find_handle
return $set;
}
sub mark_set_for_deletion
sub mark_set_for_deletion($self, $set, $state)
{
my ($self, $set, $state) = @_;
# XXX to be simplified. Basically, we pre-do the work of the updater...
for my $h ($set->older) {
$h->{update_found} = 1;
@ -240,29 +222,25 @@ sub mark_set_for_deletion
}
# no quirks for firmware, bypass entirely
sub do_quirks
sub do_quirks($self, $state)
{
my ($self, $state) = @_;
$state->finish_init;
}
sub to_remove
sub to_remove($self, $state, $driver)
{
my ($self, $state, $driver) = @_;
$self->mark_set_for_deletion($self->to_add_or_update($state, $driver));
}
sub to_add_or_update
sub to_add_or_update($self, $state, $driver)
{
my ($self, $state, $driver) = @_;
my $set = $self->find_handle($state, $driver);
push(@{$state->{setlist}}, $set);
return $set;
}
sub show_info
sub show_info($self, $state)
{
my ($self, $state) = @_;
my (@installed, @unneeded, @needed);
for my $d ($state->installed_drivers) {
my $h = $state->is_installed($d)->pkgname;
@ -282,15 +260,13 @@ sub show_info
$state->fw_status("Missing", \@needed);
}
sub silence_children
sub silence_children($, $)
{
0
}
sub process_parameters
sub process_parameters($self, $state)
{
my ($self, $state) = @_;
$self->find_machine_drivers($state);
$self->find_installed_drivers($state);

View File

@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
# $OpenBSD: Getopt.pm,v 1.15 2023/05/21 13:44:21 espie Exp $
# $OpenBSD: Getopt.pm,v 1.16 2023/06/13 09:07:17 espie Exp $
#
# Copyright (c) 2006 Marc Espie <espie@openbsd.org>
#
@ -18,8 +18,7 @@
# This is inspired by Getopt::Std, except for the ability to invoke subs
# on options.
use strict;
use warnings;
use v5.36;
package OpenBSD::Getopt;
require Exporter;
@ -27,10 +26,8 @@ require Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw(getopts);
sub handle_option
sub handle_option($opt, $hash, @params)
{
my ($opt, $hash, @params) = @_;
if (defined $hash->{$opt} and ref($hash->{$opt}) eq 'CODE') {
&{$hash->{$opt}}(@params);
} else {
@ -48,10 +45,8 @@ sub handle_option
}
}
sub getopts
sub getopts($args, $hash)
{
my ($args, $hash) = @_;
$hash = {} unless defined $hash;
local @EXPORT;

View File

@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
# $OpenBSD: Handle.pm,v 1.43 2022/05/08 13:21:04 espie Exp $
# $OpenBSD: Handle.pm,v 1.44 2023/06/13 09:07:17 espie Exp $
#
# Copyright (c) 2007-2009 Marc Espie <espie@openbsd.org>
#
@ -18,8 +18,7 @@
# fairly non-descriptive name. Used to store various package information
# during installs and updates.
use strict;
use warnings;
use v5.36;
package OpenBSD::Handle;
@ -34,11 +33,10 @@ use constant {
CANT_DELETE => 5,
};
sub is_real { return 1; }
sub is_real($) { return 1; }
sub cleanup
sub cleanup($self, $error = undef, $errorinfo = undef)
{
my ($self, $error, $errorinfo) = @_;
if (defined $error) {
$self->{error} //= $error;
$self->{errorinfo} //= $errorinfo;
@ -56,21 +54,18 @@ sub cleanup
delete $self->{conflict_list};
}
sub new
sub new($class)
{
my $class = shift;
return bless {}, $class;
}
sub system
sub system($class)
{
my $class = shift;
return OpenBSD::Handle::BaseSystem->new;
}
sub pkgname
sub pkgname($self)
{
my $self = shift;
if (!defined $self->{pkgname}) {
if (defined $self->{plist}) {
$self->{pkgname} = $self->{plist}->pkgname;
@ -87,19 +82,18 @@ sub pkgname
return $self->{pkgname};
}
sub location
sub location($self)
{
return shift->{location};
return $self->{location};
}
sub plist
sub plist($self)
{
return shift->{plist};
return $self->{plist};
}
sub dependency_info
sub dependency_info($self)
{
my $self = shift;
if (defined $self->{plist}) {
return $self->{plist};
} elsif (defined $self->{location} &&
@ -111,20 +105,18 @@ sub dependency_info
}
OpenBSD::Auto::cache(conflict_list,
sub {
sub($self) {
require OpenBSD::PkgCfl;
return OpenBSD::PkgCfl->make_conflict_list(shift->dependency_info);
return OpenBSD::PkgCfl->make_conflict_list($self->dependency_info);
});
sub set_error
sub set_error($self, $error)
{
my ($self, $error) = @_;
$self->{error} = $error;
}
sub has_error
sub has_error($self, $error = undef)
{
my ($self, $error) = @_;
if (!defined $self->{error}) {
return undef;
}
@ -134,15 +126,13 @@ sub has_error
return $self->{error};
}
sub has_reported_error
sub has_reported_error($self)
{
my $self = shift;
return $self->{error_reported};
}
sub error_message
sub error_message($self)
{
my $self = shift;
my $error = $self->{error};
if ($error == BAD_PACKAGE) {
return "bad package";
@ -161,9 +151,8 @@ sub error_message
}
}
sub complete_old
sub complete_old($self)
{
my $self = shift;
my $location = $self->{location};
if (!defined $location) {
@ -180,9 +169,8 @@ sub complete_old
}
}
sub complete_dependency_info
sub complete_dependency_info($self)
{
my $self = shift;
my $location = $self->{location};
if (!defined $location) {
@ -195,10 +183,8 @@ sub complete_dependency_info
}
}
sub create_old
sub create_old($class, $pkgname, $state)
{
my ($class, $pkgname, $state) = @_;
my $self= $class->new;
$self->{name} = $pkgname;
@ -211,28 +197,24 @@ sub create_old
return $self;
}
sub create_new
sub create_new($class, $pkg)
{
my ($class, $pkg) = @_;
my $handle = $class->new;
$handle->{name} = $pkg;
$handle->{tweaked} = 0;
return $handle;
}
sub from_location
sub from_location($class, $location)
{
my ($class, $location) = @_;
my $handle = $class->new;
$handle->{location} = $location;
$handle->{tweaked} = 0;
return $handle;
}
sub get_plist
sub get_plist($handle, $state)
{
my ($handle, $state) = @_;
my $location = $handle->{location};
my $pkg = $handle->pkgname;
@ -273,10 +255,8 @@ sub get_plist
$handle->{plist} = $plist;
}
sub get_location
sub get_location($handle, $state)
{
my ($handle, $state) = @_;
my $name = $handle->{name};
my $location = $state->repo->find($name);
@ -300,10 +280,8 @@ sub get_location
$handle->{pkgname} = $location->name;
}
sub complete
sub complete($handle, $state)
{
my ($handle, $state) = @_;
return if $handle->has_error;
if (!defined $handle->{location}) {
@ -317,8 +295,8 @@ sub complete
package OpenBSD::Handle::BaseSystem;
our @ISA = qw(OpenBSD::Handle);
sub pkgname { return "BaseSystem"; }
sub pkgname($) { return "BaseSystem"; }
sub is_real { return 0; }
sub is_real($) { return 0; }
1;

View File

@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
# $OpenBSD: IdCache.pm,v 1.11 2023/05/16 14:31:54 espie Exp $
# $OpenBSD: IdCache.pm,v 1.12 2023/06/13 09:07:17 espie Exp $
#
# Copyright (c) 2002-2005 Marc Espie <espie@openbsd.org>
#
@ -14,19 +14,16 @@
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
use strict;
use warnings;
use v5.36;
package OpenBSD::SimpleIdCache;
sub new
sub new($class)
{
my $class = shift;
bless {}, $class;
}
sub lookup
sub lookup($self, $name, $default = undef)
{
my ($self, $name, $default) = @_;
my $r;
if (defined $self->{$name}) {
@ -45,10 +42,8 @@ sub lookup
package OpenBSD::IdCache;
our @ISA=qw(OpenBSD::SimpleIdCache);
sub lookup
sub lookup($self, $name, $default = undef)
{
my ($self, $name, $default) = @_;
if ($name =~ m/^\d+$/o) {
return $name;
} else {
@ -59,35 +54,35 @@ sub lookup
package OpenBSD::UidCache;
our @ISA=qw(OpenBSD::IdCache);
sub _convert
sub _convert($, $key)
{
my @entry = getpwnam($_[1]);
my @entry = getpwnam($key);
return @entry == 0 ? undef : $entry[2];
}
package OpenBSD::GidCache;
our @ISA=qw(OpenBSD::IdCache);
sub _convert
sub _convert($, $key)
{
my @entry = getgrnam($_[1]);
my @entry = getgrnam($key);
return @entry == 0 ? undef : $entry[2];
}
package OpenBSD::UnameCache;
our @ISA=qw(OpenBSD::SimpleIdCache);
sub _convert
sub _convert($, $key)
{
return getpwuid($_[1]);
return getpwuid($key);
}
package OpenBSD::GnameCache;
our @ISA=qw(OpenBSD::SimpleIdCache);
sub _convert
sub _convert($, $key)
{
return getgrgid($_[1]);
return getgrgid($key);
}
1;

View File

@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
# $OpenBSD: InstalledInfo.pm,v 1.1 2020/02/17 13:06:45 espie Exp $
# $OpenBSD: InstalledInfo.pm,v 1.2 2023/06/13 09:07:17 espie Exp $
#
# Copyright (c) 2003-2014 Marc Espie <espie@openbsd.org>
#
@ -15,8 +15,7 @@
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
use strict;
use warnings;
use v5.36;
package OpenBSD::InstalledInfo;
require Exporter;
@ -36,34 +35,29 @@ use constant {
UNDISPLAY => '+UNDISPLAY'
};
sub new
sub new($class, $state, $dir = $ENV{"PKG_DBDIR"} || OpenBSD::Paths->pkgdb)
{
my ($class, $state, $dir) = @_;
$dir //= $ENV{"PKG_DBDIR"} || OpenBSD::Paths->pkgdb;
return bless {state => $state, pkgdb => $dir}, $class;
}
sub list
sub list($self)
{
my $self = shift;
if (!defined $self->{list}) {
$self->_init;
}
return $self->{list};
}
sub stems
sub stems($self)
{
my $self = shift;
if (!defined $self->{stemlist}) {
$self->_init;
}
return $self->{stemlist};
}
sub _init
sub _init($self)
{
my $self = shift;
opendir(my $dir, $self->{pkgdb}) or
$self->{state}->fatal("Bad pkg_db #1: #2", $self->{pgkdb}, $!);
@ -86,20 +80,18 @@ for my $i (@info) {
$info{$i} = $j;
}
sub add
sub add($self, @p)
{
my $self = shift;
for my $p (@_) {
for my $p (@p) {
$self->{list}{$p} = 1;
$self->{stemlist}->add($p);
}
return $self;
}
sub delete
sub delete($self, @p)
{
my $self = shift;
for my $p (@_) {
for my $p (@p) {
delete $self->{list}{$p};
$self->{stemlist}->delete($p);
@ -107,20 +99,17 @@ sub delete
return $self;
}
sub packages
sub packages($self, $all = 0)
{
my $self = shift;
if ($_[0]) {
if ($all) {
return grep { !/^\./o } keys %{$self->list};
} else {
return keys %{$self->list};
}
}
sub fullname
sub fullname($self, $name)
{
my ($self, $name) = @_;
if ($name =~ m|^\Q$self->{pkgdb}\E/?|) {
return "$name/";
} else {
@ -128,15 +117,13 @@ sub fullname
}
}
sub contents
sub contents($self, $name)
{
my ($self, $name) = @_;
return $self->info($name).CONTENTS;
}
sub borked_package
sub borked_package($self, $pkgname)
{
my ($self, $pkgname) = shift;
$pkgname = "partial-$pkgname" unless $pkgname =~ m/^partial\-/;
unless (-e "$self->{pkgdb}/$pkgname") {
return $pkgname;
@ -149,9 +136,8 @@ sub borked_package
return "$pkgname.$i";
}
sub libs_package
sub libs_package($self, $pkgname)
{
my ($self, $pkgname) = @_;
$pkgname =~ s/^\.libs\d*\-//;
unless (-e "$self->{pkgdb}/.libs-$pkgname") {
return ".libs-$pkgname";
@ -164,9 +150,8 @@ sub libs_package
return ".libs$i-$pkgname";
}
sub installed_name
sub installed_name($self, $path)
{
my ($self, $path) = @_;
require File::Spec;
my $name = File::Spec->canonpath($path);
$name =~ s|/$||o;
@ -175,28 +160,24 @@ sub installed_name
return $name;
}
sub is_installed
sub is_installed($self, $path)
{
my ($self, $path) = @_;
my $name = $self->installed_name($path);
return defined $self->list->{$self->installed_name($path)};
}
sub info_names
sub info_names($class)
{
my $class = shift;
return @info;
}
sub is_info_name
sub is_info_name($class, $name)
{
my ($class, $name) = @_;
return $info{$name};
}
sub lock
sub lock($self, $shared = 0, $quiet = 0)
{
my ($self, $shared, $quiet) = @_;
return if defined $self->{dlock};
my $mode = $shared ? LOCK_SH : LOCK_EX;
open($self->{dlock}, '<', $self->{pkg_db}) or return;
@ -209,7 +190,7 @@ sub lock
return $self;
}
sub unlock
sub unlock($self)
{
my $self = shift;
if (defined $self->{dlock}) {

View File

@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
# $OpenBSD: Interactive.pm,v 1.22 2018/02/26 13:53:31 espie Exp $
# $OpenBSD: Interactive.pm,v 1.23 2023/06/13 09:07:17 espie Exp $
#
# Copyright (c) 2005-2007 Marc Espie <espie@openbsd.org>
#
@ -14,14 +14,12 @@
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
use strict;
use warnings;
use v5.36;
package OpenBSD::Interactive;
sub new
sub new($class, $state, $level)
{
my ($class, $state, $level) = @_;
bless {
state => $state,
always => 0,
@ -29,9 +27,8 @@ sub new
}, $class;
}
sub ask_list
sub ask_list($self, $prompt, @values)
{
my ($self, $prompt, @values) = @_;
if ($self->{always}) {
return $values[0];
}
@ -83,9 +80,8 @@ LOOP:
}
}
sub confirm
sub confirm($self, $prompt, $yesno = 0)
{
my ($self, $prompt, $yesno) = @_;
if ($self->{always}) {
return 1;
}
@ -118,9 +114,9 @@ LOOP2:
goto LOOP2;
}
sub is_interactive
sub is_interactive($self)
{
return shift->{level};
return $self->{level};
}
1;

View File

@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
# $OpenBSD: LibSpec.pm,v 1.19 2023/05/27 10:01:38 espie Exp $
# $OpenBSD: LibSpec.pm,v 1.20 2023/06/13 09:07:17 espie Exp $
#
# Copyright (c) 2010 Marc Espie <espie@openbsd.org>
#
@ -15,14 +15,12 @@
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
use strict;
use warnings;
use v5.36;
package OpenBSD::LibObject;
sub key
sub key($self)
{
my $self = shift;
if (defined $self->{dir}) {
return "$self->{dir}/$self->{stem}";
} else {
@ -30,43 +28,37 @@ sub key
}
}
sub major
sub major($self)
{
my $self = shift;
return $self->{major};
}
sub minor
sub minor($self)
{
my $self = shift;
return $self->{minor};
}
sub version
sub version($self)
{
my $self = shift;
return ".".$self->major.".".$self->minor;
}
sub is_static { 0 }
sub is_static($) { 0 }
sub is_valid { 1 }
sub is_valid($) { 1 }
sub stem
sub stem($self)
{
my $self = shift;
return $self->{stem};
}
sub badclass
sub badclass($self)
{
"OpenBSD::BadLib";
}
sub lookup
sub lookup($spec, $repo, $base)
{
my ($spec, $repo, $base) = @_;
my $approx = $spec->lookup_stem($repo);
if (!defined $approx) {
return undef;
@ -80,9 +72,8 @@ sub lookup
return $r;
}
sub compare
sub compare($a, $b)
{
my ($a, $b) = @_;
if ($a->key ne $b->key) {
return $a->key cmp $b->key;
}
@ -95,51 +86,47 @@ sub compare
package OpenBSD::BadLib;
our @ISA=qw(OpenBSD::LibObject);
sub to_string
sub to_string($self)
{
my $self = shift;
return $$self;
}
sub new
sub new($class, $string)
{
my ($class, $string) = @_;
bless \$string, $class;
}
sub is_valid
sub is_valid($)
{
return 0;
}
sub lookup_stem
sub lookup_stem($, $)
{
return undef;
}
# $spec->match($library, $base)
sub match
sub match($, $, $)
{
return 0;
}
package OpenBSD::LibRepo;
sub new
sub new($class)
{
my $class = shift;
bless {}, $class;
}
sub register
sub register($repo, $lib, $origin)
{
my ($repo, $lib, $origin) = @_;
$lib->set_origin($origin);
push @{$repo->{$lib->stem}}, $lib;
}
sub find_best
sub find_best($repo, $stem)
{
my ($repo, $stem) = @_;
my $best;
if (exists $repo->{$stem}) {
@ -155,9 +142,8 @@ sub find_best
package OpenBSD::Library;
our @ISA = qw(OpenBSD::LibObject);
sub from_string
sub from_string($class, $filename)
{
my ($class, $filename) = @_;
if (my ($dir, $stem, $major, $minor) = $filename =~ m/^(.*)\/lib([^\/]+)\.so\.(\d+)\.(\d+)$/o) {
bless { dir => $dir, stem => $stem, major => $major,
minor => $minor }, $class;
@ -166,34 +152,29 @@ sub from_string
}
}
sub to_string
sub to_string($self)
{
my $self = shift;
return "$self->{dir}/lib$self->{stem}.so.$self->{major}.$self->{minor}";
}
sub set_origin
sub set_origin($self, $origin)
{
my ($self, $origin) = @_;
$self->{origin} = $origin;
return $self;
}
sub origin
sub origin($self)
{
my $self = shift;
return $self->{origin};
}
sub no_match_dispatch
sub no_match_dispatch($library, $spec, $base)
{
my ($library, $spec, $base) = @_;
return $spec->no_match_shared($library, $base);
}
sub is_better
sub is_better($self, $other)
{
my ($self, $other) = @_;
if ($other->is_static) {
return 1;
}
@ -209,9 +190,8 @@ sub is_better
package OpenBSD::LibSpec;
our @ISA = qw(OpenBSD::LibObject);
sub new
sub new($class, $dir, $stem, $major, $minor)
{
my ($class, $dir, $stem, $major, $minor) = @_;
bless {
dir => $dir, stem => $stem,
major => $major, minor => $minor
@ -220,16 +200,13 @@ sub new
my $cached = {};
sub from_string
sub from_string($class, $s)
{
my ($class, $s) = @_;
return $cached->{$s} //= $class->new_from_string($s);
}
sub new_with_stem
sub new_with_stem($class, $stem, $major, $minor)
{
my ($class, $stem, $major, $minor) = @_;
if ($stem =~ m/^(.*)\/([^\/]+)$/o) {
return $class->new($1, $2, $major, $minor);
} else {
@ -237,9 +214,8 @@ sub new_with_stem
}
}
sub new_from_string
sub new_from_string($class, $string)
{
my ($class, $string) = @_;
if (my ($stem, $major, $minor) = $string =~ m/^(.*)\.(\d+)\.(\d+)$/o) {
return $class->new_with_stem($stem, $major, $minor);
} else {
@ -247,17 +223,14 @@ sub new_from_string
}
}
sub to_string
sub to_string($self)
{
my $self = shift;
return join('.', $self->key, $self->major, $self->minor);
}
sub lookup_stem
sub lookup_stem($spec, $repo)
{
my ($spec, $repo) = @_;
my $result = $repo->{$spec->stem};
if (!defined $result) {
return undef;
@ -266,16 +239,13 @@ sub lookup_stem
}
}
sub no_match_major
sub no_match_major($spec, $library)
{
my ($spec, $library) = @_;
return $spec->major != $library->major;
}
sub no_match_name
sub no_match_name($spec, $library, $base)
{
my ($spec, $library, $base) = @_;
if (defined $spec->{dir}) {
if ("$base/$spec->{dir}" eq $library->{dir}) {
return undef;
@ -290,10 +260,8 @@ sub no_match_name
return "bad directory";
}
sub no_match_shared
sub no_match_shared($spec, $library, $base)
{
my ($spec, $library, $base) = @_;
if ($spec->no_match_major($library)) {
return "bad major";
}
@ -305,15 +273,13 @@ sub no_match_shared
}
# classic double dispatch pattern
sub no_match
sub no_match($spec, $library, $base)
{
my ($spec, $library, $base) = @_;
return $library->no_match_dispatch($spec, $base);
}
sub match
sub match($spec, $library, $base)
{
my ($spec, $library, $base) = @_;
return !$spec->no_match($library, $base);
}

View File

@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
# $OpenBSD: Build.pm,v 1.7 2010/11/27 11:55:14 espie Exp $
# $OpenBSD: Build.pm,v 1.8 2023/06/13 09:07:18 espie Exp $
#
# Copyright (c) 2010 Marc Espie <espie@openbsd.org>
#
@ -15,46 +15,41 @@
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
use strict;
use warnings;
use v5.36;
# the specs used during build are slightly different from the specs at
# runtime.
package OpenBSD::Library::Static;
our @ISA = qw(OpenBSD::Library);
sub new
sub new($class, $dir, $stem)
{
my ($class, $dir, $stem) = @_;
bless {dir => $dir, stem => $stem}, $class;
}
sub no_match_dispatch
sub no_match_dispatch($library, $spec, $base)
{
my ($library, $spec, $base) = @_;
return $spec->no_match_static($library, $base);
}
sub to_string
sub to_string($self)
{
my $self = shift;
return "$self->{dir}/lib$self->{stem}.a";
}
sub version { ".a" }
sub version($) { ".a" }
sub is_static { 1 }
sub is_static($) { 1 }
sub is_better { 0 }
sub is_better($, $) { 0 }
package OpenBSD::Library::Build;
our @ISA = qw(OpenBSD::Library);
sub static
sub static($)
{ 'OpenBSD::Library::Static'; }
sub from_string
sub from_string($class, $filename)
{
my ($class, $filename) = @_;
if (my ($dir, $stem) = $filename =~ m/^(.*)\/lib([^\/]+)\.a$/o) {
return $class->static->new($dir, $stem);
} else {
@ -63,14 +58,13 @@ sub from_string
}
package OpenBSD::LibSpec;
sub no_match_static
sub no_match_static # forwarder
{
&OpenBSD::LibSpec::no_match_name;
}
sub findbest
sub findbest($spec, $repo, $base)
{
my ($spec, $repo, $base) = @_;
my $spec2 = OpenBSD::LibSpec::GT->new($spec->{dir}, $spec->{stem},
0, 0);
my $r = $spec2->lookup($repo, $base);
@ -93,15 +87,13 @@ sub findbest
package OpenBSD::LibSpec::GT;
our @ISA = qw(OpenBSD::LibSpec);
sub no_match_major
sub no_match_major($spec, $library)
{
my ($spec, $library) = @_;
return $spec->major > $library->major;
}
sub to_string
sub to_string($self)
{
my $self = shift;
return $self->key.">=".$self->major.".".$self->minor;
}
@ -110,10 +102,8 @@ sub to_string
package OpenBSD::LibSpec::Build;
our @ISA = qw(OpenBSD::LibSpec);
sub new_from_string
sub new_from_string($class, $string)
{
my ($class, $string) = @_;
$string =~ s/\.$//;
if (my ($stem, $strict, $major, $minor) = $string =~ m/^(.*?)(\>?)\=(\d+)\.(\d+)$/o) {
return $class->new_object($stem, $strict, $major, $minor);
@ -124,9 +114,8 @@ sub new_from_string
}
}
sub new_object
sub new_object($class, $stem, $strict, $major, $minor)
{
my ($class, $stem, $strict, $major, $minor) = @_;
my $n = $strict eq '' ? "OpenBSD::LibSpec" : "OpenBSD::LibSpec::GT";
return $n->new_with_stem($stem, $major, $minor);
}

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