Changeset 7c5a8dd in mainline


Ignore:
Timestamp:
2006-08-01T23:34:02Z (18 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
adf7f9c
Parents:
5b23a82
Message:

xen32: proper virtual traps, domU asynchronous console

Location:
kernel/arch/xen32
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/xen32/include/asm.h

    r5b23a82 r7c5a8dd  
    4242#include <config.h>
    4343
    44 extern uint32_t interrupt_handler_size;
    45 
    46 extern void interrupt_handlers(void);
    47 
    4844extern void enable_l_apic_in_msr(void);
    4945
  • kernel/arch/xen32/include/boot/boot.h

    r5b23a82 r7c5a8dd  
    4949
    5050#define mp_map ((pfn_t *) XEN_VIRT_START)
     51
     52#define SIF_PRIVILEGED  (1 << 0)  /**< Privileged domain */
     53#define SIF_INITDOMAIN  (1 << 1)  /**< Iinitial control domain */
    5154
    5255#include <arch/types.h>
     
    102105        pfn_t store_mfn;            /**< Shared page (machine page) */
    103106        evtchn_t store_evtchn;      /**< Event channel for store communication */
    104         void *console_mfn;          /**< Console page (machine address) */
     107        pfn_t console_mfn;          /**< Console page (machine page) */
    105108        evtchn_t console_evtchn;    /**< Event channel for console messages */
    106109        pte_t *ptl0;                /**< Boot PTL0 (kernel address) */
  • kernel/arch/xen32/include/hypercall.h

    r5b23a82 r7c5a8dd  
    4141        uint8_t flags;      /**< 0-3: privilege level; 4: clear event enable */
    4242        uint16_t cs;        /**< Code selector */
    43         uintptr_t address;  /**< Code offset */
     43        void *address;      /**< Code offset */
    4444} trap_info_t;
     45
     46
     47typedef struct {
     48        evtchn_t port;
     49} evtchn_send_t;
     50
     51typedef struct {
     52        uint32_t cmd;
     53        union {
     54                evtchn_send_t send;
     55    };
     56} evtchn_op_t;
    4557
    4658
     
    4961#define XEN_SET_CALLBACKS               4
    5062#define XEN_UPDATE_VA_MAPPING   14
     63#define XEN_EVENT_CHANNEL_OP    16
    5164#define XEN_VERSION                             17
    5265#define XEN_CONSOLE_IO                  18
     
    7992
    8093
     94#define EVTCHNOP_SEND                   4
     95
     96
    8197#define UVMF_NONE                               0        /**< No flushing at all */
    8298#define UVMF_TLB_FLUSH                  1        /**< Flush entire TLB(s) */
     
    227243}
    228244
     245static inline int xen_notify_remote(evtchn_t channel)
     246{
     247    evtchn_op_t op;
     248       
     249    op.cmd = EVTCHNOP_SEND;
     250    op.send.port = channel;
     251    return hypercall1(XEN_EVENT_CHANNEL_OP, &op);
     252}
     253
    229254#endif
  • kernel/arch/xen32/src/asm.S

    r5b23a82 r7c5a8dd  
    3838.global xen_failsafe_callback
    3939.global enable_l_apic_in_msr
    40 .global interrupt_handlers
    4140.global memcpy
    4241.global memcpy_from_uspace
     
    124123        pop %eax
    125124        ret
    126 
    127 # Clear nested flag
    128 # overwrites %ecx
    129 .macro CLEAR_NT_FLAG
    130         pushfl
    131         pop %ecx
    132         and $0xffffbfff,%ecx
    133         push %ecx
    134         popfl
    135 .endm   
    136 
    137 ## Declare interrupt handlers
    138 #
    139 # Declare interrupt handlers for n interrupt
    140 # vectors starting at vector i.
    141 #
    142 # The handlers setup data segment registers
    143 # and call exc_dispatch().
    144 #
    145 #define INTERRUPT_ALIGN 64
    146 .macro handler i n
    147 
    148 .ifeq \i-0x30     # Syscall handler
    149         push %ds
    150         push %es
    151         push %fs
    152         push %gs
    153 
    154         # Push arguments on stack
    155         push %edi
    156         push %esi
    157         push %edx
    158         push %ecx
    159         push %eax
    160        
    161         # we must fill the data segment registers
    162         movw $16,%ax
    163         movw %ax,%ds
    164         movw %ax,%es
    165        
    166         sti
    167        
    168         call syscall_handler   # syscall_handler(ax,cx,dx,si,di)
    169         cli
    170         addl $20, %esp         # clean-up of parameters
    171        
    172         pop %gs
    173         pop %fs
    174         pop %es
    175         pop %ds
    176        
    177         CLEAR_NT_FLAG
    178         iret
    179 .else   
    180         /*
    181          * This macro distinguishes between two versions of ia32 exceptions.
    182          * One version has error word and the other does not have it.
    183          * The latter version fakes the error word on the stack so that the
    184          * handlers and istate_t can be the same for both types.
    185          */
    186         .iflt \i-32
    187                 .if (1 << \i) & ERROR_WORD_INTERRUPT_LIST
    188                         /*
    189                          * With error word, do nothing
    190                          */
    191                 .else
    192                         /*
    193                          * Version without error word,
    194                          */
    195                         subl $4, %esp
    196                 .endif
    197         .else
    198                 /*
    199                  * Version without error word,
    200                  */
    201                 subl $4, %esp
    202         .endif
    203        
    204         push %ds
    205         push %es
    206         push %fs
    207         push %gs
    208 
    209 #ifdef CONFIG_DEBUG_ALLREGS
    210         push %ebx
    211         push %ebp
    212         push %edi
    213         push %esi
    214 #else
    215         sub $16, %esp
    216 #endif
    217         push %edx
    218         push %ecx
    219         push %eax
    220        
    221         # we must fill the data segment registers
    222         movw $16,%ax
    223         movw %ax,%ds
    224         movw %ax,%es
    225 
    226         pushl %esp          # *istate
    227         pushl $(\i)         # intnum
    228         call exc_dispatch   # excdispatch(intnum, *istate)
    229         addl $8,%esp        # Clear arguments from stack
    230 
    231         CLEAR_NT_FLAG # Modifies %ecx
    232        
    233         pop %eax
    234         pop %ecx
    235         pop %edx
    236 #ifdef CONFIG_DEBUG_ALLREGS
    237         pop %esi
    238         pop %edi
    239         pop %ebp
    240         pop %ebx
    241 #else
    242         add $16, %esp
    243 #endif 
    244        
    245         pop %gs
    246         pop %fs
    247         pop %es
    248         pop %ds
    249 
    250         addl $4,%esp    # Skip error word, no matter whether real or fake.
    251         iret
    252 .endif
    253 
    254         .align INTERRUPT_ALIGN
    255         .if (\n-\i)-1
    256         handler "(\i+1)",\n
    257         .endif
    258 .endm
    259 
    260 # keep in sync with pm.h !!!
    261 IDT_ITEMS=64
    262 .align INTERRUPT_ALIGN
    263 interrupt_handlers:
    264 h_start:
    265         handler 0 IDT_ITEMS
    266 h_end:
    267 
    268 .data
    269 .global interrupt_handler_size
    270 
    271 interrupt_handler_size: .long (h_end-h_start)/IDT_ITEMS
  • kernel/arch/xen32/src/drivers/xconsole.c

    r5b23a82 r7c5a8dd  
    4040#include <console/console.h>
    4141#include <arch/hypercall.h>
     42#include <mm/frame.h>
    4243
     44#define MASK_INDEX(index, ring) ((index) & (sizeof(ring) - 1))
     45
     46typedef struct {
     47        char in[1024];
     48        char out[2048];
     49    uint32_t in_cons;
     50        uint32_t in_prod;
     51    uint32_t out_cons;
     52        uint32_t out_prod;
     53} xencons_t;
     54
     55static bool asynchronous = false;
    4356static void xen_putchar(chardev_t *d, const char ch);
    4457
     
    5265        chardev_initialize("xen_out", &xen_console, &xen_ops);
    5366        stdout = &xen_console;
     67        if (!(start_info.flags & SIF_INITDOMAIN))
     68                asynchronous = true;
    5469}
    5570
    5671void xen_putchar(chardev_t *d, const char ch)
    5772{
    58         xen_console_io(CONSOLE_IO_WRITE, 1, &ch);
     73        if (asynchronous) {
     74                xencons_t *console = (xencons_t *) PA2KA(MA2PA(PFN2ADDR(start_info.console_mfn)));
     75                uint32_t cons = console->out_cons;
     76                uint32_t prod = console->out_prod;
     77               
     78                memory_barrier();
     79               
     80                if ((prod - cons) > sizeof(console->out))
     81                        return;
     82               
     83                if (ch == '\n')
     84                        console->out[MASK_INDEX(prod++, console->out)] = '\r';
     85                console->out[MASK_INDEX(prod++, console->out)] = ch;
     86               
     87                write_barrier();
     88               
     89                console->out_prod = prod;
     90               
     91                xen_notify_remote(start_info.console_evtchn);
     92        } else
     93                xen_console_io(CONSOLE_IO_WRITE, 1, &ch);
    5994}
    6095
  • kernel/arch/xen32/src/pm.c

    r5b23a82 r7c5a8dd  
    104104}
    105105
     106static void trap(void)
     107{
     108}
     109
    106110void traps_init(void)
    107111{
     
    117121               
    118122                traps[i].cs = XEN_CS;
    119                 traps[i].address = ((uintptr_t) interrupt_handlers) + i * interrupt_handler_size;
     123                traps[i].address = trap;
    120124                exc_register(i, "undef", (iroutine) null_interrupt);
    121125        }
Note: See TracChangeset for help on using the changeset viewer.