Changeset c049309 in mainline for kernel/arch/xen32/src/asm.S


Ignore:
Timestamp:
2006-07-30T15:57:07Z (18 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
b3e8c90
Parents:
764c302
Message:

xen32 cleanup

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/xen32/src/asm.S

    • Property mode changed from 120000 to 100644
    r764c302 rc049309  
    1 ../../ia32/src/asm.S
     1#
     2# Copyright (C) 2001-2004 Jakub Jermar
     3# All rights reserved.
     4#
     5# Redistribution and use in source and binary forms, with or without
     6# modification, are permitted provided that the following conditions
     7# are met:
     8#
     9# - Redistributions of source code must retain the above copyright
     10#   notice, this list of conditions and the following disclaimer.
     11# - Redistributions in binary form must reproduce the above copyright
     12#   notice, this list of conditions and the following disclaimer in the
     13#   documentation and/or other materials provided with the distribution.
     14# - The name of the author may not be used to endorse or promote products
     15#   derived from this software without specific prior written permission.
     16#
     17# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     18# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     19# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     20# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     21# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     22# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     23# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     24# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     26# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27#
     28
     29## very low and hardware-level functions
     30
     31# Mask for interrupts 0 - 31 (bits 0 - 31) where 0 means that int has no error word
     32# and 1 means interrupt with error word
     33#define ERROR_WORD_INTERRUPT_LIST 0x00027D00
     34
     35.text
     36
     37.global enable_l_apic_in_msr
     38.global interrupt_handlers
     39.global memcpy
     40.global memcpy_from_uspace
     41.global memcpy_from_uspace_failover_address
     42.global memcpy_to_uspace
     43.global memcpy_to_uspace_failover_address
     44
     45
     46#define MEMCPY_DST      4
     47#define MEMCPY_SRC      8
     48#define MEMCPY_SIZE     12
     49
     50/** Copy memory to/from userspace.
     51 *
     52 * This is almost conventional memcpy().
     53 * The difference is that there is a failover part
     54 * to where control is returned from a page fault
     55 * if the page fault occurs during copy_from_uspace()
     56 * or copy_to_uspace().
     57 *
     58 * @param MEMCPY_DST(%esp)      Destination address.
     59 * @param MEMCPY_SRC(%esp)      Source address.
     60 * @param MEMCPY_SIZE(%esp)     Size.
     61 *
     62 * @return MEMCPY_SRC(%esp) on success and 0 on failure.
     63 */
     64memcpy:
     65memcpy_from_uspace:
     66memcpy_to_uspace:
     67        movl %edi, %edx                         /* save %edi */
     68        movl %esi, %eax                         /* save %esi */
     69       
     70        movl MEMCPY_SIZE(%esp), %ecx
     71        shrl $2, %ecx                           /* size / 4 */
     72       
     73        movl MEMCPY_DST(%esp), %edi
     74        movl MEMCPY_SRC(%esp), %esi
     75       
     76        rep movsl                               /* copy as much as possible word by word */
     77
     78        movl MEMCPY_SIZE(%esp), %ecx
     79        andl $3, %ecx                           /* size % 4 */
     80        jz 0f
     81       
     82        rep movsb                               /* copy the rest byte by byte */
     83
     840:
     85        movl %edx, %edi
     86        movl %eax, %esi
     87        movl MEMCPY_SRC(%esp), %eax             /* MEMCPY_SRC(%esp), success */
     88        ret
     89       
     90/*
     91 * We got here from as_page_fault() after the memory operations
     92 * above had caused a page fault.
     93 */
     94memcpy_from_uspace_failover_address:
     95memcpy_to_uspace_failover_address:
     96        movl %edx, %edi
     97        movl %eax, %esi
     98        xorl %eax, %eax                         /* return 0, failure */
     99        ret
     100
     101
     102## Enable local APIC
     103#
     104# Enable local APIC in MSR.
     105#
     106enable_l_apic_in_msr:
     107        push %eax
     108
     109        movl $0x1b, %ecx
     110        rdmsr
     111        orl $(1<<11),%eax
     112        orl $(0xfee00000),%eax
     113        wrmsr
     114
     115        pop %eax
     116        ret
     117
     118# Clear nested flag
     119# overwrites %ecx
     120.macro CLEAR_NT_FLAG
     121        pushfl
     122        pop %ecx
     123        and $0xffffbfff,%ecx
     124        push %ecx
     125        popfl
     126.endm   
     127
     128## Declare interrupt handlers
     129#
     130# Declare interrupt handlers for n interrupt
     131# vectors starting at vector i.
     132#
     133# The handlers setup data segment registers
     134# and call exc_dispatch().
     135#
     136#define INTERRUPT_ALIGN 64
     137.macro handler i n
     138
     139.ifeq \i-0x30     # Syscall handler
     140        push %ds
     141        push %es
     142        push %fs
     143        push %gs
     144
     145        # Push arguments on stack
     146        push %edi
     147        push %esi
     148        push %edx
     149        push %ecx
     150        push %eax
     151       
     152        # we must fill the data segment registers
     153        movw $16,%ax
     154        movw %ax,%ds
     155        movw %ax,%es
     156       
     157        sti
     158       
     159        call syscall_handler   # syscall_handler(ax,cx,dx,si,di)
     160        cli
     161        addl $20, %esp         # clean-up of parameters
     162       
     163        pop %gs
     164        pop %fs
     165        pop %es
     166        pop %ds
     167       
     168        CLEAR_NT_FLAG
     169        iret
     170.else   
     171        /*
     172         * This macro distinguishes between two versions of ia32 exceptions.
     173         * One version has error word and the other does not have it.
     174         * The latter version fakes the error word on the stack so that the
     175         * handlers and istate_t can be the same for both types.
     176         */
     177        .iflt \i-32
     178                .if (1 << \i) & ERROR_WORD_INTERRUPT_LIST
     179                        /*
     180                         * With error word, do nothing
     181                         */
     182                .else
     183                        /*
     184                         * Version without error word,
     185                         */
     186                        subl $4, %esp
     187                .endif
     188        .else
     189                /*
     190                 * Version without error word,
     191                 */
     192                subl $4, %esp
     193        .endif
     194       
     195        push %ds
     196        push %es
     197        push %fs
     198        push %gs
     199
     200#ifdef CONFIG_DEBUG_ALLREGS
     201        push %ebx
     202        push %ebp
     203        push %edi
     204        push %esi
     205#else
     206        sub $16, %esp
     207#endif
     208        push %edx
     209        push %ecx
     210        push %eax
     211       
     212        # we must fill the data segment registers
     213        movw $16,%ax
     214        movw %ax,%ds
     215        movw %ax,%es
     216
     217        pushl %esp          # *istate
     218        pushl $(\i)         # intnum
     219        call exc_dispatch   # excdispatch(intnum, *istate)
     220        addl $8,%esp        # Clear arguments from stack
     221
     222        CLEAR_NT_FLAG # Modifies %ecx
     223       
     224        pop %eax
     225        pop %ecx
     226        pop %edx
     227#ifdef CONFIG_DEBUG_ALLREGS
     228        pop %esi
     229        pop %edi
     230        pop %ebp
     231        pop %ebx
     232#else
     233        add $16, %esp
     234#endif 
     235       
     236        pop %gs
     237        pop %fs
     238        pop %es
     239        pop %ds
     240
     241        addl $4,%esp    # Skip error word, no matter whether real or fake.
     242        iret
     243.endif
     244
     245        .align INTERRUPT_ALIGN
     246        .if (\n-\i)-1
     247        handler "(\i+1)",\n
     248        .endif
     249.endm
     250
     251# keep in sync with pm.h !!!
     252IDT_ITEMS=64
     253.align INTERRUPT_ALIGN
     254interrupt_handlers:
     255h_start:
     256        handler 0 IDT_ITEMS
     257h_end:
     258
     259.data
     260.global interrupt_handler_size
     261
     262interrupt_handler_size: .long (h_end-h_start)/IDT_ITEMS
Note: See TracChangeset for help on using the changeset viewer.