From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 15A95C433ED for ; Wed, 5 May 2021 18:04:43 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id E38DE6121F for ; Wed, 5 May 2021 18:04:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235618AbhEESFb (ORCPT ); Wed, 5 May 2021 14:05:31 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57440 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236314AbhEESEu (ORCPT ); Wed, 5 May 2021 14:04:50 -0400 Received: from mail-ej1-x62c.google.com (mail-ej1-x62c.google.com [IPv6:2a00:1450:4864:20::62c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EB851C0612B2 for ; Wed, 5 May 2021 11:02:00 -0700 (PDT) Received: by mail-ej1-x62c.google.com with SMTP id l4so4213192ejc.10 for ; Wed, 05 May 2021 11:02:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=L8MAHJzd0MFKLImGopG0r6bJfG78UWJqT4h6SIiDvE0=; b=SePsIJ9I1b4a/fq4gmBA9eh3hWsl0fQCQtm/5xo5MdB6F9btL6Z7IbRlBnWq6z8dUV p54HnisH75efuxlY6FgPe0uM7uKEqJxuRu0KgOjc4QqTOdJ0+Uh1n6ZEpZY6MQFlIV+j 23NCa9XOAffcfjJ8ZFw8QL/TyDuKuNkkUWyrN4Zzv3QKW5FXe0ZH+Ax4cBZZlkcEJRac PXK+2ZPuPGDQuStaJKvJ9qYr7J60+0lkWkAcXcGXkvLkGYXaq7mpJ3ugvsptBIqvHLyz rr0vJ4U48plVdKEIYEv8Q+TCvBysiKXFX9hC56vqtN/hJ5fQ9TuEhwmrPXYFWdQ0TKHI 1xqg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=L8MAHJzd0MFKLImGopG0r6bJfG78UWJqT4h6SIiDvE0=; b=hMH/uF4mZkf8Z8OWNsADIsE6uk/Zt6pFt/H55k7lNe0T+OQq/plFewNQQV+Tt0tNsr XkSyNDFhRu0dmLlkIUDl7D9eM1+XKnj27aRBo0YU6U/Ioetm9EPZIOzGWBRnnMKgD49z n1unKRN4htsd9d21dLDP3mh0Th02nBnIGXkf/ATfdcgs+srO/rU7D9yONDx83ND74k5e lGSdlZNq1aOqrQ+Yg6l8DVnpUFu1Qd4F3ke0S15ZTGt6CKGj8Qf2AcUEZQ8kdrt0ejVZ LZKRsCu4OixpAJ3qFc18vasKI1h+ASjhXFEeQnc6sP0FuZInp1zZigFsW4+TpCzHUnp7 w2CA== X-Gm-Message-State: AOAM532cY77IXWE47zUeCEDPQb2hqA2cYx5t3RGN5iETqoIxTYxd5994 WXS4w4o7oW4cLD5Q41qByKrDfCkQoCNbDMHCZwc= X-Google-Smtp-Source: ABdhPJxWOL2cZjc50bgaQhBJ+rGTNgP4fN5CPeCU1V4nmHFrgvHH58dyOhSiz4tgjN4RCfC/E/9iNPcARH1LdPesnmQ= X-Received: by 2002:a17:906:5811:: with SMTP id m17mr28561065ejq.221.1620237719393; Wed, 05 May 2021 11:01:59 -0700 (PDT) MIME-Version: 1.0 References: <20210429190926.5086-1-smalin@marvell.com> <20210429190926.5086-25-smalin@marvell.com> <0114e63f-bea8-cd9f-2fe8-7f8f46fa26bd@suse.de> In-Reply-To: <0114e63f-bea8-cd9f-2fe8-7f8f46fa26bd@suse.de> From: Shai Malin Date: Wed, 5 May 2021 21:01:47 +0300 Message-ID: Subject: Re: [RFC PATCH v4 24/27] qedn: Add support of NVME ICReq & ICResp To: Hannes Reinecke Cc: Shai Malin , netdev@vger.kernel.org, davem@davemloft.net, kuba@kernel.org, linux-nvme@lists.infradead.org, sagi@grimberg.me, hch@lst.de, axboe@fb.com, kbusch@kernel.org, Ariel Elior , Michal Kalderon , okulkarni@marvell.com, pkushwaha@marvell.com Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org On 5/2/21 2:53 PM, Hannes Reinecke wrote: > On 4/29/21 9:09 PM, Shai Malin wrote: > > From: Prabhakar Kushwaha > > > > Once a TCP connection established, the host sends an Initialize > > Connection Request (ICReq) PDU to the controller. > > Further Initialize Connection Response (ICResp) PDU received from > > controller is processed by host to establish a connection and > > exchange connection configuration parameters. > > > > This patch present support of generation of ICReq and processing of > > ICResp. It also update host configuration based on exchanged parameters= . > > > > Acked-by: Igor Russkikh > > Signed-off-by: Prabhakar Kushwaha > > Signed-off-by: Omkar Kulkarni > > Signed-off-by: Michal Kalderon > > Signed-off-by: Ariel Elior > > Signed-off-by: Shai Malin > > --- > > drivers/nvme/hw/qedn/qedn.h | 36 ++++ > > drivers/nvme/hw/qedn/qedn_conn.c | 317 ++++++++++++++++++++++++++++++= - > > drivers/nvme/hw/qedn/qedn_main.c | 22 +++ > > drivers/nvme/hw/qedn/qedn_task.c | 8 +- > > 4 files changed, 379 insertions(+), 4 deletions(-) > > > > diff --git a/drivers/nvme/hw/qedn/qedn.h b/drivers/nvme/hw/qedn/qedn.h > > index 880ca245b02c..773a57994148 100644 > > --- a/drivers/nvme/hw/qedn/qedn.h > > +++ b/drivers/nvme/hw/qedn/qedn.h > > @@ -16,6 +16,7 @@ > > > > /* Driver includes */ > > #include "../../host/tcp-offload.h" > > +#include > > > > #define QEDN_MAJOR_VERSION 8 > > #define QEDN_MINOR_VERSION 62 > > @@ -52,6 +53,8 @@ > > > > /* Protocol defines */ > > #define QEDN_MAX_IO_SIZE QED_NVMETCP_MAX_IO_SIZE > > +#define QEDN_MAX_PDU_SIZE 0x80000 /* 512KB */ > > +#define QEDN_MAX_OUTSTANDING_R2T_PDUS 0 /* 0 Based =3D=3D 1 max R2T */ > > > > #define QEDN_SGE_BUFF_SIZE 4096 > > #define QEDN_MAX_SGES_PER_TASK DIV_ROUND_UP(QEDN_MAX_IO_SIZE, QEDN_SG= E_BUFF_SIZE) > > @@ -65,6 +68,11 @@ > > #define QEDN_TASK_INSIST_TMO 1000 /* 1 sec */ > > #define QEDN_INVALID_ITID 0xFFFF > > > > +#define QEDN_ICREQ_FW_PAYLOAD (sizeof(struct nvme_tcp_icreq_pdu) - \ > > + sizeof(struct nvmetcp_init_conn_req_hdr)) > > +/* The FW will handle the ICReq as CCCID 0 (FW internal design) */ > > +#define QEDN_ICREQ_CCCID 0 > > + > > /* > > * TCP offload stack default configurations and defines. > > * Future enhancements will allow controlling the configurable > > @@ -136,6 +144,16 @@ struct qedn_fp_queue { > > char irqname[QEDN_IRQ_NAME_LEN]; > > }; > > > > +struct qedn_negotiation_params { > > + u32 maxh2cdata; /* Negotiation */ > > + u32 maxr2t; /* Validation */ > > + u16 pfv; /* Validation */ > > + bool hdr_digest; /* Negotiation */ > > + bool data_digest; /* Negotiation */ > > + u8 cpda; /* Negotiation */ > > + u8 hpda; /* Validation */ > > +}; > > + > > struct qedn_ctx { > > struct pci_dev *pdev; > > struct qed_dev *cdev; > > @@ -195,6 +213,9 @@ struct qedn_endpoint { > > struct qed_chain fw_sq_chain; > > void __iomem *p_doorbell; > > > > + /* Spinlock for accessing FW queue */ > > + spinlock_t doorbell_lock; > > + > > /* TCP Params */ > > __be32 dst_addr[4]; /* In network order */ > > __be32 src_addr[4]; /* In network order */ > > @@ -268,6 +289,12 @@ struct qedn_ctrl { > > atomic_t host_num_active_conns; > > }; > > > > +struct qedn_icreq_padding { > > + u32 *buffer; > > + dma_addr_t pa; > > + struct nvmetcp_sge sge; > > +}; > > + > > /* Connection level struct */ > > struct qedn_conn_ctx { > > /* IO path */ > > @@ -329,6 +356,11 @@ struct qedn_conn_ctx { > > > > size_t sq_depth; > > > > + struct qedn_negotiation_params required_params; > > + struct qedn_negotiation_params pdu_params; > > + struct nvmetcp_icresp_hdr_psh icresp; > > + struct qedn_icreq_padding *icreq_pad; > > + > > /* "dummy" socket */ > > struct socket *sock; > > }; > > @@ -337,6 +369,7 @@ enum qedn_conn_resources_state { > > QEDN_CONN_RESRC_FW_SQ, > > QEDN_CONN_RESRC_ACQUIRE_CONN, > > QEDN_CONN_RESRC_TASKS, > > + QEDN_CONN_RESRC_ICREQ_PAD, > > QEDN_CONN_RESRC_CCCID_ITID_MAP, > > QEDN_CONN_RESRC_TCP_PORT, > > QEDN_CONN_RESRC_MAX =3D 64 > > @@ -375,5 +408,8 @@ void qedn_common_clear_fw_sgl(struct storage_sgl_ta= sk_params *sgl_task_params); > > void qedn_return_active_tasks(struct qedn_conn_ctx *conn_ctx); > > void qedn_destroy_free_tasks(struct qedn_fp_queue *fp_q, > > struct qedn_io_resources *io_resrc); > > +void qedn_swap_bytes(u32 *p, int size); > > +void qedn_prep_icresp(struct qedn_conn_ctx *conn_ctx, struct nvmetcp_f= w_cqe *cqe); > > +void qedn_ring_doorbell(struct qedn_conn_ctx *conn_ctx); > > > > #endif /* _QEDN_H_ */ > > diff --git a/drivers/nvme/hw/qedn/qedn_conn.c b/drivers/nvme/hw/qedn/qe= dn_conn.c > > index 10a80fbeac43..5679354aa0e0 100644 > > --- a/drivers/nvme/hw/qedn/qedn_conn.c > > +++ b/drivers/nvme/hw/qedn/qedn_conn.c > > @@ -34,6 +34,25 @@ inline int qedn_qid(struct nvme_tcp_ofld_queue *queu= e) > > return queue - queue->ctrl->queues; > > } > > > > +void qedn_ring_doorbell(struct qedn_conn_ctx *conn_ctx) > > +{ > > + struct nvmetcp_db_data dbell =3D { 0 }; > > + u16 prod_idx; > > + > > + dbell.agg_flags =3D 0; > > + dbell.params |=3D DB_DEST_XCM << NVMETCP_DB_DATA_DEST_SHIFT; > > + dbell.params |=3D DB_AGG_CMD_SET << NVMETCP_DB_DATA_AGG_CMD_SHIFT= ; > > + dbell.params |=3D > > + DQ_XCM_ISCSI_SQ_PROD_CMD << NVMETCP_DB_DATA_AGG_VAL_SEL_S= HIFT; > > + dbell.params |=3D 1 << NVMETCP_DB_DATA_BYPASS_EN_SHIFT; > > + prod_idx =3D qed_chain_get_prod_idx(&conn_ctx->ep.fw_sq_chain); > > + dbell.sq_prod =3D cpu_to_le16(prod_idx); > > + > > + /* wmb - Make sure fw idx is coherent */ > > + wmb(); > > + writel(*(u32 *)&dbell, conn_ctx->ep.p_doorbell); > > +} > > + > > int qedn_set_con_state(struct qedn_conn_ctx *conn_ctx, enum qedn_conn= _state new_state) > > { > > spin_lock_bh(&conn_ctx->conn_state_lock); > > @@ -130,6 +149,71 @@ int qedn_initialize_endpoint(struct qedn_endpoint = *ep, u8 *local_mac_addr, > > return -1; > > } > > > > +static int qedn_alloc_icreq_pad(struct qedn_conn_ctx *conn_ctx) > > +{ > > + struct qedn_ctx *qedn =3D conn_ctx->qedn; > > + struct qedn_icreq_padding *icreq_pad; > > + u32 *buffer; > > + int rc =3D 0; > > + > > + icreq_pad =3D kzalloc(sizeof(*icreq_pad), GFP_KERNEL); > > + if (!icreq_pad) > > + return -ENOMEM; > > + > > + conn_ctx->icreq_pad =3D icreq_pad; > > + memset(&icreq_pad->sge, 0, sizeof(icreq_pad->sge)); > > + buffer =3D dma_alloc_coherent(&qedn->pdev->dev, > > + QEDN_ICREQ_FW_PAYLOAD, > > + &icreq_pad->pa, > > + GFP_KERNEL); > > + if (!buffer) { > > + pr_err("Could not allocate icreq_padding SGE buffer.\n"); > > + rc =3D -ENOMEM; > > + goto release_icreq_pad; > > + } > > + > > + DMA_REGPAIR_LE(icreq_pad->sge.sge_addr, icreq_pad->pa); > > + icreq_pad->sge.sge_len =3D cpu_to_le32(QEDN_ICREQ_FW_PAYLOAD); > > + icreq_pad->buffer =3D buffer; > > + set_bit(QEDN_CONN_RESRC_ICREQ_PAD, &conn_ctx->resrc_state); > > + > > + return 0; > > + > > +release_icreq_pad: > > + kfree(icreq_pad); > > + conn_ctx->icreq_pad =3D NULL; > > + > > + return rc; > > +} > > + > > +static void qedn_free_icreq_pad(struct qedn_conn_ctx *conn_ctx) > > +{ > > + struct qedn_ctx *qedn =3D conn_ctx->qedn; > > + struct qedn_icreq_padding *icreq_pad; > > + u32 *buffer; > > + > > + icreq_pad =3D conn_ctx->icreq_pad; > > + if (unlikely(!icreq_pad)) { > > + pr_err("null ptr in icreq_pad in conn_ctx\n"); > > + goto finally; > > + } > > + > > + buffer =3D icreq_pad->buffer; > > + if (buffer) { > > + dma_free_coherent(&qedn->pdev->dev, > > + QEDN_ICREQ_FW_PAYLOAD, > > + (void *)buffer, > > + icreq_pad->pa); > > + icreq_pad->buffer =3D NULL; > > + } > > + > > + kfree(icreq_pad); > > + conn_ctx->icreq_pad =3D NULL; > > + > > +finally: > > + clear_bit(QEDN_CONN_RESRC_ICREQ_PAD, &conn_ctx->resrc_state); > > +} > > + > > static void qedn_release_conn_ctx(struct qedn_conn_ctx *conn_ctx) > > { > > struct qedn_ctx *qedn =3D conn_ctx->qedn; > > @@ -151,6 +235,9 @@ static void qedn_release_conn_ctx(struct qedn_conn_= ctx *conn_ctx) > > clear_bit(QEDN_CONN_RESRC_ACQUIRE_CONN, &conn_ctx->resrc_= state); > > } > > > > + if (test_bit(QEDN_CONN_RESRC_ICREQ_PAD, &conn_ctx->resrc_state)) > > + qedn_free_icreq_pad(conn_ctx); > > + > > if (test_bit(QEDN_CONN_RESRC_TASKS, &conn_ctx->resrc_state)) { > > clear_bit(QEDN_CONN_RESRC_TASKS, &conn_ctx->resrc_state); > > qedn_return_active_tasks(conn_ctx); > > @@ -309,6 +396,194 @@ void qedn_terminate_connection(struct qedn_conn_c= tx *conn_ctx, int abrt_flag) > > queue_work(qctrl->sp_wq, &conn_ctx->sp_wq_entry); > > } > > > > +static int qedn_nvmetcp_update_conn(struct qedn_ctx *qedn, struct qedn= _conn_ctx *conn_ctx) > > +{ > > + struct qedn_negotiation_params *pdu_params =3D &conn_ctx->pdu_par= ams; > > + struct qed_nvmetcp_params_update *conn_info; > > + int rc; > > + > > + conn_info =3D kzalloc(sizeof(*conn_info), GFP_KERNEL); > > + if (!conn_info) > > + return -ENOMEM; > > + > > + conn_info->hdr_digest_en =3D pdu_params->hdr_digest; > > + conn_info->data_digest_en =3D pdu_params->data_digest; > > + conn_info->max_recv_pdu_length =3D QEDN_MAX_PDU_SIZE; > > + conn_info->max_io_size =3D QEDN_MAX_IO_SIZE; > > + conn_info->max_send_pdu_length =3D pdu_params->maxh2cdata; > > + > > + rc =3D qed_ops->update_conn(qedn->cdev, conn_ctx->conn_handle, co= nn_info); > > + if (rc) { > > + pr_err("Could not update connection\n"); > > + rc =3D -ENXIO; > > + } > > + > > + kfree(conn_info); > > + > > + return rc; > > +} > > + > > +static int qedn_update_ramrod(struct qedn_conn_ctx *conn_ctx) > > +{ > > + struct qedn_ctx *qedn =3D conn_ctx->qedn; > > + int rc =3D 0; > > + > > + rc =3D qedn_set_con_state(conn_ctx, CONN_STATE_WAIT_FOR_UPDATE_EQ= E); > > + if (rc) > > + return rc; > > + > > + rc =3D qedn_nvmetcp_update_conn(qedn, conn_ctx); > > + if (rc) > > + return rc; > > + > > + if (conn_ctx->state !=3D CONN_STATE_WAIT_FOR_UPDATE_EQE) { > > + pr_err("cid 0x%x: Unexpected state 0x%x after update ramr= od\n", > > + conn_ctx->fw_cid, conn_ctx->state); > > + > > + return -EINVAL; > > + } > > + > > + return rc; > > +} > > + > > +static int qedn_send_icreq(struct qedn_conn_ctx *conn_ctx) > > +{ > > + struct nvmetcp_init_conn_req_hdr *icreq_ptr =3D NULL; > > + struct storage_sgl_task_params *sgl_task_params; > > + struct nvmetcp_task_params task_params; > > + struct qedn_task_ctx *qedn_task =3D NULL; > > + struct nvme_tcp_icreq_pdu icreq; > > + struct nvmetcp_wqe *chain_sqe; > > + struct nvmetcp_wqe local_sqe; > > + > > + qedn_task =3D qedn_get_task_from_pool_insist(conn_ctx, QEDN_ICREQ= _CCCID); > > + if (!qedn_task) > > + return -EINVAL; > > + > > + memset(&icreq, 0, sizeof(icreq)); > > + memset(&local_sqe, 0, sizeof(local_sqe)); > > + > > + /* Initialize ICReq */ > > + icreq.hdr.type =3D nvme_tcp_icreq; > > + icreq.hdr.hlen =3D sizeof(icreq); > > + icreq.hdr.pdo =3D 0; > > + icreq.hdr.plen =3D cpu_to_le32(icreq.hdr.hlen); > > + icreq.pfv =3D cpu_to_le16(conn_ctx->required_params.pfv); > > + icreq.maxr2t =3D cpu_to_le32(conn_ctx->required_params.maxr2t); > > + icreq.hpda =3D conn_ctx->required_params.hpda; > > + if (conn_ctx->required_params.hdr_digest) > > + icreq.digest |=3D NVME_TCP_HDR_DIGEST_ENABLE; > > + if (conn_ctx->required_params.data_digest) > > + icreq.digest |=3D NVME_TCP_DATA_DIGEST_ENABLE; > > + > > + qedn_swap_bytes((u32 *)&icreq, > > + (sizeof(icreq) - QEDN_ICREQ_FW_PAYLOAD) / > > + sizeof(u32)); > > + > > + /* Initialize task params */ > > + task_params.opq.lo =3D cpu_to_le32(((u64)(qedn_task)) & 0xfffffff= f); > > + task_params.opq.hi =3D cpu_to_le32(((u64)(qedn_task)) >> 32); > > + task_params.context =3D qedn_task->fw_task_ctx; > > + task_params.sqe =3D &local_sqe; > > + task_params.conn_icid =3D (u16)conn_ctx->conn_handle; > > + task_params.itid =3D qedn_task->itid; > > + task_params.cq_rss_number =3D conn_ctx->default_cq; > > + task_params.tx_io_size =3D QEDN_ICREQ_FW_PAYLOAD; > > + task_params.rx_io_size =3D 0; /* Rx doesn't use SGL for icresp */ > > + > > + /* Init SGE for ICReq padding */ > > + sgl_task_params =3D &qedn_task->sgl_task_params; > > + sgl_task_params->total_buffer_size =3D task_params.tx_io_size; > > + sgl_task_params->small_mid_sge =3D false; > > + sgl_task_params->num_sges =3D 1; > > + memcpy(sgl_task_params->sgl, &conn_ctx->icreq_pad->sge, > > + sizeof(conn_ctx->icreq_pad->sge)); > > + icreq_ptr =3D (struct nvmetcp_init_conn_req_hdr *)&icreq; > > + > > + qed_ops->init_icreq_exchange(&task_params, icreq_ptr, sgl_task_pa= rams, NULL); > > + > > + qedn_set_con_state(conn_ctx, CONN_STATE_WAIT_FOR_IC_COMP); > > + atomic_inc(&conn_ctx->num_active_fw_tasks); > > + > > + /* spin_lock - doorbell is accessed both Rx flow and response fl= ow */ > > + spin_lock(&conn_ctx->ep.doorbell_lock); > > + chain_sqe =3D qed_chain_produce(&conn_ctx->ep.fw_sq_chain); > > + memcpy(chain_sqe, &local_sqe, sizeof(local_sqe)); > > + qedn_ring_doorbell(conn_ctx); > > + spin_unlock(&conn_ctx->ep.doorbell_lock); > > + > > + return 0; > > +} > > + > > And this is what I meant. You _do_ swab bytes before sending it off to > the HW, _and_ you use the standard nvme-tcp PDU definitions. > So why do you have your own, byte-swapped versions of the PDUs? We will change it and use the standard struct 'nvme_tcp_icreq_pdu'. > > > +void qedn_prep_icresp(struct qedn_conn_ctx *conn_ctx, struct nvmetcp_f= w_cqe *cqe) > > +{ > > + struct nvmetcp_icresp_hdr_psh *icresp_from_cqe =3D > > + (struct nvmetcp_icresp_hdr_psh *)&cqe->nvme_cqe; > > + struct nvme_tcp_ofld_ctrl *ctrl =3D conn_ctx->ctrl; > > + struct qedn_ctrl *qctrl =3D NULL; > > + > > + qctrl =3D (struct qedn_ctrl *)ctrl->private_data; > > + > > + memcpy(&conn_ctx->icresp, icresp_from_cqe, sizeof(conn_ctx->icres= p)); > > + qedn_set_sp_wa(conn_ctx, HANDLE_ICRESP); > > + queue_work(qctrl->sp_wq, &conn_ctx->sp_wq_entry); > > +} > > + > > +static int qedn_handle_icresp(struct qedn_conn_ctx *conn_ctx) > > +{ > > + struct nvmetcp_icresp_hdr_psh *icresp =3D &conn_ctx->icresp; > > + u16 pfv =3D __swab16(le16_to_cpu(icresp->pfv_swapped)); > > + int rc =3D 0; > > + > > Again here; you could treat the received icresp as a binaray blob. > byteswap it, and then cast is to the standard icresp structure. > Hmm? With the existing FW, the driver receives only the meaningful fields from the icresp. As a future enhancement, we will consider modifying the FW to pass the entire icresp to the driver. > > > + qedn_free_icreq_pad(conn_ctx); > > + > > + /* Validate ICResp */ > > + if (pfv !=3D conn_ctx->required_params.pfv) { > > + pr_err("cid %u: unsupported pfv %u\n", conn_ctx->fw_cid, = pfv); > > + > > + return -EINVAL; > > + } > > + > > + if (icresp->cpda > conn_ctx->required_params.cpda) { > > + pr_err("cid %u: unsupported cpda %u\n", conn_ctx->fw_cid,= icresp->cpda); > > + > > + return -EINVAL; > > + } > > + > > + if ((NVME_TCP_HDR_DIGEST_ENABLE & icresp->digest) !=3D > > + conn_ctx->required_params.hdr_digest) { > > + if ((NVME_TCP_HDR_DIGEST_ENABLE & icresp->digest) > > > + conn_ctx->required_params.hdr_digest) { > > + pr_err("cid 0x%x: invalid header digest bit\n", c= onn_ctx->fw_cid); > > + } > > + } > > + > > + if ((NVME_TCP_DATA_DIGEST_ENABLE & icresp->digest) !=3D > > + conn_ctx->required_params.data_digest) { > > + if ((NVME_TCP_DATA_DIGEST_ENABLE & icresp->digest) > > > + conn_ctx->required_params.data_digest) { > > + pr_err("cid 0x%x: invalid data digest bit\n", con= n_ctx->fw_cid); > > + } > > + } > > + > > + memset(&conn_ctx->pdu_params, 0, sizeof(conn_ctx->pdu_params)); > > + conn_ctx->pdu_params.maxh2cdata =3D > > + __swab32(le32_to_cpu(icresp->maxdata_swapped)); > > + conn_ctx->pdu_params.maxh2cdata =3D QEDN_MAX_PDU_SIZE; > > + if (conn_ctx->pdu_params.maxh2cdata > QEDN_MAX_PDU_SIZE) > > + conn_ctx->pdu_params.maxh2cdata =3D QEDN_MAX_PDU_SIZE; > > + > > + conn_ctx->pdu_params.pfv =3D pfv; > > + conn_ctx->pdu_params.cpda =3D icresp->cpda; > > + conn_ctx->pdu_params.hpda =3D conn_ctx->required_params.hpda; > > + conn_ctx->pdu_params.hdr_digest =3D NVME_TCP_HDR_DIGEST_ENABLE & = icresp->digest; > > + conn_ctx->pdu_params.data_digest =3D NVME_TCP_DATA_DIGEST_ENABLE = & icresp->digest; > > + conn_ctx->pdu_params.maxr2t =3D conn_ctx->required_params.maxr2t; > > + rc =3D qedn_update_ramrod(conn_ctx); > > + > > + return rc; > > +} > > + > > /* Slowpath EQ Callback */ > > int qedn_event_cb(void *context, u8 fw_event_code, void *event_ring_d= ata) > > { > > @@ -363,7 +638,8 @@ int qedn_event_cb(void *context, u8 fw_event_code, = void *event_ring_data) > > if (rc) > > return rc; > > > > - /* Placeholder - for ICReq flow */ > > + qedn_set_sp_wa(conn_ctx, SEND_ICREQ); > > + queue_work(qctrl->sp_wq, &conn_ctx->sp_wq_entry); > > } > > > > break; > > @@ -399,6 +675,7 @@ static int qedn_prep_and_offload_queue(struct qedn_= conn_ctx *conn_ctx) > > } > > > > set_bit(QEDN_CONN_RESRC_FW_SQ, &conn_ctx->resrc_state); > > + spin_lock_init(&conn_ctx->ep.doorbell_lock); > > INIT_LIST_HEAD(&conn_ctx->host_pend_req_list); > > spin_lock_init(&conn_ctx->nvme_req_lock); > > atomic_set(&conn_ctx->num_active_tasks, 0); > > @@ -463,6 +740,11 @@ static int qedn_prep_and_offload_queue(struct qedn= _conn_ctx *conn_ctx) > > > > memset(conn_ctx->host_cccid_itid, 0xFF, dma_size); > > set_bit(QEDN_CONN_RESRC_CCCID_ITID_MAP, &conn_ctx->resrc_state); > > + > > + rc =3D qedn_alloc_icreq_pad(conn_ctx); > > + if (rc) > > + goto rel_conn; > > + > > rc =3D qedn_set_con_state(conn_ctx, CONN_STATE_WAIT_FOR_CONNECT_D= ONE); > > if (rc) > > goto rel_conn; > > @@ -523,6 +805,9 @@ void qedn_sp_wq_handler(struct work_struct *work) > > > > qedn =3D conn_ctx->qedn; > > if (test_bit(DESTROY_CONNECTION, &conn_ctx->agg_work_action)) { > > + if (test_bit(HANDLE_ICRESP, &conn_ctx->agg_work_action)) > > + qedn_clr_sp_wa(conn_ctx, HANDLE_ICRESP); > > + > > qedn_destroy_connection(conn_ctx); > > > > return; > > @@ -537,6 +822,36 @@ void qedn_sp_wq_handler(struct work_struct *work) > > return; > > } > > } > > + > > + if (test_bit(SEND_ICREQ, &conn_ctx->agg_work_action)) { > > + qedn_clr_sp_wa(conn_ctx, SEND_ICREQ); > > + rc =3D qedn_send_icreq(conn_ctx); > > + if (rc) > > + return; > > + > > + return; > > + } > > + > > + if (test_bit(HANDLE_ICRESP, &conn_ctx->agg_work_action)) { > > + rc =3D qedn_handle_icresp(conn_ctx); > > + > > + qedn_clr_sp_wa(conn_ctx, HANDLE_ICRESP); > > + if (rc) { > > + pr_err("IC handling returned with 0x%x\n", rc); > > + if (test_and_set_bit(DESTROY_CONNECTION, &conn_ct= x->agg_work_action)) > > + return; > > + > > + qedn_destroy_connection(conn_ctx); > > + > > + return; > > + } > > + > > + atomic_inc(&conn_ctx->est_conn_indicator); > > + qedn_set_con_state(conn_ctx, CONN_STATE_NVMETCP_CONN_ESTA= BLISHED); > > + wake_up_interruptible(&conn_ctx->conn_waitq); > > + > > + return; > > + } > > } > > > > /* Clear connection aggregative slowpath work action */ > > diff --git a/drivers/nvme/hw/qedn/qedn_main.c b/drivers/nvme/hw/qedn/qe= dn_main.c > > index 8d9c19d63480..a6756d7250b7 100644 > > --- a/drivers/nvme/hw/qedn/qedn_main.c > > +++ b/drivers/nvme/hw/qedn/qedn_main.c > > @@ -285,6 +285,19 @@ static void qedn_set_ctrl_io_cpus(struct qedn_conn= _ctx *conn_ctx, int qid) > > conn_ctx->cpu =3D fp_q->cpu; > > } > > > > +static void qedn_set_pdu_params(struct qedn_conn_ctx *conn_ctx) > > +{ > > + /* Enable digest once supported */ > > + conn_ctx->required_params.hdr_digest =3D 0; > > + conn_ctx->required_params.data_digest =3D 0; > > + > > + conn_ctx->required_params.maxr2t =3D QEDN_MAX_OUTSTANDING_R2T_PDU= S; > > + conn_ctx->required_params.pfv =3D NVME_TCP_PFV_1_0; > > + conn_ctx->required_params.cpda =3D 0; > > + conn_ctx->required_params.hpda =3D 0; > > + conn_ctx->required_params.maxh2cdata =3D QEDN_MAX_PDU_SIZE; > > +} > > + > > static int qedn_create_queue(struct nvme_tcp_ofld_queue *queue, int q= id, size_t q_size) > > { > > struct nvme_tcp_ofld_ctrl *ctrl =3D queue->ctrl; > > @@ -307,6 +320,7 @@ static int qedn_create_queue(struct nvme_tcp_ofld_q= ueue *queue, int qid, size_t > > conn_ctx->ctrl =3D ctrl; > > conn_ctx->sq_depth =3D q_size; > > qedn_set_ctrl_io_cpus(conn_ctx, qid); > > + qedn_set_pdu_params(conn_ctx); > > > > init_waitqueue_head(&conn_ctx->conn_waitq); > > atomic_set(&conn_ctx->est_conn_indicator, 0); > > @@ -1073,6 +1087,14 @@ static int qedn_probe(struct pci_dev *pdev, cons= t struct pci_device_id *id) > > return __qedn_probe(pdev); > > } > > > > +void qedn_swap_bytes(u32 *p, int size) > > +{ > > + int i; > > + > > + for (i =3D 0; i < size; ++i, ++p) > > + *p =3D __swab32(*p); > > +} > > + > > static struct pci_driver qedn_pci_driver =3D { > > .name =3D QEDN_MODULE_NAME, > > .id_table =3D qedn_pci_tbl, > > diff --git a/drivers/nvme/hw/qedn/qedn_task.c b/drivers/nvme/hw/qedn/qe= dn_task.c > > index 54f2f4cba6ea..9cb84883e95e 100644 > > --- a/drivers/nvme/hw/qedn/qedn_task.c > > +++ b/drivers/nvme/hw/qedn/qedn_task.c > > @@ -536,9 +536,11 @@ void qedn_io_work_cq(struct qedn_ctx *qedn, struct= nvmetcp_fw_cqe *cqe) > > break; > > > > case NVMETCP_TASK_TYPE_INIT_CONN_REQUEST: > > - > > - /* Placeholder - ICReq flow */ > > - > > + /* Clear ICReq-padding SGE from SGL */ > > + qedn_common_clear_fw_sgl(&qedn_task->sgl_task_par= ams); > > + /* Task is not required for icresp processing */ > > + qedn_return_task_to_pool(conn_ctx, qedn_task); > > + qedn_prep_icresp(conn_ctx, cqe); > > break; > > default: > > pr_info("Could not identify task type\n"); > > > Cheers, > > Hannes > -- > Dr. Hannes Reinecke Kernel Storage Architect > hare@suse.de +49 911 74053 688 > SUSE Software Solutions GmbH, Maxfeldstr. 5, 90409 N=C3=BCrnberg > HRB 36809 (AG N=C3=BCrnberg), Gesch=C3=A4ftsf=C3=BChrer: Felix Imend=C3= =B6rffer From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.7 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id BB2AAC433ED for ; Wed, 5 May 2021 18:02:17 +0000 (UTC) Received: from desiato.infradead.org (desiato.infradead.org [90.155.92.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id F239061176 for ; Wed, 5 May 2021 18:02:16 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org F239061176 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-nvme-bounces+linux-nvme=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=desiato.20200630; h=Sender:Content-Transfer-Encoding :Content-Type:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:Cc:To:Subject:Message-ID:Date:From:In-Reply-To: References:MIME-Version:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=2YfMI251g0tI4XkGzv6EsqHoVxwuRH5q1aKXs8iIAEo=; b=Z1wYZeoYtBfInHkvgoIv52+k/ UsrKnJjaRsYyKSCBeOIWCeO2pARvTFpUxdSe3FeEbNxAUWFRndjA71iaEYvaUuvYq8FAzuPS1WVNx 3gW2191UQrwZTK+i8zEwTY0Lzd7cct6EbQQbnhASgjZDfQSHyWx0TCthg3QKlyLzVX3ioBlNoA6d+ KorMtXa9uyvum1XOTd+P7DJXU50GDioq4q87bHnofHgFG3/LlrQ0qiDKXgliDhkJ0aqvf4mQZGWuy /DLbQ33klZ5Pkxhsd9BJTko03r+eC16vsMPrnvB3iPLtFbujTwrd9pwmrmJFofQBPlKQKgjVjpek0 +5EmCE5EQ==; Received: from localhost ([::1] helo=desiato.infradead.org) by desiato.infradead.org with esmtp (Exim 4.94 #2 (Red Hat Linux)) id 1leLqa-001y7F-RF; Wed, 05 May 2021 18:02:08 +0000 Received: from bombadil.infradead.org ([2607:7c80:54:e::133]) by desiato.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1leLqX-001y6U-Cq for linux-nvme@desiato.infradead.org; Wed, 05 May 2021 18:02:05 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; h=Content-Transfer-Encoding: Content-Type:Cc:To:Subject:Message-ID:Date:From:In-Reply-To:References: MIME-Version:Sender:Reply-To:Content-ID:Content-Description; bh=L8MAHJzd0MFKLImGopG0r6bJfG78UWJqT4h6SIiDvE0=; b=Bf3IP0/B1uYh4cTybdm0F8JVkp 9logYnS+FshG//kO6hALMZEOr2YQgQdYZgypB3XNwtY8AGQ0Mfe5MqeOlKHSPuWRK1+0gChEq8IfW DQZY6TxUxap7eLoxqz749itCq201A2lT12gpeGrubD/2wGKSFu013Ci88Y3tOtYMumhCdmaMFczAH KQcvcYwkUnUfK5Hg+rgB0G3BidSqgZWZRW9qY4Lh6IrPYxa7UkM15vMHCibMBYQQYiha/Fy9Ap+Hr pbdOwoctuEkLc6CD2tCUtHGlniaF2ygrYxwrc/1NtTpElAkpPjmHsAHrwYnuqrXJG+yz6VkdfcfPI AWCj4x7g==; Received: from mail-ej1-x629.google.com ([2a00:1450:4864:20::629]) by bombadil.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1leLqT-0057QW-EY for linux-nvme@lists.infradead.org; Wed, 05 May 2021 18:02:04 +0000 Received: by mail-ej1-x629.google.com with SMTP id f24so4232907ejc.6 for ; Wed, 05 May 2021 11:02:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=L8MAHJzd0MFKLImGopG0r6bJfG78UWJqT4h6SIiDvE0=; b=SePsIJ9I1b4a/fq4gmBA9eh3hWsl0fQCQtm/5xo5MdB6F9btL6Z7IbRlBnWq6z8dUV p54HnisH75efuxlY6FgPe0uM7uKEqJxuRu0KgOjc4QqTOdJ0+Uh1n6ZEpZY6MQFlIV+j 23NCa9XOAffcfjJ8ZFw8QL/TyDuKuNkkUWyrN4Zzv3QKW5FXe0ZH+Ax4cBZZlkcEJRac PXK+2ZPuPGDQuStaJKvJ9qYr7J60+0lkWkAcXcGXkvLkGYXaq7mpJ3ugvsptBIqvHLyz rr0vJ4U48plVdKEIYEv8Q+TCvBysiKXFX9hC56vqtN/hJ5fQ9TuEhwmrPXYFWdQ0TKHI 1xqg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=L8MAHJzd0MFKLImGopG0r6bJfG78UWJqT4h6SIiDvE0=; b=dQNwYZWEm6HgdVFa+NkYUZvIEXtDsyBBX2YtaSmW+elFaTVHz+iI/hodte9IjbRkHW C6bZidxnFWgV2fKjIo8Z7grH0GhO4rGkeT2nKxHEdwEyqKMFLauzsloxSu+1c2rddAY2 IgVOYiIEG+ax2rXOXq+IA7F9lAtg6PhejoA9QUnnpDGpBG1B2Q1mG0YOKBQnlrBVp2US E2DLSF+N/yg+ftoy+GaVlFFquwNRT+AeA1qBqhEqGEVZsA8Nd2o4CehSRgyDFgmONzUx qbJPvkfSh8XMs8DvwhCZByGyJEPFLPRShraU5wAqEdsTr1PdSHwim+cg/Qpi77RFUW+t Ofhw== X-Gm-Message-State: AOAM530MSM5Ffgas0fsvx5NA8GE8J/2Pm/BAcrk2ztZwVUhs9MBq1HAp aqQAqwVOokhswKcAQIpnyDNQAvBnWFrq5I7641guV7ZAJEQ05g== X-Google-Smtp-Source: ABdhPJxWOL2cZjc50bgaQhBJ+rGTNgP4fN5CPeCU1V4nmHFrgvHH58dyOhSiz4tgjN4RCfC/E/9iNPcARH1LdPesnmQ= X-Received: by 2002:a17:906:5811:: with SMTP id m17mr28561065ejq.221.1620237719393; Wed, 05 May 2021 11:01:59 -0700 (PDT) MIME-Version: 1.0 References: <20210429190926.5086-1-smalin@marvell.com> <20210429190926.5086-25-smalin@marvell.com> <0114e63f-bea8-cd9f-2fe8-7f8f46fa26bd@suse.de> In-Reply-To: <0114e63f-bea8-cd9f-2fe8-7f8f46fa26bd@suse.de> From: Shai Malin Date: Wed, 5 May 2021 21:01:47 +0300 Message-ID: Subject: Re: [RFC PATCH v4 24/27] qedn: Add support of NVME ICReq & ICResp To: Hannes Reinecke Cc: Shai Malin , netdev@vger.kernel.org, davem@davemloft.net, kuba@kernel.org, linux-nvme@lists.infradead.org, sagi@grimberg.me, hch@lst.de, axboe@fb.com, kbusch@kernel.org, Ariel Elior , Michal Kalderon , okulkarni@marvell.com, pkushwaha@marvell.com X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210505_110201_536475_976EDB32 X-CRM114-Status: GOOD ( 30.20 ) X-BeenThere: linux-nvme@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-nvme" Errors-To: linux-nvme-bounces+linux-nvme=archiver.kernel.org@lists.infradead.org T24gNS8yLzIxIDI6NTMgUE0sIEhhbm5lcyBSZWluZWNrZSB3cm90ZToKPiBPbiA0LzI5LzIxIDk6 MDkgUE0sIFNoYWkgTWFsaW4gd3JvdGU6Cj4gPiBGcm9tOiBQcmFiaGFrYXIgS3VzaHdhaGEgPHBr dXNod2FoYUBtYXJ2ZWxsLmNvbT4KPiA+Cj4gPiBPbmNlIGEgVENQIGNvbm5lY3Rpb24gZXN0YWJs aXNoZWQsIHRoZSBob3N0IHNlbmRzIGFuIEluaXRpYWxpemUKPiA+IENvbm5lY3Rpb24gUmVxdWVz dCAoSUNSZXEpIFBEVSB0byB0aGUgY29udHJvbGxlci4KPiA+IEZ1cnRoZXIgSW5pdGlhbGl6ZSBD b25uZWN0aW9uIFJlc3BvbnNlIChJQ1Jlc3ApIFBEVSByZWNlaXZlZCBmcm9tCj4gPiBjb250cm9s bGVyIGlzIHByb2Nlc3NlZCBieSBob3N0IHRvIGVzdGFibGlzaCBhIGNvbm5lY3Rpb24gYW5kCj4g PiBleGNoYW5nZSBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KPiA+Cj4gPiBU aGlzIHBhdGNoIHByZXNlbnQgc3VwcG9ydCBvZiBnZW5lcmF0aW9uIG9mIElDUmVxIGFuZCBwcm9j ZXNzaW5nIG9mCj4gPiBJQ1Jlc3AuIEl0IGFsc28gdXBkYXRlIGhvc3QgY29uZmlndXJhdGlvbiBi YXNlZCBvbiBleGNoYW5nZWQgcGFyYW1ldGVycy4KPiA+Cj4gPiBBY2tlZC1ieTogSWdvciBSdXNz a2lraCA8aXJ1c3NraWtoQG1hcnZlbGwuY29tPgo+ID4gU2lnbmVkLW9mZi1ieTogUHJhYmhha2Fy IEt1c2h3YWhhIDxwa3VzaHdhaGFAbWFydmVsbC5jb20+Cj4gPiBTaWduZWQtb2ZmLWJ5OiBPbWth ciBLdWxrYXJuaSA8b2t1bGthcm5pQG1hcnZlbGwuY29tPgo+ID4gU2lnbmVkLW9mZi1ieTogTWlj aGFsIEthbGRlcm9uIDxta2FsZGVyb25AbWFydmVsbC5jb20+Cj4gPiBTaWduZWQtb2ZmLWJ5OiBB cmllbCBFbGlvciA8YWVsaW9yQG1hcnZlbGwuY29tPgo+ID4gU2lnbmVkLW9mZi1ieTogU2hhaSBN YWxpbiA8c21hbGluQG1hcnZlbGwuY29tPgo+ID4gLS0tCj4gPiAgIGRyaXZlcnMvbnZtZS9ody9x ZWRuL3FlZG4uaCAgICAgIHwgIDM2ICsrKysKPiA+ICAgZHJpdmVycy9udm1lL2h3L3FlZG4vcWVk bl9jb25uLmMgfCAzMTcgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLQo+ID4gICBkcml2 ZXJzL252bWUvaHcvcWVkbi9xZWRuX21haW4uYyB8ICAyMiArKysKPiA+ICAgZHJpdmVycy9udm1l L2h3L3FlZG4vcWVkbl90YXNrLmMgfCAgIDggKy0KPiA+ICAgNCBmaWxlcyBjaGFuZ2VkLCAzNzkg aW5zZXJ0aW9ucygrKSwgNCBkZWxldGlvbnMoLSkKPiA+Cj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVy cy9udm1lL2h3L3FlZG4vcWVkbi5oIGIvZHJpdmVycy9udm1lL2h3L3FlZG4vcWVkbi5oCj4gPiBp bmRleCA4ODBjYTI0NWIwMmMuLjc3M2E1Nzk5NDE0OCAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMv bnZtZS9ody9xZWRuL3FlZG4uaAo+ID4gKysrIGIvZHJpdmVycy9udm1lL2h3L3FlZG4vcWVkbi5o Cj4gPiBAQCAtMTYsNiArMTYsNyBAQAo+ID4KPiA+ICAgLyogRHJpdmVyIGluY2x1ZGVzICovCj4g PiAgICNpbmNsdWRlICIuLi8uLi9ob3N0L3RjcC1vZmZsb2FkLmgiCj4gPiArI2luY2x1ZGUgPGxp bnV4L252bWUtdGNwLmg+Cj4gPgo+ID4gICAjZGVmaW5lIFFFRE5fTUFKT1JfVkVSU0lPTiAgICAg ICAgICA4Cj4gPiAgICNkZWZpbmUgUUVETl9NSU5PUl9WRVJTSU9OICAgICAgICAgIDYyCj4gPiBA QCAtNTIsNiArNTMsOCBAQAo+ID4KPiA+ICAgLyogUHJvdG9jb2wgZGVmaW5lcyAqLwo+ID4gICAj ZGVmaW5lIFFFRE5fTUFYX0lPX1NJWkUgUUVEX05WTUVUQ1BfTUFYX0lPX1NJWkUKPiA+ICsjZGVm aW5lIFFFRE5fTUFYX1BEVV9TSVpFIDB4ODAwMDAgLyogNTEyS0IgKi8KPiA+ICsjZGVmaW5lIFFF RE5fTUFYX09VVFNUQU5ESU5HX1IyVF9QRFVTIDAgLyogMCBCYXNlZCA9PSAxIG1heCBSMlQgKi8K PiA+Cj4gPiAgICNkZWZpbmUgUUVETl9TR0VfQlVGRl9TSVpFIDQwOTYKPiA+ICAgI2RlZmluZSBR RUROX01BWF9TR0VTX1BFUl9UQVNLIERJVl9ST1VORF9VUChRRUROX01BWF9JT19TSVpFLCBRRURO X1NHRV9CVUZGX1NJWkUpCj4gPiBAQCAtNjUsNiArNjgsMTEgQEAKPiA+ICAgI2RlZmluZSBRRURO X1RBU0tfSU5TSVNUX1RNTyAxMDAwIC8qIDEgc2VjICovCj4gPiAgICNkZWZpbmUgUUVETl9JTlZB TElEX0lUSUQgMHhGRkZGCj4gPgo+ID4gKyNkZWZpbmUgUUVETl9JQ1JFUV9GV19QQVlMT0FEIChz aXplb2Yoc3RydWN0IG52bWVfdGNwX2ljcmVxX3BkdSkgLSBcCj4gPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgbnZtZXRjcF9pbml0X2Nvbm5fcmVxX2hkcikpCj4g PiArLyogVGhlIEZXIHdpbGwgaGFuZGxlIHRoZSBJQ1JlcSBhcyBDQ0NJRCAwIChGVyBpbnRlcm5h bCBkZXNpZ24pICovCj4gPiArI2RlZmluZSBRRUROX0lDUkVRX0NDQ0lEIDAKPiA+ICsKPiA+ICAg LyoKPiA+ICAgICogVENQIG9mZmxvYWQgc3RhY2sgZGVmYXVsdCBjb25maWd1cmF0aW9ucyBhbmQg ZGVmaW5lcy4KPiA+ICAgICogRnV0dXJlIGVuaGFuY2VtZW50cyB3aWxsIGFsbG93IGNvbnRyb2xs aW5nIHRoZSBjb25maWd1cmFibGUKPiA+IEBAIC0xMzYsNiArMTQ0LDE2IEBAIHN0cnVjdCBxZWRu X2ZwX3F1ZXVlIHsKPiA+ICAgICAgIGNoYXIgaXJxbmFtZVtRRUROX0lSUV9OQU1FX0xFTl07Cj4g PiAgIH07Cj4gPgo+ID4gK3N0cnVjdCBxZWRuX25lZ290aWF0aW9uX3BhcmFtcyB7Cj4gPiArICAg ICB1MzIgbWF4aDJjZGF0YTsgLyogTmVnb3RpYXRpb24gKi8KPiA+ICsgICAgIHUzMiBtYXhyMnQ7 IC8qIFZhbGlkYXRpb24gKi8KPiA+ICsgICAgIHUxNiBwZnY7IC8qIFZhbGlkYXRpb24gKi8KPiA+ ICsgICAgIGJvb2wgaGRyX2RpZ2VzdDsgLyogTmVnb3RpYXRpb24gKi8KPiA+ICsgICAgIGJvb2wg ZGF0YV9kaWdlc3Q7IC8qIE5lZ290aWF0aW9uICovCj4gPiArICAgICB1OCBjcGRhOyAvKiBOZWdv dGlhdGlvbiAqLwo+ID4gKyAgICAgdTggaHBkYTsgLyogVmFsaWRhdGlvbiAqLwo+ID4gK307Cj4g PiArCj4gPiAgIHN0cnVjdCBxZWRuX2N0eCB7Cj4gPiAgICAgICBzdHJ1Y3QgcGNpX2RldiAqcGRl djsKPiA+ICAgICAgIHN0cnVjdCBxZWRfZGV2ICpjZGV2Owo+ID4gQEAgLTE5NSw2ICsyMTMsOSBA QCBzdHJ1Y3QgcWVkbl9lbmRwb2ludCB7Cj4gPiAgICAgICBzdHJ1Y3QgcWVkX2NoYWluIGZ3X3Nx X2NoYWluOwo+ID4gICAgICAgdm9pZCBfX2lvbWVtICpwX2Rvb3JiZWxsOwo+ID4KPiA+ICsgICAg IC8qIFNwaW5sb2NrIGZvciBhY2Nlc3NpbmcgRlcgcXVldWUgKi8KPiA+ICsgICAgIHNwaW5sb2Nr X3QgZG9vcmJlbGxfbG9jazsKPiA+ICsKPiA+ICAgICAgIC8qIFRDUCBQYXJhbXMgKi8KPiA+ICAg ICAgIF9fYmUzMiBkc3RfYWRkcls0XTsgLyogSW4gbmV0d29yayBvcmRlciAqLwo+ID4gICAgICAg X19iZTMyIHNyY19hZGRyWzRdOyAvKiBJbiBuZXR3b3JrIG9yZGVyICovCj4gPiBAQCAtMjY4LDYg KzI4OSwxMiBAQCBzdHJ1Y3QgcWVkbl9jdHJsIHsKPiA+ICAgICAgIGF0b21pY190IGhvc3RfbnVt X2FjdGl2ZV9jb25uczsKPiA+ICAgfTsKPiA+Cj4gPiArc3RydWN0IHFlZG5faWNyZXFfcGFkZGlu ZyB7Cj4gPiArICAgICB1MzIgKmJ1ZmZlcjsKPiA+ICsgICAgIGRtYV9hZGRyX3QgcGE7Cj4gPiAr ICAgICBzdHJ1Y3QgbnZtZXRjcF9zZ2Ugc2dlOwo+ID4gK307Cj4gPiArCj4gPiAgIC8qIENvbm5l Y3Rpb24gbGV2ZWwgc3RydWN0ICovCj4gPiAgIHN0cnVjdCBxZWRuX2Nvbm5fY3R4IHsKPiA+ICAg ICAgIC8qIElPIHBhdGggKi8KPiA+IEBAIC0zMjksNiArMzU2LDExIEBAIHN0cnVjdCBxZWRuX2Nv bm5fY3R4IHsKPiA+Cj4gPiAgICAgICBzaXplX3Qgc3FfZGVwdGg7Cj4gPgo+ID4gKyAgICAgc3Ry dWN0IHFlZG5fbmVnb3RpYXRpb25fcGFyYW1zIHJlcXVpcmVkX3BhcmFtczsKPiA+ICsgICAgIHN0 cnVjdCBxZWRuX25lZ290aWF0aW9uX3BhcmFtcyBwZHVfcGFyYW1zOwo+ID4gKyAgICAgc3RydWN0 IG52bWV0Y3BfaWNyZXNwX2hkcl9wc2ggaWNyZXNwOwo+ID4gKyAgICAgc3RydWN0IHFlZG5faWNy ZXFfcGFkZGluZyAqaWNyZXFfcGFkOwo+ID4gKwo+ID4gICAgICAgLyogImR1bW15IiBzb2NrZXQg Ki8KPiA+ICAgICAgIHN0cnVjdCBzb2NrZXQgKnNvY2s7Cj4gPiAgIH07Cj4gPiBAQCAtMzM3LDYg KzM2OSw3IEBAIGVudW0gcWVkbl9jb25uX3Jlc291cmNlc19zdGF0ZSB7Cj4gPiAgICAgICBRRURO X0NPTk5fUkVTUkNfRldfU1EsCj4gPiAgICAgICBRRUROX0NPTk5fUkVTUkNfQUNRVUlSRV9DT05O LAo+ID4gICAgICAgUUVETl9DT05OX1JFU1JDX1RBU0tTLAo+ID4gKyAgICAgUUVETl9DT05OX1JF U1JDX0lDUkVRX1BBRCwKPiA+ICAgICAgIFFFRE5fQ09OTl9SRVNSQ19DQ0NJRF9JVElEX01BUCwK PiA+ICAgICAgIFFFRE5fQ09OTl9SRVNSQ19UQ1BfUE9SVCwKPiA+ICAgICAgIFFFRE5fQ09OTl9S RVNSQ19NQVggPSA2NAo+ID4gQEAgLTM3NSw1ICs0MDgsOCBAQCB2b2lkIHFlZG5fY29tbW9uX2Ns ZWFyX2Z3X3NnbChzdHJ1Y3Qgc3RvcmFnZV9zZ2xfdGFza19wYXJhbXMgKnNnbF90YXNrX3BhcmFt cyk7Cj4gPiAgIHZvaWQgcWVkbl9yZXR1cm5fYWN0aXZlX3Rhc2tzKHN0cnVjdCBxZWRuX2Nvbm5f Y3R4ICpjb25uX2N0eCk7Cj4gPiAgIHZvaWQgcWVkbl9kZXN0cm95X2ZyZWVfdGFza3Moc3RydWN0 IHFlZG5fZnBfcXVldWUgKmZwX3EsCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1 Y3QgcWVkbl9pb19yZXNvdXJjZXMgKmlvX3Jlc3JjKTsKPiA+ICt2b2lkIHFlZG5fc3dhcF9ieXRl cyh1MzIgKnAsIGludCBzaXplKTsKPiA+ICt2b2lkIHFlZG5fcHJlcF9pY3Jlc3Aoc3RydWN0IHFl ZG5fY29ubl9jdHggKmNvbm5fY3R4LCBzdHJ1Y3QgbnZtZXRjcF9md19jcWUgKmNxZSk7Cj4gPiAr dm9pZCBxZWRuX3JpbmdfZG9vcmJlbGwoc3RydWN0IHFlZG5fY29ubl9jdHggKmNvbm5fY3R4KTsK PiA+Cj4gPiAgICNlbmRpZiAvKiBfUUVETl9IXyAqLwo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMv bnZtZS9ody9xZWRuL3FlZG5fY29ubi5jIGIvZHJpdmVycy9udm1lL2h3L3FlZG4vcWVkbl9jb25u LmMKPiA+IGluZGV4IDEwYTgwZmJlYWM0My4uNTY3OTM1NGFhMGUwIDEwMDY0NAo+ID4gLS0tIGEv ZHJpdmVycy9udm1lL2h3L3FlZG4vcWVkbl9jb25uLmMKPiA+ICsrKyBiL2RyaXZlcnMvbnZtZS9o dy9xZWRuL3FlZG5fY29ubi5jCj4gPiBAQCAtMzQsNiArMzQsMjUgQEAgaW5saW5lIGludCBxZWRu X3FpZChzdHJ1Y3QgbnZtZV90Y3Bfb2ZsZF9xdWV1ZSAqcXVldWUpCj4gPiAgICAgICByZXR1cm4g cXVldWUgLSBxdWV1ZS0+Y3RybC0+cXVldWVzOwo+ID4gICB9Cj4gPgo+ID4gK3ZvaWQgcWVkbl9y aW5nX2Rvb3JiZWxsKHN0cnVjdCBxZWRuX2Nvbm5fY3R4ICpjb25uX2N0eCkKPiA+ICt7Cj4gPiAr ICAgICBzdHJ1Y3QgbnZtZXRjcF9kYl9kYXRhIGRiZWxsID0geyAwIH07Cj4gPiArICAgICB1MTYg cHJvZF9pZHg7Cj4gPiArCj4gPiArICAgICBkYmVsbC5hZ2dfZmxhZ3MgPSAwOwo+ID4gKyAgICAg ZGJlbGwucGFyYW1zIHw9IERCX0RFU1RfWENNIDw8IE5WTUVUQ1BfREJfREFUQV9ERVNUX1NISUZU Owo+ID4gKyAgICAgZGJlbGwucGFyYW1zIHw9IERCX0FHR19DTURfU0VUIDw8IE5WTUVUQ1BfREJf REFUQV9BR0dfQ01EX1NISUZUOwo+ID4gKyAgICAgZGJlbGwucGFyYW1zIHw9Cj4gPiArICAgICAg ICAgICAgIERRX1hDTV9JU0NTSV9TUV9QUk9EX0NNRCA8PCBOVk1FVENQX0RCX0RBVEFfQUdHX1ZB TF9TRUxfU0hJRlQ7Cj4gPiArICAgICBkYmVsbC5wYXJhbXMgfD0gMSA8PCBOVk1FVENQX0RCX0RB VEFfQllQQVNTX0VOX1NISUZUOwo+ID4gKyAgICAgcHJvZF9pZHggPSBxZWRfY2hhaW5fZ2V0X3By b2RfaWR4KCZjb25uX2N0eC0+ZXAuZndfc3FfY2hhaW4pOwo+ID4gKyAgICAgZGJlbGwuc3FfcHJv ZCA9IGNwdV90b19sZTE2KHByb2RfaWR4KTsKPiA+ICsKPiA+ICsgICAgIC8qIHdtYiAtIE1ha2Ug c3VyZSBmdyBpZHggaXMgY29oZXJlbnQgKi8KPiA+ICsgICAgIHdtYigpOwo+ID4gKyAgICAgd3Jp dGVsKCoodTMyICopJmRiZWxsLCBjb25uX2N0eC0+ZXAucF9kb29yYmVsbCk7Cj4gPiArfQo+ID4g Kwo+ID4gICBpbnQgcWVkbl9zZXRfY29uX3N0YXRlKHN0cnVjdCBxZWRuX2Nvbm5fY3R4ICpjb25u X2N0eCwgZW51bSBxZWRuX2Nvbm5fc3RhdGUgbmV3X3N0YXRlKQo+ID4gICB7Cj4gPiAgICAgICBz cGluX2xvY2tfYmgoJmNvbm5fY3R4LT5jb25uX3N0YXRlX2xvY2spOwo+ID4gQEAgLTEzMCw2ICsx NDksNzEgQEAgaW50IHFlZG5faW5pdGlhbGl6ZV9lbmRwb2ludChzdHJ1Y3QgcWVkbl9lbmRwb2lu dCAqZXAsIHU4ICpsb2NhbF9tYWNfYWRkciwKPiA+ICAgICAgIHJldHVybiAtMTsKPiA+ICAgfQo+ ID4KPiA+ICtzdGF0aWMgaW50IHFlZG5fYWxsb2NfaWNyZXFfcGFkKHN0cnVjdCBxZWRuX2Nvbm5f Y3R4ICpjb25uX2N0eCkKPiA+ICt7Cj4gPiArICAgICBzdHJ1Y3QgcWVkbl9jdHggKnFlZG4gPSBj b25uX2N0eC0+cWVkbjsKPiA+ICsgICAgIHN0cnVjdCBxZWRuX2ljcmVxX3BhZGRpbmcgKmljcmVx X3BhZDsKPiA+ICsgICAgIHUzMiAqYnVmZmVyOwo+ID4gKyAgICAgaW50IHJjID0gMDsKPiA+ICsK PiA+ICsgICAgIGljcmVxX3BhZCA9IGt6YWxsb2Moc2l6ZW9mKCppY3JlcV9wYWQpLCBHRlBfS0VS TkVMKTsKPiA+ICsgICAgIGlmICghaWNyZXFfcGFkKQo+ID4gKyAgICAgICAgICAgICByZXR1cm4g LUVOT01FTTsKPiA+ICsKPiA+ICsgICAgIGNvbm5fY3R4LT5pY3JlcV9wYWQgPSBpY3JlcV9wYWQ7 Cj4gPiArICAgICBtZW1zZXQoJmljcmVxX3BhZC0+c2dlLCAwLCBzaXplb2YoaWNyZXFfcGFkLT5z Z2UpKTsKPiA+ICsgICAgIGJ1ZmZlciA9IGRtYV9hbGxvY19jb2hlcmVudCgmcWVkbi0+cGRldi0+ ZGV2LAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFFRE5fSUNSRVFfRldf UEFZTE9BRCwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNyZXFfcGFk LT5wYSwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRlBfS0VSTkVMKTsK PiA+ICsgICAgIGlmICghYnVmZmVyKSB7Cj4gPiArICAgICAgICAgICAgIHByX2VycigiQ291bGQg bm90IGFsbG9jYXRlIGljcmVxX3BhZGRpbmcgU0dFIGJ1ZmZlci5cbiIpOwo+ID4gKyAgICAgICAg ICAgICByYyA9ICAtRU5PTUVNOwo+ID4gKyAgICAgICAgICAgICBnb3RvIHJlbGVhc2VfaWNyZXFf cGFkOwo+ID4gKyAgICAgfQo+ID4gKwo+ID4gKyAgICAgRE1BX1JFR1BBSVJfTEUoaWNyZXFfcGFk LT5zZ2Uuc2dlX2FkZHIsIGljcmVxX3BhZC0+cGEpOwo+ID4gKyAgICAgaWNyZXFfcGFkLT5zZ2Uu c2dlX2xlbiA9IGNwdV90b19sZTMyKFFFRE5fSUNSRVFfRldfUEFZTE9BRCk7Cj4gPiArICAgICBp Y3JlcV9wYWQtPmJ1ZmZlciA9IGJ1ZmZlcjsKPiA+ICsgICAgIHNldF9iaXQoUUVETl9DT05OX1JF U1JDX0lDUkVRX1BBRCwgJmNvbm5fY3R4LT5yZXNyY19zdGF0ZSk7Cj4gPiArCj4gPiArICAgICBy ZXR1cm4gMDsKPiA+ICsKPiA+ICtyZWxlYXNlX2ljcmVxX3BhZDoKPiA+ICsgICAgIGtmcmVlKGlj cmVxX3BhZCk7Cj4gPiArICAgICBjb25uX2N0eC0+aWNyZXFfcGFkID0gTlVMTDsKPiA+ICsKPiA+ ICsgICAgIHJldHVybiByYzsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHZvaWQgcWVkbl9mcmVl X2ljcmVxX3BhZChzdHJ1Y3QgcWVkbl9jb25uX2N0eCAqY29ubl9jdHgpCj4gPiArewo+ID4gKyAg ICAgc3RydWN0IHFlZG5fY3R4ICpxZWRuID0gY29ubl9jdHgtPnFlZG47Cj4gPiArICAgICBzdHJ1 Y3QgcWVkbl9pY3JlcV9wYWRkaW5nICppY3JlcV9wYWQ7Cj4gPiArICAgICB1MzIgKmJ1ZmZlcjsK PiA+ICsKPiA+ICsgICAgIGljcmVxX3BhZCA9IGNvbm5fY3R4LT5pY3JlcV9wYWQ7Cj4gPiArICAg ICBpZiAodW5saWtlbHkoIWljcmVxX3BhZCkpIHsKPiA+ICsgICAgICAgICAgICAgcHJfZXJyKCJu dWxsIHB0ciBpbiBpY3JlcV9wYWQgaW4gY29ubl9jdHhcbiIpOwo+ID4gKyAgICAgICAgICAgICBn b3RvIGZpbmFsbHk7Cj4gPiArICAgICB9Cj4gPiArCj4gPiArICAgICBidWZmZXIgPSBpY3JlcV9w YWQtPmJ1ZmZlcjsKPiA+ICsgICAgIGlmIChidWZmZXIpIHsKPiA+ICsgICAgICAgICAgICAgZG1h X2ZyZWVfY29oZXJlbnQoJnFlZG4tPnBkZXYtPmRldiwKPiA+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgUUVETl9JQ1JFUV9GV19QQVlMT0FELAo+ID4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAodm9pZCAqKWJ1ZmZlciwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgaWNyZXFfcGFkLT5wYSk7Cj4gPiArICAgICAgICAgICAgIGljcmVxX3BhZC0+YnVm ZmVyID0gTlVMTDsKPiA+ICsgICAgIH0KPiA+ICsKPiA+ICsgICAgIGtmcmVlKGljcmVxX3BhZCk7 Cj4gPiArICAgICBjb25uX2N0eC0+aWNyZXFfcGFkID0gTlVMTDsKPiA+ICsKPiA+ICtmaW5hbGx5 Ogo+ID4gKyAgICAgY2xlYXJfYml0KFFFRE5fQ09OTl9SRVNSQ19JQ1JFUV9QQUQsICZjb25uX2N0 eC0+cmVzcmNfc3RhdGUpOwo+ID4gK30KPiA+ICsKPiA+ICAgc3RhdGljIHZvaWQgcWVkbl9yZWxl YXNlX2Nvbm5fY3R4KHN0cnVjdCBxZWRuX2Nvbm5fY3R4ICpjb25uX2N0eCkKPiA+ICAgewo+ID4g ICAgICAgc3RydWN0IHFlZG5fY3R4ICpxZWRuID0gY29ubl9jdHgtPnFlZG47Cj4gPiBAQCAtMTUx LDYgKzIzNSw5IEBAIHN0YXRpYyB2b2lkIHFlZG5fcmVsZWFzZV9jb25uX2N0eChzdHJ1Y3QgcWVk bl9jb25uX2N0eCAqY29ubl9jdHgpCj4gPiAgICAgICAgICAgICAgIGNsZWFyX2JpdChRRUROX0NP Tk5fUkVTUkNfQUNRVUlSRV9DT05OLCAmY29ubl9jdHgtPnJlc3JjX3N0YXRlKTsKPiA+ICAgICAg IH0KPiA+Cj4gPiArICAgICBpZiAodGVzdF9iaXQoUUVETl9DT05OX1JFU1JDX0lDUkVRX1BBRCwg JmNvbm5fY3R4LT5yZXNyY19zdGF0ZSkpCj4gPiArICAgICAgICAgICAgIHFlZG5fZnJlZV9pY3Jl cV9wYWQoY29ubl9jdHgpOwo+ID4gKwo+ID4gICAgICAgaWYgKHRlc3RfYml0KFFFRE5fQ09OTl9S RVNSQ19UQVNLUywgJmNvbm5fY3R4LT5yZXNyY19zdGF0ZSkpIHsKPiA+ICAgICAgICAgICAgICAg Y2xlYXJfYml0KFFFRE5fQ09OTl9SRVNSQ19UQVNLUywgJmNvbm5fY3R4LT5yZXNyY19zdGF0ZSk7 Cj4gPiAgICAgICAgICAgICAgICAgICAgICAgcWVkbl9yZXR1cm5fYWN0aXZlX3Rhc2tzKGNvbm5f Y3R4KTsKPiA+IEBAIC0zMDksNiArMzk2LDE5NCBAQCB2b2lkIHFlZG5fdGVybWluYXRlX2Nvbm5l Y3Rpb24oc3RydWN0IHFlZG5fY29ubl9jdHggKmNvbm5fY3R4LCBpbnQgYWJydF9mbGFnKQo+ID4g ICAgICAgcXVldWVfd29yayhxY3RybC0+c3Bfd3EsICZjb25uX2N0eC0+c3Bfd3FfZW50cnkpOwo+ ID4gICB9Cj4gPgo+ID4gK3N0YXRpYyBpbnQgcWVkbl9udm1ldGNwX3VwZGF0ZV9jb25uKHN0cnVj dCBxZWRuX2N0eCAqcWVkbiwgc3RydWN0IHFlZG5fY29ubl9jdHggKmNvbm5fY3R4KQo+ID4gK3sK PiA+ICsgICAgIHN0cnVjdCBxZWRuX25lZ290aWF0aW9uX3BhcmFtcyAqcGR1X3BhcmFtcyA9ICZj b25uX2N0eC0+cGR1X3BhcmFtczsKPiA+ICsgICAgIHN0cnVjdCBxZWRfbnZtZXRjcF9wYXJhbXNf dXBkYXRlICpjb25uX2luZm87Cj4gPiArICAgICBpbnQgcmM7Cj4gPiArCj4gPiArICAgICBjb25u X2luZm8gPSBremFsbG9jKHNpemVvZigqY29ubl9pbmZvKSwgR0ZQX0tFUk5FTCk7Cj4gPiArICAg ICBpZiAoIWNvbm5faW5mbykKPiA+ICsgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Cj4gPiAr Cj4gPiArICAgICBjb25uX2luZm8tPmhkcl9kaWdlc3RfZW4gPSBwZHVfcGFyYW1zLT5oZHJfZGln ZXN0Owo+ID4gKyAgICAgY29ubl9pbmZvLT5kYXRhX2RpZ2VzdF9lbiA9IHBkdV9wYXJhbXMtPmRh dGFfZGlnZXN0Owo+ID4gKyAgICAgY29ubl9pbmZvLT5tYXhfcmVjdl9wZHVfbGVuZ3RoID0gUUVE Tl9NQVhfUERVX1NJWkU7Cj4gPiArICAgICBjb25uX2luZm8tPm1heF9pb19zaXplID0gUUVETl9N QVhfSU9fU0laRTsKPiA+ICsgICAgIGNvbm5faW5mby0+bWF4X3NlbmRfcGR1X2xlbmd0aCA9IHBk dV9wYXJhbXMtPm1heGgyY2RhdGE7Cj4gPiArCj4gPiArICAgICByYyA9IHFlZF9vcHMtPnVwZGF0 ZV9jb25uKHFlZG4tPmNkZXYsIGNvbm5fY3R4LT5jb25uX2hhbmRsZSwgY29ubl9pbmZvKTsKPiA+ ICsgICAgIGlmIChyYykgewo+ID4gKyAgICAgICAgICAgICBwcl9lcnIoIkNvdWxkIG5vdCB1cGRh dGUgY29ubmVjdGlvblxuIik7Cj4gPiArICAgICAgICAgICAgIHJjID0gLUVOWElPOwo+ID4gKyAg ICAgfQo+ID4gKwo+ID4gKyAgICAga2ZyZWUoY29ubl9pbmZvKTsKPiA+ICsKPiA+ICsgICAgIHJl dHVybiByYzsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludCBxZWRuX3VwZGF0ZV9yYW1yb2Qo c3RydWN0IHFlZG5fY29ubl9jdHggKmNvbm5fY3R4KQo+ID4gK3sKPiA+ICsgICAgIHN0cnVjdCBx ZWRuX2N0eCAqcWVkbiA9IGNvbm5fY3R4LT5xZWRuOwo+ID4gKyAgICAgaW50IHJjID0gMDsKPiA+ ICsKPiA+ICsgICAgIHJjID0gcWVkbl9zZXRfY29uX3N0YXRlKGNvbm5fY3R4LCBDT05OX1NUQVRF X1dBSVRfRk9SX1VQREFURV9FUUUpOwo+ID4gKyAgICAgaWYgKHJjKQo+ID4gKyAgICAgICAgICAg ICByZXR1cm4gcmM7Cj4gPiArCj4gPiArICAgICByYyA9IHFlZG5fbnZtZXRjcF91cGRhdGVfY29u bihxZWRuLCBjb25uX2N0eCk7Cj4gPiArICAgICBpZiAocmMpCj4gPiArICAgICAgICAgICAgIHJl dHVybiByYzsKPiA+ICsKPiA+ICsgICAgIGlmIChjb25uX2N0eC0+c3RhdGUgIT0gQ09OTl9TVEFU RV9XQUlUX0ZPUl9VUERBVEVfRVFFKSB7Cj4gPiArICAgICAgICAgICAgIHByX2VycigiY2lkIDB4 JXg6IFVuZXhwZWN0ZWQgc3RhdGUgMHgleCBhZnRlciB1cGRhdGUgcmFtcm9kXG4iLAo+ID4gKyAg ICAgICAgICAgICAgICAgICAgY29ubl9jdHgtPmZ3X2NpZCwgY29ubl9jdHgtPnN0YXRlKTsKPiA+ ICsKPiA+ICsgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4gPiArICAgICB9Cj4gPiArCj4g PiArICAgICByZXR1cm4gcmM7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgcWVkbl9zZW5k X2ljcmVxKHN0cnVjdCBxZWRuX2Nvbm5fY3R4ICpjb25uX2N0eCkKPiA+ICt7Cj4gPiArICAgICBz dHJ1Y3QgbnZtZXRjcF9pbml0X2Nvbm5fcmVxX2hkciAqaWNyZXFfcHRyID0gTlVMTDsKPiA+ICsg ICAgIHN0cnVjdCBzdG9yYWdlX3NnbF90YXNrX3BhcmFtcyAqc2dsX3Rhc2tfcGFyYW1zOwo+ID4g KyAgICAgc3RydWN0IG52bWV0Y3BfdGFza19wYXJhbXMgdGFza19wYXJhbXM7Cj4gPiArICAgICBz dHJ1Y3QgcWVkbl90YXNrX2N0eCAqcWVkbl90YXNrID0gTlVMTDsKPiA+ICsgICAgIHN0cnVjdCBu dm1lX3RjcF9pY3JlcV9wZHUgaWNyZXE7Cj4gPiArICAgICBzdHJ1Y3QgbnZtZXRjcF93cWUgKmNo YWluX3NxZTsKPiA+ICsgICAgIHN0cnVjdCBudm1ldGNwX3dxZSBsb2NhbF9zcWU7Cj4gPiArCj4g PiArICAgICBxZWRuX3Rhc2sgPSBxZWRuX2dldF90YXNrX2Zyb21fcG9vbF9pbnNpc3QoY29ubl9j dHgsIFFFRE5fSUNSRVFfQ0NDSUQpOwo+ID4gKyAgICAgaWYgKCFxZWRuX3Rhc2spCj4gPiArICAg ICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+ID4gKwo+ID4gKyAgICAgbWVtc2V0KCZpY3JlcSwg MCwgc2l6ZW9mKGljcmVxKSk7Cj4gPiArICAgICBtZW1zZXQoJmxvY2FsX3NxZSwgMCwgc2l6ZW9m KGxvY2FsX3NxZSkpOwo+ID4gKwo+ID4gKyAgICAgLyogSW5pdGlhbGl6ZSBJQ1JlcSAqLwo+ID4g KyAgICAgaWNyZXEuaGRyLnR5cGUgPSBudm1lX3RjcF9pY3JlcTsKPiA+ICsgICAgIGljcmVxLmhk ci5obGVuID0gc2l6ZW9mKGljcmVxKTsKPiA+ICsgICAgIGljcmVxLmhkci5wZG8gPSAwOwo+ID4g KyAgICAgaWNyZXEuaGRyLnBsZW4gPSBjcHVfdG9fbGUzMihpY3JlcS5oZHIuaGxlbik7Cj4gPiAr ICAgICBpY3JlcS5wZnYgPSBjcHVfdG9fbGUxNihjb25uX2N0eC0+cmVxdWlyZWRfcGFyYW1zLnBm dik7Cj4gPiArICAgICBpY3JlcS5tYXhyMnQgPSBjcHVfdG9fbGUzMihjb25uX2N0eC0+cmVxdWly ZWRfcGFyYW1zLm1heHIydCk7Cj4gPiArICAgICBpY3JlcS5ocGRhID0gY29ubl9jdHgtPnJlcXVp cmVkX3BhcmFtcy5ocGRhOwo+ID4gKyAgICAgaWYgKGNvbm5fY3R4LT5yZXF1aXJlZF9wYXJhbXMu aGRyX2RpZ2VzdCkKPiA+ICsgICAgICAgICAgICAgaWNyZXEuZGlnZXN0IHw9IE5WTUVfVENQX0hE Ul9ESUdFU1RfRU5BQkxFOwo+ID4gKyAgICAgaWYgKGNvbm5fY3R4LT5yZXF1aXJlZF9wYXJhbXMu ZGF0YV9kaWdlc3QpCj4gPiArICAgICAgICAgICAgIGljcmVxLmRpZ2VzdCB8PSBOVk1FX1RDUF9E QVRBX0RJR0VTVF9FTkFCTEU7Cj4gPiArCj4gPiArICAgICBxZWRuX3N3YXBfYnl0ZXMoKHUzMiAq KSZpY3JlcSwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKGljcmVxKSAtIFFFRE5f SUNSRVFfRldfUEFZTE9BRCkgLwo+ID4gKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodTMy KSk7Cj4gPiArCj4gPiArICAgICAvKiBJbml0aWFsaXplIHRhc2sgcGFyYW1zICovCj4gPiArICAg ICB0YXNrX3BhcmFtcy5vcHEubG8gPSBjcHVfdG9fbGUzMigoKHU2NCkocWVkbl90YXNrKSkgJiAw eGZmZmZmZmZmKTsKPiA+ICsgICAgIHRhc2tfcGFyYW1zLm9wcS5oaSA9IGNwdV90b19sZTMyKCgo dTY0KShxZWRuX3Rhc2spKSA+PiAzMik7Cj4gPiArICAgICB0YXNrX3BhcmFtcy5jb250ZXh0ID0g cWVkbl90YXNrLT5md190YXNrX2N0eDsKPiA+ICsgICAgIHRhc2tfcGFyYW1zLnNxZSA9ICZsb2Nh bF9zcWU7Cj4gPiArICAgICB0YXNrX3BhcmFtcy5jb25uX2ljaWQgPSAodTE2KWNvbm5fY3R4LT5j b25uX2hhbmRsZTsKPiA+ICsgICAgIHRhc2tfcGFyYW1zLml0aWQgPSBxZWRuX3Rhc2stPml0aWQ7 Cj4gPiArICAgICB0YXNrX3BhcmFtcy5jcV9yc3NfbnVtYmVyID0gY29ubl9jdHgtPmRlZmF1bHRf Y3E7Cj4gPiArICAgICB0YXNrX3BhcmFtcy50eF9pb19zaXplID0gUUVETl9JQ1JFUV9GV19QQVlM T0FEOwo+ID4gKyAgICAgdGFza19wYXJhbXMucnhfaW9fc2l6ZSA9IDA7IC8qIFJ4IGRvZXNuJ3Qg dXNlIFNHTCBmb3IgaWNyZXNwICovCj4gPiArCj4gPiArICAgICAvKiBJbml0IFNHRSBmb3IgSUNS ZXEgcGFkZGluZyAqLwo+ID4gKyAgICAgc2dsX3Rhc2tfcGFyYW1zID0gJnFlZG5fdGFzay0+c2ds X3Rhc2tfcGFyYW1zOwo+ID4gKyAgICAgc2dsX3Rhc2tfcGFyYW1zLT50b3RhbF9idWZmZXJfc2l6 ZSA9IHRhc2tfcGFyYW1zLnR4X2lvX3NpemU7Cj4gPiArICAgICBzZ2xfdGFza19wYXJhbXMtPnNt YWxsX21pZF9zZ2UgPSBmYWxzZTsKPiA+ICsgICAgIHNnbF90YXNrX3BhcmFtcy0+bnVtX3NnZXMg PSAxOwo+ID4gKyAgICAgbWVtY3B5KHNnbF90YXNrX3BhcmFtcy0+c2dsLCAmY29ubl9jdHgtPmlj cmVxX3BhZC0+c2dlLAo+ID4gKyAgICAgICAgICAgIHNpemVvZihjb25uX2N0eC0+aWNyZXFfcGFk LT5zZ2UpKTsKPiA+ICsgICAgIGljcmVxX3B0ciA9IChzdHJ1Y3QgbnZtZXRjcF9pbml0X2Nvbm5f cmVxX2hkciAqKSZpY3JlcTsKPiA+ICsKPiA+ICsgICAgIHFlZF9vcHMtPmluaXRfaWNyZXFfZXhj aGFuZ2UoJnRhc2tfcGFyYW1zLCBpY3JlcV9wdHIsIHNnbF90YXNrX3BhcmFtcywgIE5VTEwpOwo+ ID4gKwo+ID4gKyAgICAgcWVkbl9zZXRfY29uX3N0YXRlKGNvbm5fY3R4LCBDT05OX1NUQVRFX1dB SVRfRk9SX0lDX0NPTVApOwo+ID4gKyAgICAgYXRvbWljX2luYygmY29ubl9jdHgtPm51bV9hY3Rp dmVfZndfdGFza3MpOwo+ID4gKwo+ID4gKyAgICAgLyogc3Bpbl9sb2NrIC0gZG9vcmJlbGwgaXMg YWNjZXNzZWQgIGJvdGggUnggZmxvdyBhbmQgcmVzcG9uc2UgZmxvdyAqLwo+ID4gKyAgICAgc3Bp bl9sb2NrKCZjb25uX2N0eC0+ZXAuZG9vcmJlbGxfbG9jayk7Cj4gPiArICAgICBjaGFpbl9zcWUg PSBxZWRfY2hhaW5fcHJvZHVjZSgmY29ubl9jdHgtPmVwLmZ3X3NxX2NoYWluKTsKPiA+ICsgICAg IG1lbWNweShjaGFpbl9zcWUsICZsb2NhbF9zcWUsIHNpemVvZihsb2NhbF9zcWUpKTsKPiA+ICsg ICAgIHFlZG5fcmluZ19kb29yYmVsbChjb25uX2N0eCk7Cj4gPiArICAgICBzcGluX3VubG9jaygm Y29ubl9jdHgtPmVwLmRvb3JiZWxsX2xvY2spOwo+ID4gKwo+ID4gKyAgICAgcmV0dXJuIDA7Cj4g PiArfQo+ID4gKwo+Cj4gQW5kIHRoaXMgaXMgd2hhdCBJIG1lYW50LiBZb3UgX2RvXyBzd2FiIGJ5 dGVzIGJlZm9yZSBzZW5kaW5nIGl0IG9mZiB0bwo+IHRoZSBIVywgX2FuZF8geW91IHVzZSB0aGUg c3RhbmRhcmQgbnZtZS10Y3AgUERVIGRlZmluaXRpb25zLgo+IFNvIHdoeSBkbyB5b3UgaGF2ZSB5 b3VyIG93biwgYnl0ZS1zd2FwcGVkIHZlcnNpb25zIG9mIHRoZSBQRFVzPwoKV2Ugd2lsbCBjaGFu Z2UgaXQgYW5kIHVzZSB0aGUgc3RhbmRhcmQgc3RydWN0ICdudm1lX3RjcF9pY3JlcV9wZHUnLgoK Pgo+ID4gK3ZvaWQgcWVkbl9wcmVwX2ljcmVzcChzdHJ1Y3QgcWVkbl9jb25uX2N0eCAqY29ubl9j dHgsIHN0cnVjdCBudm1ldGNwX2Z3X2NxZSAqY3FlKQo+ID4gK3sKPiA+ICsgICAgIHN0cnVjdCBu dm1ldGNwX2ljcmVzcF9oZHJfcHNoICppY3Jlc3BfZnJvbV9jcWUgPQo+ID4gKyAgICAgICAgICAg ICAoc3RydWN0IG52bWV0Y3BfaWNyZXNwX2hkcl9wc2ggKikmY3FlLT5udm1lX2NxZTsKPiA+ICsg ICAgIHN0cnVjdCBudm1lX3RjcF9vZmxkX2N0cmwgKmN0cmwgPSBjb25uX2N0eC0+Y3RybDsKPiA+ ICsgICAgIHN0cnVjdCBxZWRuX2N0cmwgKnFjdHJsID0gTlVMTDsKPiA+ICsKPiA+ICsgICAgIHFj dHJsID0gKHN0cnVjdCBxZWRuX2N0cmwgKiljdHJsLT5wcml2YXRlX2RhdGE7Cj4gPiArCj4gPiAr ICAgICBtZW1jcHkoJmNvbm5fY3R4LT5pY3Jlc3AsIGljcmVzcF9mcm9tX2NxZSwgc2l6ZW9mKGNv bm5fY3R4LT5pY3Jlc3ApKTsKPiA+ICsgICAgIHFlZG5fc2V0X3NwX3dhKGNvbm5fY3R4LCBIQU5E TEVfSUNSRVNQKTsKPiA+ICsgICAgIHF1ZXVlX3dvcmsocWN0cmwtPnNwX3dxLCAmY29ubl9jdHgt PnNwX3dxX2VudHJ5KTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludCBxZWRuX2hhbmRsZV9p Y3Jlc3Aoc3RydWN0IHFlZG5fY29ubl9jdHggKmNvbm5fY3R4KQo+ID4gK3sKPiA+ICsgICAgIHN0 cnVjdCBudm1ldGNwX2ljcmVzcF9oZHJfcHNoICppY3Jlc3AgPSAmY29ubl9jdHgtPmljcmVzcDsK PiA+ICsgICAgIHUxNiBwZnYgPSBfX3N3YWIxNihsZTE2X3RvX2NwdShpY3Jlc3AtPnBmdl9zd2Fw cGVkKSk7Cj4gPiArICAgICBpbnQgcmMgPSAwOwo+ID4gKwo+Cj4gQWdhaW4gaGVyZTsgeW91IGNv dWxkIHRyZWF0IHRoZSByZWNlaXZlZCBpY3Jlc3AgYXMgYSBiaW5hcmF5IGJsb2IuCj4gYnl0ZXN3 YXAgaXQsIGFuZCB0aGVuIGNhc3QgaXMgdG8gdGhlIHN0YW5kYXJkIGljcmVzcCBzdHJ1Y3R1cmUu Cj4gSG1tPwoKV2l0aCB0aGUgZXhpc3RpbmcgRlcsIHRoZSBkcml2ZXIgcmVjZWl2ZXMgb25seSB0 aGUgbWVhbmluZ2Z1bCBmaWVsZHMgZnJvbQp0aGUgaWNyZXNwLiBBcyBhIGZ1dHVyZSBlbmhhbmNl bWVudCwgd2Ugd2lsbCBjb25zaWRlciBtb2RpZnlpbmcgdGhlIEZXCnRvIHBhc3MgdGhlIGVudGly ZSBpY3Jlc3AgdG8gdGhlIGRyaXZlci4KCj4KPiA+ICsgICAgIHFlZG5fZnJlZV9pY3JlcV9wYWQo Y29ubl9jdHgpOwo+ID4gKwo+ID4gKyAgICAgLyogVmFsaWRhdGUgSUNSZXNwICovCj4gPiArICAg ICBpZiAocGZ2ICE9IGNvbm5fY3R4LT5yZXF1aXJlZF9wYXJhbXMucGZ2KSB7Cj4gPiArICAgICAg ICAgICAgIHByX2VycigiY2lkICV1OiB1bnN1cHBvcnRlZCBwZnYgJXVcbiIsIGNvbm5fY3R4LT5m d19jaWQsIHBmdik7Cj4gPiArCj4gPiArICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+ID4g KyAgICAgfQo+ID4gKwo+ID4gKyAgICAgaWYgKGljcmVzcC0+Y3BkYSA+IGNvbm5fY3R4LT5yZXF1 aXJlZF9wYXJhbXMuY3BkYSkgewo+ID4gKyAgICAgICAgICAgICBwcl9lcnIoImNpZCAldTogdW5z dXBwb3J0ZWQgY3BkYSAldVxuIiwgY29ubl9jdHgtPmZ3X2NpZCwgaWNyZXNwLT5jcGRhKTsKPiA+ ICsKPiA+ICsgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4gPiArICAgICB9Cj4gPiArCj4g PiArICAgICBpZiAoKE5WTUVfVENQX0hEUl9ESUdFU1RfRU5BQkxFICYgaWNyZXNwLT5kaWdlc3Qp ICE9Cj4gPiArICAgICAgICAgY29ubl9jdHgtPnJlcXVpcmVkX3BhcmFtcy5oZHJfZGlnZXN0KSB7 Cj4gPiArICAgICAgICAgICAgIGlmICgoTlZNRV9UQ1BfSERSX0RJR0VTVF9FTkFCTEUgJiBpY3Jl c3AtPmRpZ2VzdCkgPgo+ID4gKyAgICAgICAgICAgICAgICAgY29ubl9jdHgtPnJlcXVpcmVkX3Bh cmFtcy5oZHJfZGlnZXN0KSB7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgcHJfZXJyKCJjaWQg MHgleDogaW52YWxpZCBoZWFkZXIgZGlnZXN0IGJpdFxuIiwgY29ubl9jdHgtPmZ3X2NpZCk7Cj4g PiArICAgICAgICAgICAgIH0KPiA+ICsgICAgIH0KPiA+ICsKPiA+ICsgICAgIGlmICgoTlZNRV9U Q1BfREFUQV9ESUdFU1RfRU5BQkxFICYgaWNyZXNwLT5kaWdlc3QpICE9Cj4gPiArICAgICAgICAg Y29ubl9jdHgtPnJlcXVpcmVkX3BhcmFtcy5kYXRhX2RpZ2VzdCkgewo+ID4gKyAgICAgICAgICAg ICBpZiAoKE5WTUVfVENQX0RBVEFfRElHRVNUX0VOQUJMRSAmIGljcmVzcC0+ZGlnZXN0KSA+Cj4g PiArICAgICAgICAgICAgICAgICBjb25uX2N0eC0+cmVxdWlyZWRfcGFyYW1zLmRhdGFfZGlnZXN0 KSB7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgcHJfZXJyKCJjaWQgMHgleDogaW52YWxpZCBk YXRhIGRpZ2VzdCBiaXRcbiIsIGNvbm5fY3R4LT5md19jaWQpOwo+ID4gKyAgICAgfQo+ID4gKyAg ICAgfQo+ID4gKwo+ID4gKyAgICAgbWVtc2V0KCZjb25uX2N0eC0+cGR1X3BhcmFtcywgMCwgc2l6 ZW9mKGNvbm5fY3R4LT5wZHVfcGFyYW1zKSk7Cj4gPiArICAgICBjb25uX2N0eC0+cGR1X3BhcmFt cy5tYXhoMmNkYXRhID0KPiA+ICsgICAgICAgICAgICAgX19zd2FiMzIobGUzMl90b19jcHUoaWNy ZXNwLT5tYXhkYXRhX3N3YXBwZWQpKTsKPiA+ICsgICAgIGNvbm5fY3R4LT5wZHVfcGFyYW1zLm1h eGgyY2RhdGEgPSBRRUROX01BWF9QRFVfU0laRTsKPiA+ICsgICAgIGlmIChjb25uX2N0eC0+cGR1 X3BhcmFtcy5tYXhoMmNkYXRhID4gUUVETl9NQVhfUERVX1NJWkUpCj4gPiArICAgICAgICAgICAg IGNvbm5fY3R4LT5wZHVfcGFyYW1zLm1heGgyY2RhdGEgPSBRRUROX01BWF9QRFVfU0laRTsKPiA+ ICsKPiA+ICsgICAgIGNvbm5fY3R4LT5wZHVfcGFyYW1zLnBmdiA9IHBmdjsKPiA+ICsgICAgIGNv bm5fY3R4LT5wZHVfcGFyYW1zLmNwZGEgPSBpY3Jlc3AtPmNwZGE7Cj4gPiArICAgICBjb25uX2N0 eC0+cGR1X3BhcmFtcy5ocGRhID0gY29ubl9jdHgtPnJlcXVpcmVkX3BhcmFtcy5ocGRhOwo+ID4g KyAgICAgY29ubl9jdHgtPnBkdV9wYXJhbXMuaGRyX2RpZ2VzdCA9IE5WTUVfVENQX0hEUl9ESUdF U1RfRU5BQkxFICYgaWNyZXNwLT5kaWdlc3Q7Cj4gPiArICAgICBjb25uX2N0eC0+cGR1X3BhcmFt cy5kYXRhX2RpZ2VzdCA9IE5WTUVfVENQX0RBVEFfRElHRVNUX0VOQUJMRSAmIGljcmVzcC0+ZGln ZXN0Owo+ID4gKyAgICAgY29ubl9jdHgtPnBkdV9wYXJhbXMubWF4cjJ0ID0gY29ubl9jdHgtPnJl cXVpcmVkX3BhcmFtcy5tYXhyMnQ7Cj4gPiArICAgICByYyA9IHFlZG5fdXBkYXRlX3JhbXJvZChj b25uX2N0eCk7Cj4gPiArCj4gPiArICAgICByZXR1cm4gcmM7Cj4gPiArfQo+ID4gKwo+ID4gICAv KiBTbG93cGF0aCBFUSBDYWxsYmFjayAqLwo+ID4gICBpbnQgcWVkbl9ldmVudF9jYih2b2lkICpj b250ZXh0LCB1OCBmd19ldmVudF9jb2RlLCB2b2lkICpldmVudF9yaW5nX2RhdGEpCj4gPiAgIHsK PiA+IEBAIC0zNjMsNyArNjM4LDggQEAgaW50IHFlZG5fZXZlbnRfY2Iodm9pZCAqY29udGV4dCwg dTggZndfZXZlbnRfY29kZSwgdm9pZCAqZXZlbnRfcmluZ19kYXRhKQo+ID4gICAgICAgICAgICAg ICAgICAgICAgIGlmIChyYykKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVy biByYzsKPiA+Cj4gPiAtICAgICAgICAgICAgICAgICAgICAgLyogUGxhY2Vob2xkZXIgLSBmb3Ig SUNSZXEgZmxvdyAqLwo+ID4gKyAgICAgICAgICAgICAgICAgICAgIHFlZG5fc2V0X3NwX3dhKGNv bm5fY3R4LCBTRU5EX0lDUkVRKTsKPiA+ICsgICAgICAgICAgICAgICAgICAgICBxdWV1ZV93b3Jr KHFjdHJsLT5zcF93cSwgJmNvbm5fY3R4LT5zcF93cV9lbnRyeSk7Cj4gPiAgICAgICAgICAgICAg IH0KPiA+Cj4gPiAgICAgICAgICAgICAgIGJyZWFrOwo+ID4gQEAgLTM5OSw2ICs2NzUsNyBAQCBz dGF0aWMgaW50IHFlZG5fcHJlcF9hbmRfb2ZmbG9hZF9xdWV1ZShzdHJ1Y3QgcWVkbl9jb25uX2N0 eCAqY29ubl9jdHgpCj4gPiAgICAgICB9Cj4gPgo+ID4gICAgICAgc2V0X2JpdChRRUROX0NPTk5f UkVTUkNfRldfU1EsICZjb25uX2N0eC0+cmVzcmNfc3RhdGUpOwo+ID4gKyAgICAgc3Bpbl9sb2Nr X2luaXQoJmNvbm5fY3R4LT5lcC5kb29yYmVsbF9sb2NrKTsKPiA+ICAgICAgIElOSVRfTElTVF9I RUFEKCZjb25uX2N0eC0+aG9zdF9wZW5kX3JlcV9saXN0KTsKPiA+ICAgICAgIHNwaW5fbG9ja19p bml0KCZjb25uX2N0eC0+bnZtZV9yZXFfbG9jayk7Cj4gPiAgICAgICBhdG9taWNfc2V0KCZjb25u X2N0eC0+bnVtX2FjdGl2ZV90YXNrcywgMCk7Cj4gPiBAQCAtNDYzLDYgKzc0MCwxMSBAQCBzdGF0 aWMgaW50IHFlZG5fcHJlcF9hbmRfb2ZmbG9hZF9xdWV1ZShzdHJ1Y3QgcWVkbl9jb25uX2N0eCAq Y29ubl9jdHgpCj4gPgo+ID4gICAgICAgbWVtc2V0KGNvbm5fY3R4LT5ob3N0X2NjY2lkX2l0aWQs IDB4RkYsIGRtYV9zaXplKTsKPiA+ICAgICAgIHNldF9iaXQoUUVETl9DT05OX1JFU1JDX0NDQ0lE X0lUSURfTUFQLCAmY29ubl9jdHgtPnJlc3JjX3N0YXRlKTsKPiA+ICsKPiA+ICsgICAgIHJjID0g cWVkbl9hbGxvY19pY3JlcV9wYWQoY29ubl9jdHgpOwo+ID4gKyAgICAgICAgICAgICBpZiAocmMp Cj4gPiArICAgICAgICAgICAgICAgICAgICAgZ290byByZWxfY29ubjsKPiA+ICsKPiA+ICAgICAg IHJjID0gcWVkbl9zZXRfY29uX3N0YXRlKGNvbm5fY3R4LCBDT05OX1NUQVRFX1dBSVRfRk9SX0NP Tk5FQ1RfRE9ORSk7Cj4gPiAgICAgICBpZiAocmMpCj4gPiAgICAgICAgICAgICAgIGdvdG8gcmVs X2Nvbm47Cj4gPiBAQCAtNTIzLDYgKzgwNSw5IEBAIHZvaWQgcWVkbl9zcF93cV9oYW5kbGVyKHN0 cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKPiA+Cj4gPiAgICAgICBxZWRuID0gY29ubl9jdHgtPnFl ZG47Cj4gPiAgICAgICBpZiAodGVzdF9iaXQoREVTVFJPWV9DT05ORUNUSU9OLCAmY29ubl9jdHgt PmFnZ193b3JrX2FjdGlvbikpIHsKPiA+ICsgICAgICAgICAgICAgaWYgKHRlc3RfYml0KEhBTkRM RV9JQ1JFU1AsICZjb25uX2N0eC0+YWdnX3dvcmtfYWN0aW9uKSkKPiA+ICsgICAgICAgICAgICAg ICAgICAgICBxZWRuX2Nscl9zcF93YShjb25uX2N0eCwgSEFORExFX0lDUkVTUCk7Cj4gPiArCj4g PiAgICAgICAgICAgICAgIHFlZG5fZGVzdHJveV9jb25uZWN0aW9uKGNvbm5fY3R4KTsKPiA+Cj4g PiAgICAgICAgICAgICAgIHJldHVybjsKPiA+IEBAIC01MzcsNiArODIyLDM2IEBAIHZvaWQgcWVk bl9zcF93cV9oYW5kbGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKPiA+ICAgICAgICAgICAg ICAgICAgICAgICByZXR1cm47Cj4gPiAgICAgICAgICAgICAgIH0KPiA+ICAgICAgIH0KPiA+ICsK PiA+ICsgICAgIGlmICh0ZXN0X2JpdChTRU5EX0lDUkVRLCAmY29ubl9jdHgtPmFnZ193b3JrX2Fj dGlvbikpIHsKPiA+ICsgICAgICAgICAgICAgcWVkbl9jbHJfc3Bfd2EoY29ubl9jdHgsIFNFTkRf SUNSRVEpOwo+ID4gKyAgICAgICAgICAgICByYyA9IHFlZG5fc2VuZF9pY3JlcShjb25uX2N0eCk7 Cj4gPiArICAgICAgICAgICAgIGlmIChyYykKPiA+ICsgICAgICAgICAgICAgICAgICAgICByZXR1 cm47Cj4gPiArCj4gPiArICAgICAgICAgICAgIHJldHVybjsKPiA+ICsgICAgIH0KPiA+ICsKPiA+ ICsgICAgIGlmICh0ZXN0X2JpdChIQU5ETEVfSUNSRVNQLCAmY29ubl9jdHgtPmFnZ193b3JrX2Fj dGlvbikpIHsKPiA+ICsgICAgICAgICAgICAgcmMgPSBxZWRuX2hhbmRsZV9pY3Jlc3AoY29ubl9j dHgpOwo+ID4gKwo+ID4gKyAgICAgICAgICAgICBxZWRuX2Nscl9zcF93YShjb25uX2N0eCwgSEFO RExFX0lDUkVTUCk7Cj4gPiArICAgICAgICAgICAgIGlmIChyYykgewo+ID4gKyAgICAgICAgICAg ICAgICAgICAgIHByX2VycigiSUMgaGFuZGxpbmcgcmV0dXJuZWQgd2l0aCAweCV4XG4iLCByYyk7 Cj4gPiArICAgICAgICAgICAgICAgICAgICAgaWYgKHRlc3RfYW5kX3NldF9iaXQoREVTVFJPWV9D T05ORUNUSU9OLCAmY29ubl9jdHgtPmFnZ193b3JrX2FjdGlvbikpCj4gPiArICAgICAgICAgICAg ICAgICAgICAgICAgICAgICByZXR1cm47Cj4gPiArCj4gPiArICAgICAgICAgICAgICAgICAgICAg cWVkbl9kZXN0cm95X2Nvbm5lY3Rpb24oY29ubl9jdHgpOwo+ID4gKwo+ID4gKyAgICAgICAgICAg ICAgICAgICAgIHJldHVybjsKPiA+ICsgICAgICAgICAgICAgfQo+ID4gKwo+ID4gKyAgICAgICAg ICAgICBhdG9taWNfaW5jKCZjb25uX2N0eC0+ZXN0X2Nvbm5faW5kaWNhdG9yKTsKPiA+ICsgICAg ICAgICAgICAgcWVkbl9zZXRfY29uX3N0YXRlKGNvbm5fY3R4LCBDT05OX1NUQVRFX05WTUVUQ1Bf Q09OTl9FU1RBQkxJU0hFRCk7Cj4gPiArICAgICAgICAgICAgIHdha2VfdXBfaW50ZXJydXB0aWJs ZSgmY29ubl9jdHgtPmNvbm5fd2FpdHEpOwo+ID4gKwo+ID4gKyAgICAgICAgICAgICByZXR1cm47 Cj4gPiArICAgICB9Cj4gPiAgIH0KPiA+Cj4gPiAgIC8qIENsZWFyIGNvbm5lY3Rpb24gYWdncmVn YXRpdmUgc2xvd3BhdGggd29yayBhY3Rpb24gKi8KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL252 bWUvaHcvcWVkbi9xZWRuX21haW4uYyBiL2RyaXZlcnMvbnZtZS9ody9xZWRuL3FlZG5fbWFpbi5j Cj4gPiBpbmRleCA4ZDljMTlkNjM0ODAuLmE2NzU2ZDcyNTBiNyAxMDA2NDQKPiA+IC0tLSBhL2Ry aXZlcnMvbnZtZS9ody9xZWRuL3FlZG5fbWFpbi5jCj4gPiArKysgYi9kcml2ZXJzL252bWUvaHcv cWVkbi9xZWRuX21haW4uYwo+ID4gQEAgLTI4NSw2ICsyODUsMTkgQEAgc3RhdGljIHZvaWQgcWVk bl9zZXRfY3RybF9pb19jcHVzKHN0cnVjdCBxZWRuX2Nvbm5fY3R4ICpjb25uX2N0eCwgaW50IHFp ZCkKPiA+ICAgICAgIGNvbm5fY3R4LT5jcHUgPSBmcF9xLT5jcHU7Cj4gPiAgIH0KPiA+Cj4gPiAr c3RhdGljIHZvaWQgcWVkbl9zZXRfcGR1X3BhcmFtcyhzdHJ1Y3QgcWVkbl9jb25uX2N0eCAqY29u bl9jdHgpCj4gPiArewo+ID4gKyAgICAgLyogRW5hYmxlIGRpZ2VzdCBvbmNlIHN1cHBvcnRlZCAq Lwo+ID4gKyAgICAgY29ubl9jdHgtPnJlcXVpcmVkX3BhcmFtcy5oZHJfZGlnZXN0ID0gMDsKPiA+ ICsgICAgIGNvbm5fY3R4LT5yZXF1aXJlZF9wYXJhbXMuZGF0YV9kaWdlc3QgPSAwOwo+ID4gKwo+ ID4gKyAgICAgY29ubl9jdHgtPnJlcXVpcmVkX3BhcmFtcy5tYXhyMnQgPSBRRUROX01BWF9PVVRT VEFORElOR19SMlRfUERVUzsKPiA+ICsgICAgIGNvbm5fY3R4LT5yZXF1aXJlZF9wYXJhbXMucGZ2 ID0gTlZNRV9UQ1BfUEZWXzFfMDsKPiA+ICsgICAgIGNvbm5fY3R4LT5yZXF1aXJlZF9wYXJhbXMu Y3BkYSA9IDA7Cj4gPiArICAgICBjb25uX2N0eC0+cmVxdWlyZWRfcGFyYW1zLmhwZGEgPSAwOwo+ ID4gKyAgICAgY29ubl9jdHgtPnJlcXVpcmVkX3BhcmFtcy5tYXhoMmNkYXRhID0gUUVETl9NQVhf UERVX1NJWkU7Cj4gPiArfQo+ID4gKwo+ID4gICBzdGF0aWMgaW50IHFlZG5fY3JlYXRlX3F1ZXVl KHN0cnVjdCBudm1lX3RjcF9vZmxkX3F1ZXVlICpxdWV1ZSwgaW50IHFpZCwgc2l6ZV90IHFfc2l6 ZSkKPiA+ICAgewo+ID4gICAgICAgc3RydWN0IG52bWVfdGNwX29mbGRfY3RybCAqY3RybCA9IHF1 ZXVlLT5jdHJsOwo+ID4gQEAgLTMwNyw2ICszMjAsNyBAQCBzdGF0aWMgaW50IHFlZG5fY3JlYXRl X3F1ZXVlKHN0cnVjdCBudm1lX3RjcF9vZmxkX3F1ZXVlICpxdWV1ZSwgaW50IHFpZCwgc2l6ZV90 Cj4gPiAgICAgICBjb25uX2N0eC0+Y3RybCA9IGN0cmw7Cj4gPiAgICAgICBjb25uX2N0eC0+c3Ff ZGVwdGggPSBxX3NpemU7Cj4gPiAgICAgICBxZWRuX3NldF9jdHJsX2lvX2NwdXMoY29ubl9jdHgs IHFpZCk7Cj4gPiArICAgICBxZWRuX3NldF9wZHVfcGFyYW1zKGNvbm5fY3R4KTsKPiA+Cj4gPiAg ICAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZjb25uX2N0eC0+Y29ubl93YWl0cSk7Cj4gPiAgICAg ICBhdG9taWNfc2V0KCZjb25uX2N0eC0+ZXN0X2Nvbm5faW5kaWNhdG9yLCAwKTsKPiA+IEBAIC0x MDczLDYgKzEwODcsMTQgQEAgc3RhdGljIGludCBxZWRuX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpw ZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCj4gPiAgICAgICByZXR1cm4gX19x ZWRuX3Byb2JlKHBkZXYpOwo+ID4gICB9Cj4gPgo+ID4gK3ZvaWQgcWVkbl9zd2FwX2J5dGVzKHUz MiAqcCwgaW50IHNpemUpCj4gPiArewo+ID4gKyAgICAgaW50IGk7Cj4gPiArCj4gPiArICAgICBm b3IgKGkgPSAwOyBpIDwgc2l6ZTsgKytpLCArK3ApCj4gPiArICAgICAgICAgICAgICpwID0gX19z d2FiMzIoKnApOwo+ID4gK30KPiA+ICsKPiA+ICAgc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHFl ZG5fcGNpX2RyaXZlciA9IHsKPiA+ICAgICAgIC5uYW1lICAgICA9IFFFRE5fTU9EVUxFX05BTUUs Cj4gPiAgICAgICAuaWRfdGFibGUgPSBxZWRuX3BjaV90YmwsCj4gPiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9udm1lL2h3L3FlZG4vcWVkbl90YXNrLmMgYi9kcml2ZXJzL252bWUvaHcvcWVkbi9xZWRu X3Rhc2suYwo+ID4gaW5kZXggNTRmMmY0Y2JhNmVhLi45Y2I4NDg4M2U5NWUgMTAwNjQ0Cj4gPiAt LS0gYS9kcml2ZXJzL252bWUvaHcvcWVkbi9xZWRuX3Rhc2suYwo+ID4gKysrIGIvZHJpdmVycy9u dm1lL2h3L3FlZG4vcWVkbl90YXNrLmMKPiA+IEBAIC01MzYsOSArNTM2LDExIEBAIHZvaWQgcWVk bl9pb193b3JrX2NxKHN0cnVjdCBxZWRuX2N0eCAqcWVkbiwgc3RydWN0IG52bWV0Y3BfZndfY3Fl ICpjcWUpCj4gPiAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cj4gPgo+ID4gICAgICAgICAg ICAgICBjYXNlIE5WTUVUQ1BfVEFTS19UWVBFX0lOSVRfQ09OTl9SRVFVRVNUOgo+ID4gLQo+ID4g LSAgICAgICAgICAgICAgICAgICAgIC8qIFBsYWNlaG9sZGVyIC0gSUNSZXEgZmxvdyAqLwo+ID4g LQo+ID4gKyAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIElDUmVxLXBhZGRpbmcgU0dFIGZy b20gU0dMICovCj4gPiArICAgICAgICAgICAgICAgICAgICAgcWVkbl9jb21tb25fY2xlYXJfZndf c2dsKCZxZWRuX3Rhc2stPnNnbF90YXNrX3BhcmFtcyk7Cj4gPiArICAgICAgICAgICAgICAgICAg ICAgLyogVGFzayBpcyBub3QgcmVxdWlyZWQgZm9yIGljcmVzcCBwcm9jZXNzaW5nICovCj4gPiAr ICAgICAgICAgICAgICAgICAgICAgcWVkbl9yZXR1cm5fdGFza190b19wb29sKGNvbm5fY3R4LCBx ZWRuX3Rhc2spOwo+ID4gKyAgICAgICAgICAgICAgICAgICAgIHFlZG5fcHJlcF9pY3Jlc3AoY29u bl9jdHgsIGNxZSk7Cj4gPiAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cj4gPiAgICAgICAg ICAgICAgIGRlZmF1bHQ6Cj4gPiAgICAgICAgICAgICAgICAgICAgICAgcHJfaW5mbygiQ291bGQg bm90IGlkZW50aWZ5IHRhc2sgdHlwZVxuIik7Cj4gPgo+IENoZWVycywKPgo+IEhhbm5lcwo+IC0t Cj4gRHIuIEhhbm5lcyBSZWluZWNrZSAgICAgICAgICAgICAgICBLZXJuZWwgU3RvcmFnZSBBcmNo aXRlY3QKPiBoYXJlQHN1c2UuZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArNDkgOTEx IDc0MDUzIDY4OAo+IFNVU0UgU29mdHdhcmUgU29sdXRpb25zIEdtYkgsIE1heGZlbGRzdHIuIDUs IDkwNDA5IE7DvHJuYmVyZwo+IEhSQiAzNjgwOSAoQUcgTsO8cm5iZXJnKSwgR2VzY2jDpGZ0c2bD vGhyZXI6IEZlbGl4IEltZW5kw7ZyZmZlcgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18KTGludXgtbnZtZSBtYWlsaW5nIGxpc3QKTGludXgtbnZtZUBsaXN0 cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGlu Zm8vbGludXgtbnZtZQo=