xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
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

  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).