Changeset d767cb1 in mainline


Ignore:
Timestamp:
2011-08-19T11:59:50Z (13 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
7beb220
Parents:
c2cf033 (diff), ac7f81d (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge i486 support from Martin Sucha.

Files:
12 edited
1 moved

Legend:

Unmodified
Added
Removed
  • HelenOS.config

    rc2cf033 rd767cb1  
    7070@ "pentium4" Pentium 4
    7171@ "pentium3" Pentium 3
     72@ "i486" i486
    7273@ "core" Core Solo/Duo
    7374@ "athlon_xp" Athlon XP
  • kernel/arch/ia32/Makefile.inc

    rc2cf033 rd767cb1  
    6464endif
    6565
     66ifeq ($(PROCESSOR),i486)
     67        CMN2 = -march=i486
     68endif
     69
    6670ifeq ($(PROCESSOR),core)
    6771        CMN2 = -march=prescott
  • kernel/arch/ia32/include/asm.h

    rc2cf033 rd767cb1  
    311311}
    312312
     313#ifndef PROCESSOR_i486
    313314/** Write to MSR */
    314315NO_TRACE static inline void write_msr(uint32_t msr, uint64_t value)
     
    335336        return ((uint64_t) dx << 32) | ax;
    336337}
     338#endif
    337339
    338340
  • kernel/arch/ia32/include/atomic.h

    rc2cf033 rd767cb1  
    121121        asm volatile (
    122122                "0:\n"
     123#ifndef PROCESSOR_i486
    123124                "pause\n"        /* Pentium 4's HT love this instruction */
     125#endif
    124126                "mov %[count], %[tmp]\n"
    125127                "testl %[tmp], %[tmp]\n"
  • kernel/arch/ia32/include/cycle.h

    rc2cf033 rd767cb1  
    4040NO_TRACE static inline uint64_t get_cycle(void)
    4141{
     42#ifdef PROCESSOR_i486
     43        return 0;
     44#else
    4245        uint64_t v;
    4346       
     
    4851       
    4952        return v;
     53#endif
    5054}
    5155
  • kernel/arch/ia32/src/asm.S

    rc2cf033 rd767cb1  
    405405        xorl %eax, %eax
    406406        cmpl $(GDT_SELECTOR(KTEXT_DES)), ISTATE_OFFSET_CS(%esp)
     407#ifdef PROCESSOR_i486
     408        jz 0f
     409        movl %eax, %ebp
     4100:
     411#else
    407412        cmovnzl %eax, %ebp
     413#endif
    408414
    409415        movl %ebp, ISTATE_OFFSET_EBP_FRAME(%esp)
  • kernel/arch/ia32/src/boot/boot.S

    rc2cf033 rd767cb1  
    9797        pm_status $status_prot
    9898       
    99         movl $(INTEL_CPUID_LEVEL), %eax
    100         cpuid
    101         cmp $0x0, %eax  /* any function > 0? */
    102         jbe pse_unsupported
    103        
    104         movl $(INTEL_CPUID_STANDARD), %eax
    105         cpuid
    106         bt $(INTEL_PSE), %edx
    107         jc pse_supported
    108        
    109         pse_unsupported:
    110                
    111                 pm_error $err_pse
    112        
    113         pse_supported:
    114        
    11599#include "vesa_prot.inc"
    116100       
     
    140124                jmp hlt0
    141125
     126/** Calculate unmapped address of the end of the kernel. */
     127calc_end_of_kernel:
     128        movl $hardcoded_load_address, %edi
     129        andl $0x7fffffff, %edi
     130        movl (%edi), %esi
     131        andl $0x7fffffff, %esi
     132       
     133        movl $hardcoded_ktext_size, %edi
     134        andl $0x7fffffff, %edi
     135        addl (%edi), %esi
     136        andl $0x7fffffff, %esi
     137       
     138        movl $hardcoded_kdata_size, %edi
     139        andl $0x7fffffff, %edi
     140        addl (%edi), %esi
     141        andl $0x7fffffff, %esi
     142        movl %esi, end_of_kernel
     143        ret
     144
     145/** Find free 2M (+4k for alignment) region where to store page tables */
     146find_mem_for_pt:
     147        /* Check if multiboot info is present */
     148        cmpl $0x2BADB002, grub_eax
     149        je check_multiboot_map
     150        ret
     151check_multiboot_map:
     152        /* Copy address of the multiboot info to ebx */
     153        movl grub_ebx, %ebx
     154        /* Check if memory map flag is present */
     155        movl (%ebx), %edx
     156        andl $(1 << 6), %edx
     157        jnz use_multiboot_map
     158        ret
     159use_multiboot_map:
     160        /* Copy address of the memory map to edx */
     161        movl 48(%ebx), %edx
     162        movl %edx, %ecx
     163        addl 44(%ebx), %ecx
     164        /* Find a free region at least 2M in size */
     165        check_memmap_loop:
     166                /* Is this a free region? */
     167                cmp $1, 20(%edx)
     168                jnz next_region
     169                /* Check size */
     170                cmp $0, 16(%edx)
     171                jnz next_region
     172                cmpl $(2 * 1024 * 1024 + 4 * 1024), 12(%edx)
     173                jbe next_region
     174                cmp $0, 8(%edx)
     175                jz found_region
     176        next_region:
     177                cmp %ecx, %edx
     178                jbe next_region_do
     179                ret
     180        next_region_do:
     181                addl (%edx), %edx
     182                addl $4, %edx
     183                jmp check_memmap_loop
     184        found_region:
     185                /* Use end of the found region */
     186                mov 4(%edx), %ecx
     187                add 12(%edx), %ecx
     188                sub $(2 * 1024 * 1024), %ecx
     189                mov %ecx, free_area
     190        ret
     191               
     192
    142193/** Setup mapping for the kernel.
    143194 *
     
    148199.global map_kernel
    149200map_kernel:
     201        /* Paging features */
    150202        movl %cr4, %ecx
    151         orl $(1 << 4), %ecx      /* PSE on */
    152203        andl $(~(1 << 5)), %ecx  /* PAE off */
    153204        movl %ecx, %cr4
    154205       
     206        call calc_end_of_kernel
     207        call find_mem_for_pt
     208        mov end_of_kernel, %esi
     209        mov free_area, %ecx
     210        cmpl %esi, %ecx
     211        jbe use_end_of_kernel
     212        mov %ecx, %esi
     213        /* Align address down to 4k */
     214        andl $(~4095), %esi
     215use_end_of_kernel:
     216       
     217        /* Align address to 4k */
     218        addl $4095, %esi
     219        andl $(~4095), %esi
     220       
     221        /* Allocate space for page tables*/     
     222        movl %esi, pt_loc
     223        movl $ballocs, %edi
     224        andl $0x7fffffff, %edi
     225        movl %esi, (%edi)
     226        addl $4, %edi
     227        movl $(2*1024*1024), (%edi)
     228       
     229        /* Fill page tables */
     230        xorl %ecx, %ecx
     231        xorl %ebx, %ebx
     232       
     233        floop_pt:
     234                movl $((1 << 1) | (1 << 0)), %eax
     235                orl %ebx, %eax
     236                movl %eax, (%esi, %ecx, 4)
     237                addl $(4 * 1024), %ebx
     238               
     239                incl %ecx
     240                cmpl $(512 * 1024), %ecx
     241                jl floop_pt
     242       
     243        /* Fill page directory */
    155244        movl $(page_directory + 0), %esi
    156245        movl $(page_directory + 2048), %edi
    157246        xorl %ecx, %ecx
    158         xorl %ebx, %ebx
     247        movl pt_loc, %ebx
    159248       
    160249        floop:
    161                 movl $((1 << 7) | (1 << 1) | (1 << 0)), %eax
     250                movl $((1 << 1) | (1 << 0)), %eax
    162251                orl %ebx, %eax
    163252                /* Mapping 0x00000000 + %ecx * 4M => 0x00000000 + %ecx * 4M */
     
    165254                /* Mapping 0x80000000 + %ecx * 4M => 0x00000000 + %ecx * 4M */
    166255                movl %eax, (%edi, %ecx, 4)
    167                 addl $(4 * 1024 * 1024), %ebx
     256                addl $(4 * 1024), %ebx
    168257               
    169258                incl %ecx
     
    523612
    524613grub_ebx:
     614        .long 0
     615
     616pt_loc:
     617        .long 0
     618end_of_kernel:
     619        .long 0
     620free_area:
    525621        .long 0
    526622
  • kernel/arch/ia32/src/cpu/cpu.c

    rc2cf033 rd767cb1  
    118118                );
    119119        }
    120        
     120
     121#ifndef PROCESSOR_i486
    121122        if (CPU->arch.fi.bits.sep) {
    122123                /* Setup fast SYSENTER/SYSEXIT syscalls */
    123124                syscall_setup_cpu();
    124125        }
     126#endif
    125127}
    126128
  • kernel/arch/ia32/src/proc/scheduler.c

    rc2cf033 rd767cb1  
    6060        uintptr_t kstk = (uintptr_t) &THREAD->kstack[STACK_SIZE];
    6161       
     62#ifndef PROCESSOR_i486
    6263        if (CPU->arch.fi.bits.sep) {
    6364                /* Set kernel stack for CP3 -> CPL0 switch via SYSENTER */
    6465                write_msr(IA32_MSR_SYSENTER_ESP, kstk - sizeof(istate_t));
    6566        }
     67#endif
    6668       
    6769        /* Set kernel stack for CPL3 -> CPL0 switch via interrupt */
  • kernel/arch/ia32/src/syscall.c

    rc2cf033 rd767cb1  
    3939#include <arch/pm.h>
    4040
     41#ifndef PROCESSOR_i486
    4142/** Enable & setup support for SYSENTER/SYSEXIT */
    4243void syscall_setup_cpu(void)
     
    4950        write_msr(IA32_MSR_SYSENTER_EIP, (uint32_t) sysenter_handler);
    5051}
     52#endif
    5153
    5254/** @}
  • uspace/lib/c/arch/ia32/Makefile.common

    rc2cf033 rd767cb1  
    2828
    2929CLANG_ARCH = i386
     30ifeq ($(PROCESSOR),i486)
     31GCC_CFLAGS += -march=i486 -fno-omit-frame-pointer
     32else
    3033GCC_CFLAGS += -march=pentium -fno-omit-frame-pointer
     34endif
    3135
    3236ENDIANESS = LE
  • uspace/lib/c/arch/ia32/Makefile.inc

    rc2cf033 rd767cb1  
    2828
    2929ARCH_SOURCES = \
    30         arch/$(UARCH)/src/entry.s \
     30        arch/$(UARCH)/src/entry.S \
    3131        arch/$(UARCH)/src/entryjmp.s \
    3232        arch/$(UARCH)/src/thread_entry.s \
  • uspace/lib/c/arch/ia32/src/entry.S

    rc2cf033 rd767cb1  
    4646        mov %ax, %fs
    4747        # Do not set %gs, it contains descriptor that can see TLS
    48        
     48
     49#ifndef PROCESSOR_i486 
    4950        # Detect the mechanism used for making syscalls
    5051        movl $(INTEL_CPUID_STANDARD), %eax
     
    5556        movl $__syscall_fast, (%eax)
    56570:
     58#endif
    5759        #
    5860        # Create the first stack frame.
Note: See TracChangeset for help on using the changeset viewer.