Changeset 6c383b0 in mainline


Ignore:
Timestamp:
2007-11-17T19:52:57Z (17 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
e0bc7fc
Parents:
7e956eb
Message:

Support for six syscall arguments for ia32.

Files:
1 added
1 deleted
3 edited

Legend:

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

    r7e956eb r6c383b0  
    2929## very low and hardware-level functions
    3030
    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
     31# Mask for interrupts 0 - 31 (bits 0 - 31) where 0 means that int has no error
     32# word and 1 means interrupt with error word
     33#define ERROR_WORD_INTERRUPT_LIST 0x00027d00
    3434
    3535.text
     
    6666memcpy_from_uspace:
    6767memcpy_to_uspace:
    68         movl %edi, %edx                         /* save %edi */
    69         movl %esi, %eax                         /* save %esi */
     68        movl %edi, %edx                 /* save %edi */
     69        movl %esi, %eax                 /* save %esi */
    7070       
    7171        movl MEMCPY_SIZE(%esp), %ecx
    72         shrl $2, %ecx                           /* size / 4 */
     72        shrl $2, %ecx                   /* size / 4 */
    7373       
    7474        movl MEMCPY_DST(%esp), %edi
    7575        movl MEMCPY_SRC(%esp), %esi
    7676       
    77         rep movsl                               /* copy as much as possible word by word */
     77        rep movsl                       /* copy whole words */
    7878
    7979        movl MEMCPY_SIZE(%esp), %ecx
    80         andl $3, %ecx                           /* size % 4 */
     80        andl $3, %ecx                   /* size % 4 */
    8181        jz 0f
    8282       
    83         rep movsb                               /* copy the rest byte by byte */
     83        rep movsb                       /* copy the rest byte by byte */
    8484
    85850:
    8686        movl %edx, %edi
    8787        movl %eax, %esi
    88         movl MEMCPY_SRC(%esp), %eax             /* MEMCPY_SRC(%esp), success */
     88        movl MEMCPY_SRC(%esp), %eax     /* MEMCPY_SRC(%esp), success */
    8989        ret
    9090       
     
    9797        movl %edx, %edi
    9898        movl %eax, %esi
    99         xorl %eax, %eax                         /* return 0, failure */
     99        xorl %eax, %eax                 /* return 0, failure */
    100100        ret
    101101
     
    105105#
    106106paging_on:
    107         movl %cr0,%edx
    108         orl $(1<<31),%edx               # paging on
    109         andl $~((1<<30)|(1<<29)),%edx   # clear Cache Disable and not Write Though
     107        movl %cr0, %edx
     108        orl $(1 << 31), %edx            # paging on
     109        # clear Cache Disable and not Write Though
     110        andl $~((1 << 30) | (1 << 29)), %edx
    110111        movl %edx,%cr0
    111112        jmp 0f
     
    119120#
    120121enable_l_apic_in_msr:
    121         push %eax
    122 
    123122        movl $0x1b, %ecx
    124123        rdmsr
    125         orl $(1<<11),%eax
    126         orl $(0xfee00000),%eax
     124        orl $(1 << 11), %eax
     125        orl $(0xfee00000), %eax
    127126        wrmsr
    128 
    129         pop %eax
    130127        ret
    131128
     
    135132        pushfl
    136133        pop %ecx
    137         and $0xffffbfff,%ecx
     134        and $0xffffbfff, %ecx
    138135        push %ecx
    139136        popfl
     
    151148.macro handler i n
    152149
    153 .ifeq \i-0x30     # Syscall handler
    154         push %ds
    155         push %es
    156         push %fs
    157         push %gs
    158 
    159         # Push arguments on stack
    160         push %edi
    161         push %esi
    162         push %edx
    163         push %ecx
    164         push %eax
     150.ifeq \i - 0x30     # Syscall handler
     151        pushl %ds
     152        pushl %es
     153        pushl %fs
     154        pushl %gs
     155
     156        #
     157        # Push syscall arguments onto the stack
     158        #
     159        # NOTE: The idea behind the order of arguments passed in registers is to
     160        #       use all scratch registers first and preserved registers next.
     161        #       An optimized libc syscall wrapper can make use of this setup.
     162        #
     163        pushl %eax
     164        pushl %ebp
     165        pushl %edi
     166        pushl %esi
     167        pushl %ebx
     168        pushl %ecx
     169        pushl %edx
    165170       
    166171        # we must fill the data segment registers
    167         movw $16,%ax
    168         movw %ax,%ds
    169         movw %ax,%es
     172        movw $16, %ax
     173        movw %ax, %ds
     174        movw %ax, %es
    170175       
    171176        sti
    172        
    173         call syscall_handler   # syscall_handler(ax,cx,dx,si,di)
     177        # syscall_handler(edx, ecx, ebx, esi, edi, ebp, eax)
     178        call syscall_handler   
    174179        cli
    175         addl $20, %esp         # clean-up of parameters
    176        
    177         pop %gs
    178         pop %fs
    179         pop %es
    180         pop %ds
     180        addl $28, %esp         # clean-up of parameters
     181       
     182        popl %gs
     183        popl %fs
     184        popl %es
     185        popl %ds
    181186       
    182187        CLEAR_NT_FLAG
     
    189194         * handlers and istate_t can be the same for both types.
    190195         */
    191         .iflt \i-32
     196        .iflt \i - 32
    192197                .if (1 << \i) & ERROR_WORD_INTERRUPT_LIST
    193198                        /*
     
    207212        .endif
    208213       
    209         push %ds
    210         push %es
    211         push %fs
    212         push %gs
     214        pushl %ds
     215        pushl %es
     216        pushl %fs
     217        pushl %gs
    213218
    214219#ifdef CONFIG_DEBUG_ALLREGS
    215         push %ebx
    216         push %ebp
    217         push %edi
    218         push %esi
     220        pushl %ebx
     221        pushl %ebp
     222        pushl %edi
     223        pushl %esi
    219224#else
    220         sub $16, %esp
     225        subl $16, %esp
    221226#endif
    222         push %edx
    223         push %ecx
    224         push %eax
     227        pushl %edx
     228        pushl %ecx
     229        pushl %eax
    225230       
    226231        # we must fill the data segment registers
    227         movw $16,%ax
    228         movw %ax,%ds
    229         movw %ax,%es
     232        movw $16, %ax
     233        movw %ax, %ds
     234        movw %ax, %es
    230235
    231236        pushl %esp          # *istate
    232237        pushl $(\i)         # intnum
    233238        call exc_dispatch   # excdispatch(intnum, *istate)
    234         addl $8,%esp        # Clear arguments from stack
     239        addl $8, %esp       # Clear arguments from stack
    235240
    236241        CLEAR_NT_FLAG # Modifies %ecx
    237242       
    238         pop %eax
    239         pop %ecx
    240         pop %edx
     243        popl %eax
     244        popl %ecx
     245        popl %edx
    241246#ifdef CONFIG_DEBUG_ALLREGS
    242         pop %esi
    243         pop %edi
    244         pop %ebp
    245         pop %ebx
     247        popl %esi
     248        popl %edi
     249        popl %ebp
     250        popl %ebx
    246251#else
    247         add $16, %esp
     252        addl $16, %esp
    248253#endif 
    249254       
    250         pop %gs
    251         pop %fs
    252         pop %es
    253         pop %ds
    254 
    255         addl $4,%esp    # Skip error word, no matter whether real or fake.
     255        popl %gs
     256        popl %fs
     257        popl %es
     258        popl %ds
     259
     260        addl $4, %esp   # Skip error word, no matter whether real or fake.
    256261        iret
    257262.endif
    258263
    259264        .align INTERRUPT_ALIGN
    260         .if (\n-\i)-1
    261         handler "(\i+1)",\n
     265        .if (\n- \i) - 1
     266        handler "(\i + 1)", \n
    262267        .endif
    263268.endm
    264269
    265270# keep in sync with pm.h !!!
    266 IDT_ITEMS=64
     271IDT_ITEMS = 64
    267272.align INTERRUPT_ALIGN
    268273interrupt_handlers:
     
    274279.global interrupt_handler_size
    275280
    276 interrupt_handler_size: .long (h_end-h_start)/IDT_ITEMS
     281interrupt_handler_size: .long (h_end - h_start) / IDT_ITEMS
  • uspace/lib/libc/arch/ia32/Makefile.inc

    r7e956eb r6c383b0  
    3333TOOLCHAIN_DIR = /usr/local/i686/bin
    3434
    35 ARCH_SOURCES += arch/$(ARCH)/src/syscall.c \
     35ARCH_SOURCES += arch/$(ARCH)/src/syscall.S \
    3636                arch/$(ARCH)/src/fibril.S \
    3737                arch/$(ARCH)/src/tls.c
  • uspace/lib/libc/arch/ia32/src/fibril.S

    r7e956eb r6c383b0  
    7575
    7676        # Set thread local storage
    77         pushl %edi
    78         movl 24(%eax), %eax   # Set arg1 to TLS addr
    79         movl $1, %edi         # Syscall 1
     77        pushl %edx
     78        movl 24(%eax), %edx   # Set arg1 to TLS addr
     79        movl $1, %eax         # Syscall SYS_TLS_SET
    8080        int $0x30
    81         popl %edi
     81        popl %edx
    8282       
    8383        xorl %eax,%eax          # context_restore returns 0
Note: See TracChangeset for help on using the changeset viewer.