On 01/16/2017 05:48 PM, Jan Kiszka wrote:
> On 2017-01-16 17:40, Jan Kiszka wrote:
>> On 2017-01-16 17:07, Ralf Ramsauer wrote:
>>> The console page is implemented as ring buffer, and will _not_ contain a
>>> trailing \0 for string termination.
>>>
>>> We're changing the semantics of the configuration: increment revision
>>> counter.
>>>
>>> Signed-off-by: Ralf Ramsauer <[email protected]>
>>> ---
>>>  hypervisor/hypervisor.lds.S                |  6 ++++++
>>>  hypervisor/include/jailhouse/cell-config.h | 13 +++++++++----
>>>  hypervisor/include/jailhouse/header.h      |  8 ++++++++
>>>  hypervisor/include/jailhouse/printk.h      |  2 ++
>>>  hypervisor/printk.c                        |  2 ++
>>>  tools/jailhouse-cell-linux                 |  2 +-
>>>  tools/jailhouse-hardware-check             |  2 +-
>>>  7 files changed, 29 insertions(+), 6 deletions(-)
>>>
>>> diff --git a/hypervisor/hypervisor.lds.S b/hypervisor/hypervisor.lds.S
>>> index 09b1a0b2..f8178282 100644
>>> --- a/hypervisor/hypervisor.lds.S
>>> +++ b/hypervisor/hypervisor.lds.S
>>> @@ -35,6 +35,12 @@ SECTIONS
>>>     . = ALIGN(16);
>>>     .bss            : { *(.bss) }
>>>  
>>> +   /* The console section shall only contain the hypervisor console. This
>>> +    * section and the next section must be aligned to PAGE_SIZE, as we
>>> +    * want the console section to reserve a whole page */
>>> +   . = ALIGN(PAGE_SIZE);
>>> +   .console        : { *(.console) }
>>> +
>>>     . = ALIGN(PAGE_SIZE);
>>>     __page_pool = .;
>>>  
>>> diff --git a/hypervisor/include/jailhouse/cell-config.h 
>>> b/hypervisor/include/jailhouse/cell-config.h
>>> index 80fa5a78..ad894cb6 100644
>>> --- a/hypervisor/include/jailhouse/cell-config.h
>>> +++ b/hypervisor/include/jailhouse/cell-config.h
>>> @@ -40,7 +40,7 @@
>>>  #define _JAILHOUSE_CELL_CONFIG_H
>>>  
>>>  /* Incremented on any layout or semantic change of system or cell config. 
>>> */
>>> -#define JAILHOUSE_CONFIG_REVISION  3
>>> +#define JAILHOUSE_CONFIG_REVISION  4
>>>  
>>>  #define JAILHOUSE_CELL_NAME_MAXLEN 31
>>>  
>>> @@ -186,9 +186,14 @@ struct jailhouse_iommu {
>>>  
>>>  #define CON1_TYPE(flags) ((flags) & JAILHOUSE_CON1_TYPE_MASK)
>>>  
>>> -/* We use bit 4..5 to differentiate between PIO and MMIO access */
>>> -#define JAILHOUSE_CON1_FLAG_PIO            0x0010
>>> -#define JAILHOUSE_CON1_FLAG_MMIO   0x0020
>>> +#define JAILHOUSE_CON2_TYPE_ROOTPAGE       0x0010
>>> +#define JAILHOUSE_CON2_TYPE_MASK   0x00f0
>>> +
>>> +#define CON2_TYPE(flags) ((flags) & JAILHOUSE_CON2_TYPE_MASK)
>>> +
>>> +/* We use bit 8..9 to differentiate between PIO and MMIO access */
>>> +#define JAILHOUSE_CON1_FLAG_PIO            0x0100
>>> +#define JAILHOUSE_CON1_FLAG_MMIO   0x0200
>>
>> If you do not shift these flags around, there is also no need for the
>> revision bump. Actually, it would make at least equal sense to keep all
>> CON1 related bits together, maybe moving the CON2 related bits up to 16..31.
>>
>>>  
>>>  #define CON1_IS_MMIO(flags) ((flags) & JAILHOUSE_CON1_FLAG_MMIO)
>>>  
>>> diff --git a/hypervisor/include/jailhouse/header.h 
>>> b/hypervisor/include/jailhouse/header.h
>>> index 4fe159c6..072a37b2 100644
>>> --- a/hypervisor/include/jailhouse/header.h
>>> +++ b/hypervisor/include/jailhouse/header.h
>>> @@ -24,6 +24,14 @@
>>>   */
>>>  typedef int (*jailhouse_entry)(unsigned int);
>>>  
>>> +#define CONSOLE_SIZE 0x1000
>>
>> This is no longer the actual size, is it?
>>
>>> +
>>> +struct jailhouse_console {
>>> +   volatile unsigned int lock;
>>> +   unsigned int tail;
> 
> Oh, and tail is volatile as well, isn't it?
This is the code where I copy the console page:

+static void copy_console_page(struct jailhouse_console *dst)
+{
+retry:
+       /* spin while hypervisor is writing to console */
+       while (console_page->lock);
+       /* copy console page */
+       memcpy(dst, console_page, sizeof(struct jailhouse_console));
+       /* check consistency of console_page */
+       if (dst->tail != console_page->tail)
+               goto retry;
+}

I'm spinning on lock, copy the whole page and comparing tails. So is it
really necessary that the tail gets volatile? But sure, it won't hurt,
if it is volatile.

> 
> Jan
> 
>>> +   char content[2048];
>>> +} __attribute__((aligned(CONSOLE_SIZE)));
>>
>> But do we still need explicit alignment at all, with the hypervisor
>> placing the struct in an aligned section?
>>
>>> +
>>>  /**
>>>   * Hypervisor description.
>>>   * Located at the beginning of the hypervisor binary image and loaded by
>>> diff --git a/hypervisor/include/jailhouse/printk.h 
>>> b/hypervisor/include/jailhouse/printk.h
>>> index a506c0fd..68596e84 100644
>>> --- a/hypervisor/include/jailhouse/printk.h
>>> +++ b/hypervisor/include/jailhouse/printk.h
>>> @@ -27,3 +27,5 @@ void __attribute__((format(printf, 1, 2))) 
>>> panic_printk(const char *fmt, ...);
>>>  
>>>  void arch_dbg_write_init(void);
>>>  extern void (*arch_dbg_write)(const char *msg);
>>> +
>>> +extern struct jailhouse_console console;
>>> diff --git a/hypervisor/printk.c b/hypervisor/printk.c
>>> index e8f5ffe2..994a0432 100644
>>> --- a/hypervisor/printk.c
>>> +++ b/hypervisor/printk.c
>>> @@ -18,6 +18,8 @@
>>>  #include <asm/bitops.h>
>>>  #include <asm/spinlock.h>
>>>  
>>> +struct jailhouse_console console __attribute__((section(".console")));
>>> +
>>>  static DEFINE_SPINLOCK(printk_lock);
>>>  
>>>  #define console_write(msg) arch_dbg_write(msg)
>>> diff --git a/tools/jailhouse-cell-linux b/tools/jailhouse-cell-linux
>>> index 1643a731..dea6c3ef 100755
>>> --- a/tools/jailhouse-cell-linux
>>> +++ b/tools/jailhouse-cell-linux
>>> @@ -512,7 +512,7 @@ class MemoryRegion:
>>>  
>>>  class Config:
>>>      _HEADER_FORMAT = '6sH32s4xIIIIIIIII'
>>> -    _HEADER_REVISION = 3
>>> +    _HEADER_REVISION = 4
>>>  
>>>      def __init__(self, config_file):
>>>          self.data = config_file.read()
>>> diff --git a/tools/jailhouse-hardware-check b/tools/jailhouse-hardware-check
>>> index 67314af2..fb820120 100755
>>> --- a/tools/jailhouse-hardware-check
>>> +++ b/tools/jailhouse-hardware-check
>>> @@ -113,7 +113,7 @@ class Sysconfig:
>>>      X86_MAX_IOMMU_UNITS = 8
>>>      X86_IOMMU_SIZE = 20
>>>  
>>> -    HEADER_REVISION = 3
>>> +    HEADER_REVISION = 4
>>>      HEADER_FORMAT = '6sH'
>>>  
>>>      def __init__(self, path):
>>>
>>
>> Jan
>>
> 

-- 
You received this message because you are subscribed to the Google Groups 
"Jailhouse" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to