From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Andrew Cooper <andrew.cooper3@citrix.com>
Cc: Wei Liu <wei.liu2@citrix.com>,
Ian Jackson <Ian.Jackson@eu.citrix.com>,
Xen-devel <xen-devel@lists.xen.org>
Subject: Re: [PATCH for-4.7 2/3] docs/xsplice: Fix syntax when compiling to pdf with pandoc
Date: Thu, 19 May 2016 10:36:59 -0400 [thread overview]
Message-ID: <20160519143659.GF21691@localhost.localdomain> (raw)
In-Reply-To: <1463668186-1567-2-git-send-email-andrew.cooper3@citrix.com>
On Thu, May 19, 2016 at 03:29:45PM +0100, Andrew Cooper wrote:
> Pandoc (version 1.12.4.2 from Debian Jessie) complains at the embedded \n in
> the signature checking paragraph.
>
> /usr/bin/pandoc --number-sections --toc --standalone misc/xsplice.markdown
> --output pdf/misc/xsplice.pdf
> ! Undefined control sequence.
> l.1085 appended\textasciitilde{}\n
>
> Surround the string in backticks to make it verbatim text.
Ok, where is that change?
>
> While altering this file, strip the substantial quantity of trailing
> whitespace.
Please do not. That was added specifically there otherwise
markdown messes it up when doing HTML and the lines get mangled up.
>
> Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
> ---
> CC: Ian Jackson <Ian.Jackson@eu.citrix.com>
> CC: Wei Liu <wei.liu2@citrix.com>
> CC: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> ---
> docs/misc/xsplice.markdown | 304 ++++++++++++++++++++++-----------------------
> 1 file changed, 152 insertions(+), 152 deletions(-)
>
> diff --git a/docs/misc/xsplice.markdown b/docs/misc/xsplice.markdown
> index 4a98be1..80f8bc7 100644
> --- a/docs/misc/xsplice.markdown
> +++ b/docs/misc/xsplice.markdown
> @@ -90,18 +90,18 @@ As example we will assume the hypervisor does not have XSA-132 (see
> the hypervisor with it. The original code looks as so:
>
> <pre>
> - 48 89 e0 mov %rsp,%rax
> - 48 25 00 80 ff ff and $0xffffffffffff8000,%rax
> + 48 89 e0 mov %rsp,%rax
> + 48 25 00 80 ff ff and $0xffffffffffff8000,%rax
> </pre>
>
> while the new patched hypervisor would be:
>
> <pre>
> - 48 c7 45 b8 00 00 00 00 movq $0x0,-0x48(%rbp)
> - 48 c7 45 c0 00 00 00 00 movq $0x0,-0x40(%rbp)
> - 48 c7 45 c8 00 00 00 00 movq $0x0,-0x38(%rbp)
> - 48 89 e0 mov %rsp,%rax
> - 48 25 00 80 ff ff and $0xffffffffffff8000,%rax
> + 48 c7 45 b8 00 00 00 00 movq $0x0,-0x48(%rbp)
> + 48 c7 45 c0 00 00 00 00 movq $0x0,-0x40(%rbp)
> + 48 c7 45 c8 00 00 00 00 movq $0x0,-0x38(%rbp)
> + 48 89 e0 mov %rsp,%rax
> + 48 25 00 80 ff ff and $0xffffffffffff8000,%rax
> </pre>
>
> This is inside the arch_do_domctl. This new change adds 21 extra
> @@ -113,8 +113,8 @@ As such we could simplify this problem by only patching the site
> which calls arch_do_domctl:
>
> <pre>
> -do_domctl:
> - e8 4b b1 05 00 callq ffff82d08015fbb9 <arch_do_domctl>
> +do_domctl:
> + e8 4b b1 05 00 callq ffff82d08015fbb9 <arch_do_domctl>
> </pre>
>
> with a new address for where the new `arch_do_domctl` would be (this
> @@ -128,8 +128,8 @@ Patching the offset in `hypercall_table` for `do_domctl:
>
> <pre>
>
> - ffff82d08024d490: 79 30
> - ffff82d08024d492: 10 80 d0 82 ff ff
> + ffff82d08024d490: 79 30
> + ffff82d08024d492: 10 80 d0 82 ff ff
>
> </pre>
>
> @@ -172,9 +172,9 @@ from that). Patching the offset in `hypercall_table` for the old
> `do_xen_version` (ffff82d080112f9e <do_xen_version>)
>
> </pre>
> - ffff82d08024b270 <hypercall_table>:
> - ...
> - ffff82d08024b2f8: 9e 2f 11 80 d0 82 ff ff
> + ffff82d08024b270 <hypercall_table>:
> + ...
> + ffff82d08024b2f8: 9e 2f 11 80 d0 82 ff ff
>
> </pre>
>
> @@ -187,17 +187,17 @@ An alternative solution would be to patch insert a trampoline in the
> old `do_xen_version' function to directly jump to the new `do_xen_version`.
>
> <pre>
> - ffff82d080112f9e do_xen_version:
> - ffff82d080112f9e: 48 c7 c0 da ff ff ff mov $0xffffffffffffffda,%rax
> - ffff82d080112fa5: 83 ff 09 cmp $0x9,%edi
> - ffff82d080112fa8: 0f 87 24 05 00 00 ja ffff82d0801134d2 ; do_xen_version+0x534
> + ffff82d080112f9e do_xen_version:
> + ffff82d080112f9e: 48 c7 c0 da ff ff ff mov $0xffffffffffffffda,%rax
> + ffff82d080112fa5: 83 ff 09 cmp $0x9,%edi
> + ffff82d080112fa8: 0f 87 24 05 00 00 ja ffff82d0801134d2 ; do_xen_version+0x534
> </pre>
>
> with:
>
> <pre>
> - ffff82d080112f9e do_xen_version:
> - ffff82d080112f9e: e9 XX YY ZZ QQ jmpq [new do_xen_version]
> + ffff82d080112f9e do_xen_version:
> + ffff82d080112f9e: e9 XX YY ZZ QQ jmpq [new do_xen_version]
> </pre>
>
> which would lessen the amount of patching to just one location.
> @@ -296,15 +296,15 @@ The `.xsplice.funcs` contains an array of xsplice_patch_func structures
> which describe the functions to be patched:
>
> <pre>
> -struct xsplice_patch_func {
> - const char *name;
> - void *new_addr;
> - void *old_addr;
> - uint32_t new_size;
> - uint32_t old_size;
> - uint8_t version;
> - uint8_t opaque[31];
> -};
> +struct xsplice_patch_func {
> + const char *name;
> + void *new_addr;
> + void *old_addr;
> + uint32_t new_size;
> + uint32_t old_size;
> + uint8_t version;
> + uint8_t opaque[31];
> +};
> </pre>
>
> The size of the structure is 64 bytes on 64-bit hypervisors. It will be
> @@ -345,33 +345,33 @@ to `old_addr`.
> A simple example of what a payload file can be:
>
> <pre>
> -/* MUST be in sync with hypervisor. */
> -struct xsplice_patch_func {
> - const char *name;
> - void *new_addr;
> - void *old_addr;
> - uint32_t new_size;
> - uint32_t old_size;
> +/* MUST be in sync with hypervisor. */
> +struct xsplice_patch_func {
> + const char *name;
> + void *new_addr;
> + void *old_addr;
> + uint32_t new_size;
> + uint32_t old_size;
> uint8_t version;
> - uint8_t pad[31];
> -};
> + uint8_t pad[31];
> +};
>
> -/* Our replacement function for xen_extra_version. */
> -const char *xen_hello_world(void)
> -{
> - return "Hello World";
> -}
> +/* Our replacement function for xen_extra_version. */
> +const char *xen_hello_world(void)
> +{
> + return "Hello World";
> +}
>
> -static unsigned char patch_this_fnc[] = "xen_extra_version";
> +static unsigned char patch_this_fnc[] = "xen_extra_version";
>
> -struct xsplice_patch_func xsplice_hello_world = {
> +struct xsplice_patch_func xsplice_hello_world = {
> .version = XSPLICE_PAYLOAD_VERSION,
> - .name = patch_this_fnc,
> - .new_addr = xen_hello_world,
> - .old_addr = (void *)0xffff82d08013963c, /* Extracted from xen-syms. */
> - .new_size = 13, /* To be be computed by scripts. */
> - .old_size = 13, /* -----------""--------------- */
> -} __attribute__((__section__(".xsplice.funcs")));
> + .name = patch_this_fnc,
> + .new_addr = xen_hello_world,
> + .old_addr = (void *)0xffff82d08013963c, /* Extracted from xen-syms. */
> + .new_size = 13, /* To be be computed by scripts. */
> + .old_size = 13, /* -----------""--------------- */
> +} __attribute__((__section__(".xsplice.funcs")));
>
> </pre>
>
> @@ -424,13 +424,13 @@ one uint32_t to determine the sub-operations and one padding field which
> *MUST* always be zero.
>
> <pre>
> -struct xen_sysctl_xsplice_op {
> - uint32_t cmd; /* IN: XEN_SYSCTL_XSPLICE_*. */
> - uint32_t pad; /* IN: Always zero. */
> - union {
> - ... see below ...
> - } u;
> -};
> +struct xen_sysctl_xsplice_op {
> + uint32_t cmd; /* IN: XEN_SYSCTL_XSPLICE_*. */
> + uint32_t pad; /* IN: Always zero. */
> + union {
> + ... see below ...
> + } u;
> +};
>
> </pre>
> while the rest of hypercall specific structures are part of the this structure.
> @@ -447,17 +447,17 @@ which contains:
> The structure is as follow:
>
> <pre>
> -/*
> - * Uniquely identifies the payload. Should be human readable.
> - * Includes the NUL terminator
> - */
> -#define XEN_XSPLICE_NAME_SIZE 128
> -struct xen_xsplice_name {
> - XEN_GUEST_HANDLE_64(char) name; /* IN, pointer to name. */
> - uint16_t size; /* IN, size of name. May be upto
> - XEN_XSPLICE_NAME_SIZE. */
> - uint16_t pad[3]; /* IN: MUST be zero. */
> -};
> +/*
> + * Uniquely identifies the payload. Should be human readable.
> + * Includes the NUL terminator
> + */
> +#define XEN_XSPLICE_NAME_SIZE 128
> +struct xen_xsplice_name {
> + XEN_GUEST_HANDLE_64(char) name; /* IN, pointer to name. */
> + uint16_t size; /* IN, size of name. May be upto
> + XEN_XSPLICE_NAME_SIZE. */
> + uint16_t pad[3]; /* IN: MUST be zero. */
> +};
> </pre>
>
> ### XEN_SYSCTL_XSPLICE_UPLOAD (0)
> @@ -485,11 +485,11 @@ The `payload` is the ELF payload as mentioned in the `Payload format` section.
> The structure is as follow:
>
> <pre>
> -struct xen_sysctl_xsplice_upload {
> - xen_xsplice_name_t name; /* IN, name of the patch. */
> - uint64_t size; /* IN, size of the ELF file. */
> - XEN_GUEST_HANDLE_64(uint8) payload; /* IN: ELF file. */
> -};
> +struct xen_sysctl_xsplice_upload {
> + xen_xsplice_name_t name; /* IN, name of the patch. */
> + uint64_t size; /* IN, size of the ELF file. */
> + XEN_GUEST_HANDLE_64(uint8) payload; /* IN: ELF file. */
> +};
> </pre>
>
> ### XEN_SYSCTL_XSPLICE_GET (1)
> @@ -538,17 +538,17 @@ This operation is synchronous and does not require preemption.
> The structure is as follow:
>
> <pre>
> -struct xen_xsplice_status {
> -#define XSPLICE_STATUS_CHECKED 1
> -#define XSPLICE_STATUS_APPLIED 2
> - uint32_t state; /* OUT: XSPLICE_STATE_*. */
> - int32_t rc; /* OUT: 0 if no error, otherwise -XEN_EXX. */
> -};
> -
> -struct xen_sysctl_xsplice_get {
> - xen_xsplice_name_t name; /* IN, the name of the payload. */
> - xen_xsplice_status_t status; /* IN/OUT: status of the payload. */
> -};
> +struct xen_xsplice_status {
> +#define XSPLICE_STATUS_CHECKED 1
> +#define XSPLICE_STATUS_APPLIED 2
> + uint32_t state; /* OUT: XSPLICE_STATE_*. */
> + int32_t rc; /* OUT: 0 if no error, otherwise -XEN_EXX. */
> +};
> +
> +struct xen_sysctl_xsplice_get {
> + xen_xsplice_name_t name; /* IN, the name of the payload. */
> + xen_xsplice_status_t status; /* IN/OUT: status of the payload. */
> +};
> </pre>
>
> ### XEN_SYSCTL_XSPLICE_LIST (2)
> @@ -612,24 +612,24 @@ The `struct xen_xsplice_status` structure contains an status of payload which in
> The structure is as follow:
>
> <pre>
> -struct xen_sysctl_xsplice_list {
> +struct xen_sysctl_xsplice_list {
> uint32_t version; /* OUT: Hypervisor stamps value.
> - If varies between calls, we are
> - getting stale data. */
> + If varies between calls, we are
> + getting stale data. */
> uint32_t idx; /* IN: Index into hypervisor list. */
> - uint32_t nr; /* IN: How many status, names, and len
> - should be filled out. Can be zero to get
> - amount of payloads and version.
> - OUT: How many payloads left. */
> - uint32_t pad; /* IN: Must be zero. */
> - XEN_GUEST_HANDLE_64(xen_xsplice_status_t) status; /* OUT. Must have enough
> - space allocate for nr of them. */
> - XEN_GUEST_HANDLE_64(char) id; /* OUT: Array of names. Each member
> - MUST XEN_XSPLICE_NAME_SIZE in size.
> - Must have nr of them. */
> - XEN_GUEST_HANDLE_64(uint32) len; /* OUT: Array of lengths of name's.
> - Must have nr of them. */
> -};
> + uint32_t nr; /* IN: How many status, names, and len
> + should be filled out. Can be zero to get
> + amount of payloads and version.
> + OUT: How many payloads left. */
> + uint32_t pad; /* IN: Must be zero. */
> + XEN_GUEST_HANDLE_64(xen_xsplice_status_t) status; /* OUT. Must have enough
> + space allocate for nr of them. */
> + XEN_GUEST_HANDLE_64(char) id; /* OUT: Array of names. Each member
> + MUST XEN_XSPLICE_NAME_SIZE in size.
> + Must have nr of them. */
> + XEN_GUEST_HANDLE_64(uint32) len; /* OUT: Array of lengths of name's.
> + Must have nr of them. */
> +};
> </pre>
>
> ### XEN_SYSCTL_XSPLICE_ACTION (3)
> @@ -665,17 +665,17 @@ The return value will be zero unless the provided fields are incorrect.
> The structure is as follow:
>
> <pre>
> -#define XSPLICE_ACTION_UNLOAD 1
> -#define XSPLICE_ACTION_REVERT 2
> -#define XSPLICE_ACTION_APPLY 3
> -#define XSPLICE_ACTION_REPLACE 4
> -struct xen_sysctl_xsplice_action {
> - xen_xsplice_name_t name; /* IN, name of the patch. */
> - uint32_t cmd; /* IN: XSPLICE_ACTION_* */
> - uint32_t time; /* IN: Zero if no timeout. */
> - /* Or upper bound of time (ms) */
> - /* for operation to take. */
> -};
> +#define XSPLICE_ACTION_UNLOAD 1
> +#define XSPLICE_ACTION_REVERT 2
> +#define XSPLICE_ACTION_APPLY 3
> +#define XSPLICE_ACTION_REPLACE 4
> +struct xen_sysctl_xsplice_action {
> + xen_xsplice_name_t name; /* IN, name of the patch. */
> + uint32_t cmd; /* IN: XSPLICE_ACTION_* */
> + uint32_t time; /* IN: Zero if no timeout. */
> + /* Or upper bound of time (ms) */
> + /* for operation to take. */
> +};
>
> </pre>
>
> @@ -686,11 +686,11 @@ The XSPLICE_ACTION prefix has been dropped to easy reading and
> does not include the XSPLICE_STATES:
>
> <pre>
> - /->\
> - \ /
> - UNLOAD <--- CHECK ---> REPLACE|APPLY --> REVERT --\
> - \ |
> - \-------------------<-------------/
> + /->\
> + \ /
> + UNLOAD <--- CHECK ---> REPLACE|APPLY --> REVERT --\
> + \ |
> + \-------------------<-------------/
>
> </pre>
> ## State transition table of XSPLICE_ACTION commands and XSPLICE_STATUS.
> @@ -1007,46 +1007,46 @@ expecting such that it can properly do signature verification.
>
> The signature is based on the all of the payloads continuously laid out
> in memory. The signature is to be appended at the end of the ELF payload
> -prefixed with the string '~Module signature appended~\n', followed by
> +prefixed with the string `'~Module signature appended~\n'`, followed by
> an signature header then followed by the signature, key identifier, and signers
> name.
>
> Specifically the signature header would be:
>
> <pre>
> -#define PKEY_ALGO_DSA 0
> -#define PKEY_ALGO_RSA 1
> -
> -#define PKEY_ID_PGP 0 /* OpenPGP generated key ID */
> -#define PKEY_ID_X509 1 /* X.509 arbitrary subjectKeyIdentifier */
> -
> -#define HASH_ALGO_MD4 0
> -#define HASH_ALGO_MD5 1
> -#define HASH_ALGO_SHA1 2
> -#define HASH_ALGO_RIPE_MD_160 3
> -#define HASH_ALGO_SHA256 4
> -#define HASH_ALGO_SHA384 5
> -#define HASH_ALGO_SHA512 6
> -#define HASH_ALGO_SHA224 7
> -#define HASH_ALGO_RIPE_MD_128 8
> -#define HASH_ALGO_RIPE_MD_256 9
> -#define HASH_ALGO_RIPE_MD_320 10
> -#define HASH_ALGO_WP_256 11
> -#define HASH_ALGO_WP_384 12
> -#define HASH_ALGO_WP_512 13
> -#define HASH_ALGO_TGR_128 14
> -#define HASH_ALGO_TGR_160 15
> -#define HASH_ALGO_TGR_192 16
> -
> -
> -struct elf_payload_signature {
> - u8 algo; /* Public-key crypto algorithm PKEY_ALGO_*. */
> - u8 hash; /* Digest algorithm: HASH_ALGO_*. */
> - u8 id_type; /* Key identifier type PKEY_ID*. */
> - u8 signer_len; /* Length of signer's name */
> - u8 key_id_len; /* Length of key identifier */
> - u8 __pad[3];
> - __be32 sig_len; /* Length of signature data */
> +#define PKEY_ALGO_DSA 0
> +#define PKEY_ALGO_RSA 1
> +
> +#define PKEY_ID_PGP 0 /* OpenPGP generated key ID */
> +#define PKEY_ID_X509 1 /* X.509 arbitrary subjectKeyIdentifier */
> +
> +#define HASH_ALGO_MD4 0
> +#define HASH_ALGO_MD5 1
> +#define HASH_ALGO_SHA1 2
> +#define HASH_ALGO_RIPE_MD_160 3
> +#define HASH_ALGO_SHA256 4
> +#define HASH_ALGO_SHA384 5
> +#define HASH_ALGO_SHA512 6
> +#define HASH_ALGO_SHA224 7
> +#define HASH_ALGO_RIPE_MD_128 8
> +#define HASH_ALGO_RIPE_MD_256 9
> +#define HASH_ALGO_RIPE_MD_320 10
> +#define HASH_ALGO_WP_256 11
> +#define HASH_ALGO_WP_384 12
> +#define HASH_ALGO_WP_512 13
> +#define HASH_ALGO_TGR_128 14
> +#define HASH_ALGO_TGR_160 15
> +#define HASH_ALGO_TGR_192 16
> +
> +
> +struct elf_payload_signature {
> + u8 algo; /* Public-key crypto algorithm PKEY_ALGO_*. */
> + u8 hash; /* Digest algorithm: HASH_ALGO_*. */
> + u8 id_type; /* Key identifier type PKEY_ID*. */
> + u8 signer_len; /* Length of signer's name */
> + u8 key_id_len; /* Length of key identifier */
> + u8 __pad[3];
> + __be32 sig_len; /* Length of signature data */
> };
>
> </pre>
> @@ -1085,7 +1085,7 @@ this means 5 bytes are required.
> Depending on compiler settings, there are several functions in Xen that
> are smaller (without inter-function padding).
>
> -<pre>
> +<pre>
> readelf -sW xen-syms | grep " FUNC " | \
> awk '{ if ($3 < 5) print $3, $4, $5, $8 }'
>
> --
> 2.1.4
>
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
next prev parent reply other threads:[~2016-05-19 14:36 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-05-19 14:29 [PATCH for-4.7 1/3] docs/build: Avoid using multi-target pattern rules Andrew Cooper
2016-05-19 14:29 ` [PATCH for-4.7 2/3] docs/xsplice: Fix syntax when compiling to pdf with pandoc Andrew Cooper
2016-05-19 14:36 ` Konrad Rzeszutek Wilk [this message]
2016-05-19 14:41 ` Andrew Cooper
2016-05-19 14:56 ` Konrad Rzeszutek Wilk
2016-05-19 15:04 ` Andrew Cooper
2016-05-19 15:07 ` Wei Liu
2016-05-19 20:37 ` Konrad Rzeszutek Wilk
2016-05-20 18:09 ` [PATCH v2 for-4.7] " Andrew Cooper
2016-05-20 18:30 ` Konrad Rzeszutek Wilk
2016-05-19 14:29 ` [PATCH for-4.7 3/3] docs/feature: Tweaks to the feature document template Andrew Cooper
2016-05-23 10:19 ` [PATCH for-4.7 1/3] docs/build: Avoid using multi-target pattern rules Wei Liu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160519143659.GF21691@localhost.localdomain \
--to=konrad.wilk@oracle.com \
--cc=Ian.Jackson@eu.citrix.com \
--cc=andrew.cooper3@citrix.com \
--cc=wei.liu2@citrix.com \
--cc=xen-devel@lists.xen.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).