[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH for-4.7 2/3] docs/xsplice: Fix syntax when compiling to pdf with pandoc



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@xxxxxxxxxx>
> ---
> CC: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
> CC: Wei Liu <wei.liu2@xxxxxxxxxx>
> CC: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
> ---
>  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@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.