On 2016-11-29 12:56, Jan Kiszka wrote:
> On 2016-11-25 16:26, Ralf Ramsauer wrote:
>> Add dbg-types PIO and MMIO for x86 inmates.
>>
>> Signed-off-by: Ralf Ramsauer <[email protected]>
>> ---
>>  inmates/lib/x86/printk.c | 52 
>> +++++++++++++++++++++++++++++++++++++++++-------
>>  1 file changed, 45 insertions(+), 7 deletions(-)
>>
>> diff --git a/inmates/lib/x86/printk.c b/inmates/lib/x86/printk.c
>> index 9939e61158..f7c75815f0 100644
>> --- a/inmates/lib/x86/printk.c
>> +++ b/inmates/lib/x86/printk.c
>> @@ -13,6 +13,7 @@
>>  #include <stdarg.h>
>>  #include <inmate.h>
>>  
>> +#define DEBUG_TYPE          "PIO"
>>  #define UART_BASE           0x3f8
>>  #define UART_TX                     0x0
>>  #define UART_DLL            0x0
>> @@ -23,7 +24,31 @@
>>  #define UART_LSR            0x5
>>  #define UART_LSR_THRE               0x20
>>  
>> -static unsigned int printk_uart_base;
>> +static long unsigned int printk_uart_base;
>> +
>> +static void uart_pio_out(unsigned int reg, u8 value)
>> +{
>> +    outb(value, printk_uart_base + reg);
>> +}
>> +
>> +static u8 uart_pio_in(unsigned int reg)
>> +{
>> +    return inb(printk_uart_base + reg);
>> +}
>> +
>> +static void uart_mmio32_out(unsigned int reg, u8 value)
>> +{
>> +    mmio_write32((void *)printk_uart_base + reg * 4, value);
>> +}
>> +
>> +static u8 uart_mmio32_in(unsigned int reg)
>> +{
>> +    return mmio_read32((void *)printk_uart_base + reg * 4);
>> +}
>> +
>> +/* choose 8 bit PIO by default */
>> +static void (*uart_reg_out)(unsigned int, u8) = uart_pio_out;
>> +static u8 (*uart_reg_in)(unsigned int) = uart_pio_in;
>>  
>>  static void uart_write(const char *msg)
>>  {
>> @@ -39,9 +64,9 @@ static void uart_write(const char *msg)
>>                      c = *msg++;
>>              if (!c)
>>                      break;
>> -            while (!(inb(printk_uart_base + UART_LSR) & UART_LSR_THRE))
>> +            while (!(uart_reg_in(UART_LSR) & UART_LSR_THRE))
>>                      cpu_relax();
>> -            outb(c, printk_uart_base + UART_TX);
>> +            uart_reg_out(UART_TX, c);
>>      }
>>  }
>>  
>> @@ -50,18 +75,28 @@ static void uart_write(const char *msg)
>>  
>>  static void dbg_init(void)
>>  {
>> +    const char *type;
>> +    char buf[32];
>>      unsigned int divider;
>>  
>>      printk_uart_base = cmdline_parse_int("dbg-base", UART_BASE);
>>      divider = cmdline_parse_int("dbg-divider", 0);
>> +    type = cmdline_parse_str("dbg-type", buf, sizeof(buf), DEBUG_TYPE);
>> +
>> +    if (strncmp(type, "MMIO", 4) == 0) {
>> +            uart_reg_out = uart_mmio32_out;
>> +            uart_reg_in = uart_mmio32_in;
> 
> You also need map_range(base, size, MAP_UNCACHED) in order to do this
> mmio on x86.
> 

...which we only provide for 64 bit so far.

OK, good news is that I successfully tested hypervisor and apic-demo
with this patch on an Apollo Lake board:

diff --git a/configs/apic-demo.c b/configs/apic-demo.c
index db599c3..ebc157b 100644
--- a/configs/apic-demo.c
+++ b/configs/apic-demo.c
@@ -20,7 +20,7 @@
 struct {
        struct jailhouse_cell_desc cell;
        __u64 cpus[1];
-       struct jailhouse_memory mem_regions[2];
+       struct jailhouse_memory mem_regions[3];
        struct jailhouse_cache cache_regions[1];
        __u8 pio_bitmap[0x2000];
 } __attribute__((packed)) config = {
@@ -55,6 +55,13 @@ struct {
                        .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE |
                                JAILHOUSE_MEM_COMM_REGION,
                },
+               {
+                       .phys_start = 0x91230000,
+                       .virt_start = 0x91230000,
+                       .size = 0x1000,
+                       .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE |
+                               JAILHOUSE_MEM_ROOTSHARED,
+               },
        },
 
        .cache_regions = {
diff --git a/inmates/lib/x86/printk.c b/inmates/lib/x86/printk.c
index f7c7581..ccdc732 100644
--- a/inmates/lib/x86/printk.c
+++ b/inmates/lib/x86/printk.c
@@ -86,6 +86,9 @@ static void dbg_init(void)
        if (strncmp(type, "MMIO", 4) == 0) {
                uart_reg_out = uart_mmio32_out;
                uart_reg_in = uart_mmio32_in;
+#ifdef __x86_64__
+               map_range((void *)printk_uart_base, 0x1000, MAP_UNCACHED);
+#endif
        } else if (strncmp(type, "none", 4) == 0) {
                printk_uart_base = 0;
        }


While playing with it, I realized another thing, though this is now
really cosmetic: tagging the inmate parameters with "dbg-" is not fully
accurate. For our inmates, this channel is actually their primary and
only console. So, either "con-" or even "uart-" would be better. What do
you think?

Jan

-- 
Siemens AG, Corporate Technology, CT RDA ITP SES-DE
Corporate Competence Center Embedded Linux

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