From patchwork Mon Sep 16 10:59:42 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Wieczorkiewicz, Pawel" X-Patchwork-Id: 11146797 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id DD0C414DB for ; Mon, 16 Sep 2019 11:05:20 +0000 (UTC) Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (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 B9078206C2 for ; Mon, 16 Sep 2019 11:05:20 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=amazon.de header.i=@amazon.de header.b="LBxMKCir" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B9078206C2 Authentication-Results: mail.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=amazon.de Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1i9oo5-0006B9-Ap; Mon, 16 Sep 2019 11:04:33 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1i9oo3-000674-0Y for xen-devel@lists.xen.org; Mon, 16 Sep 2019 11:04:31 +0000 X-Inumbo-ID: c16ca3bc-d871-11e9-b299-bc764e2007e4 Received: from smtp-fw-9102.amazon.com (unknown [207.171.184.29]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id c16ca3bc-d871-11e9-b299-bc764e2007e4; Mon, 16 Sep 2019 11:04:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amazon.de; i=@amazon.de; q=dns/txt; s=amazon201209; t=1568631870; x=1600167870; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version; bh=geUr5mAGZ/UsPFD/COUuS7ZfJw9HeGeE2i2aOXz2XsU=; b=LBxMKCirwKcrrmI7yCgLDNzAYv9fBSJ8J3eNSqBS5U82TTC3pb25N8MW 1ewXGxD1oPYFAi+iLpONiD14Kl8Y/469Qd+YnasyHSDwfbmMXADcriM/N H7Hp6ZLTqdVs5R0mK1oUE4C4LzKvhkv+qNBD5oQUSuL/KHQbQMXzV0Zjm A=; X-IronPort-AV: E=Sophos;i="5.64,512,1559520000"; d="scan'208";a="702597611" Received: from sea3-co-svc-lb6-vlan3.sea.amazon.com (HELO email-inbound-relay-1e-17c49630.us-east-1.amazon.com) ([10.47.22.38]) by smtp-border-fw-out-9102.sea19.amazon.com with ESMTP; 16 Sep 2019 11:04:10 +0000 Received: from EX13MTAUEA001.ant.amazon.com (iad55-ws-svc-p15-lb9-vlan3.iad.amazon.com [10.40.159.166]) by email-inbound-relay-1e-17c49630.us-east-1.amazon.com (Postfix) with ESMTPS id CE58BA1D9A; Mon, 16 Sep 2019 11:04:05 +0000 (UTC) Received: from EX13D05EUC002.ant.amazon.com (10.43.164.231) by EX13MTAUEA001.ant.amazon.com (10.43.61.243) with Microsoft SMTP Server (TLS) id 15.0.1367.3; Mon, 16 Sep 2019 11:03:50 +0000 Received: from EX13MTAUEB001.ant.amazon.com (10.43.60.96) by EX13D05EUC002.ant.amazon.com (10.43.164.231) with Microsoft SMTP Server (TLS) id 15.0.1367.3; Mon, 16 Sep 2019 11:03:49 +0000 Received: from dev-dsk-wipawel-1a-0c4e6d58.eu-west-1.amazon.com (10.4.134.33) by mail-relay.amazon.com (10.43.60.129) with Microsoft SMTP Server id 15.0.1367.3 via Frontend Transport; Mon, 16 Sep 2019 11:03:48 +0000 From: Pawel Wieczorkiewicz To: , Date: Mon, 16 Sep 2019 10:59:42 +0000 Message-ID: <20190916105945.93632-10-wipawel@amazon.de> X-Mailer: git-send-email 2.16.5 In-Reply-To: <20190916105945.93632-1-wipawel@amazon.de> References: <20190916105945.93632-1-wipawel@amazon.de> MIME-Version: 1.0 Precedence: Bulk Subject: [Xen-devel] [PATCH v3 09/12] livepatch: Add support for modules .modinfo section metadata X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Pawel Wieczorkiewicz , wipawel@amazon.com, Ross Lagerwall , mpohlack@amazon.com, Konrad Rzeszutek Wilk Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" Having detailed hotpatch metadata helps to properly identify module's origin and version. It also allows to keep track of the history of hotpatch loads in the system (at least within dmesg buffer size limits). The hotpatch metadata are embedded in a form of .modinfo section. Each such section contains data of the following format: key=value\0key=value\0...key=value\0 The .modinfo section may be generated and appended to the resulting hotpatch ELF file optionally as an extra step of a higher level hotpatch build system. The metadata section pointer and the section length is stored in the hotpatch payload structure and is used to display the content upon hotpatch apply operation. Signed-off-by: Pawel Wieczorkiewicz Reviewed-by: Andra-Irina Paraschiv Reviewed-by: Bjoern Doebel Reviewed-by: Leonard Foerster Reviewed-by: Martin Pohlack Reviewed-by: Norbert Manthey Signed-off-by: Konrad Rzeszutek Wilk Reviewed-by: Ross Lagerwall --- Changed since v2: * Added .modinfo tests (Konrad) xen/common/livepatch.c | 34 ++++++++++++++++++++++++++++++++++ xen/include/xen/livepatch_payload.h | 6 ++++++ xen/test/livepatch/Makefile | 10 +++++++++- 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/xen/common/livepatch.c b/xen/common/livepatch.c index 302acd3015..18935f608c 100644 --- a/xen/common/livepatch.c +++ b/xen/common/livepatch.c @@ -853,6 +853,23 @@ static int prepare_payload(struct payload *payload, #endif } + sec = livepatch_elf_sec_by_name(elf, ".modinfo"); + if ( sec ) + { + if ( !section_ok(elf, sec, sizeof(*payload->metadata.data)) ) + return -EINVAL; + + payload->metadata.data = sec->load_addr; + payload->metadata.len = sec->sec->sh_size; + + /* The metadata is required to consists of null terminated strings. */ + if ( payload->metadata.data[payload->metadata.len - 1] != '\0' ) + { + printk(XENLOG_ERR LIVEPATCH "%s: Incorrect metadata format detected\n", payload->name); + return -EINVAL; + } + } + return 0; } @@ -1201,6 +1218,19 @@ static int livepatch_list(struct xen_sysctl_livepatch_list *list) * for XEN_SYSCTL_LIVEPATCH_ACTION operation (see livepatch_action). */ +static inline void livepatch_display_metadata(const struct livepatch_metadata *metadata) +{ + const char *str; + + if ( metadata && metadata->data && metadata->len > 0 ) + { + printk(XENLOG_INFO LIVEPATCH "module metadata:\n"); + for ( str = metadata->data; str < (metadata->data + metadata->len); str += (strlen(str) + 1) ) + printk(XENLOG_INFO LIVEPATCH " %s\n", str); + } + +} + static int apply_payload(struct payload *data) { unsigned int i; @@ -1233,6 +1263,8 @@ static int apply_payload(struct payload *data) arch_livepatch_revive(); + livepatch_display_metadata(&data->metadata); + return 0; } @@ -2009,6 +2041,8 @@ static void livepatch_printall(unsigned char key) data->name, state2str(data->state), data->state, data->text_addr, data->rw_addr, data->ro_addr, data->pages); + livepatch_display_metadata(&data->metadata); + for ( i = 0; i < data->nfuncs; i++ ) { struct livepatch_func *f = &(data->funcs[i]); diff --git a/xen/include/xen/livepatch_payload.h b/xen/include/xen/livepatch_payload.h index ff16af0dd6..9f5f064205 100644 --- a/xen/include/xen/livepatch_payload.h +++ b/xen/include/xen/livepatch_payload.h @@ -33,6 +33,11 @@ struct livepatch_hooks { } apply, revert; }; +struct livepatch_metadata { + const char *data; /* Ptr to .modinfo section with ASCII data. */ + uint32_t len; /* Length of the metadata section. */ +}; + struct payload { uint32_t state; /* One of the LIVEPATCH_STATE_*. */ int32_t rc; /* 0 or -XEN_EXX. */ @@ -63,6 +68,7 @@ struct payload { unsigned int n_load_funcs; /* Nr of the funcs to load and execute. */ unsigned int n_unload_funcs; /* Nr of funcs to call durung unload. */ char name[XEN_LIVEPATCH_NAME_SIZE]; /* Name of it. */ + struct livepatch_metadata metadata; /* Module meta data record */ }; /* diff --git a/xen/test/livepatch/Makefile b/xen/test/livepatch/Makefile index a7857d3a2e..3f088e74b2 100644 --- a/xen/test/livepatch/Makefile +++ b/xen/test/livepatch/Makefile @@ -79,9 +79,17 @@ config.h: xen_hello_world_func.o xen_hello_world.o: config.h .PHONY: $(LIVEPATCH) -$(LIVEPATCH): xen_hello_world_func.o xen_hello_world.o note.o xen_note.o +$(LIVEPATCH): xen_hello_world_func.o xen_hello_world.o note.o xen_note.o modinfo.o $(LD) $(LDFLAGS) $(build_id_linker) -r -o $(LIVEPATCH) $^ +.PHONY: modinfo.o +modinfo.o: + (set -e; \ + printf "LIVEPATCH_RULEZ\0") > $@.bin + $(OBJCOPY) $(OBJCOPY_MAGIC) \ + --rename-section=.data=.modinfo,alloc,load,readonly,data,contents -S $@.bin $@ + #rm -f $@.bin + # # This target is only accessible if CONFIG_LIVEPATCH is defined, which # depends on $(build_id_linker) being available. Hence we do not