Changeset 7cb567cd in mainline


Ignore:
Timestamp:
2007-04-08T20:52:53Z (18 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
e5dbbe5
Parents:
328f324b
Message:

map kernel pages explicitly as writable (this solves compatibility issues with Intel Core 2)
make VESA framebuffer initialization more robust

Location:
kernel
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/amd64/src/boot/boot.S

    r328f324b r7cb567cd  
    441441        movw %cx, %fs
    442442        movw %cx, %gs
     443       
     444        movl $START_STACK, %esp                 # initialize stack pointer
    443445       
    444446        jmpl $gdtselector(KTEXT32_DES), $vesa_meeting_point
  • kernel/arch/amd64/src/mm/page.c

    r328f324b r7cb567cd  
    8484        uintptr_t cur;
    8585        int i;
    86         int identity_flags = PAGE_CACHEABLE | PAGE_EXEC | PAGE_GLOBAL;
     86        int identity_flags = PAGE_CACHEABLE | PAGE_EXEC | PAGE_GLOBAL | PAGE_WRITE;
    8787
    8888        if (config.cpu_active == 1) {
     
    113113                exc_register(14, "page_fault", (iroutine) page_fault);
    114114                write_cr3((uintptr_t) AS_KERNEL->genarch.page_table);
    115         }
    116         else {
     115        } else
    117116                write_cr3((uintptr_t) AS_KERNEL->genarch.page_table);
    118         }
    119117}
    120118
     
    209207        pfn_t i;
    210208        for (i = 0; i < ADDR2PFN(ALIGN_UP(size, PAGE_SIZE)); i++)
    211                 page_mapping_insert(AS_KERNEL, virtaddr + PFN2ADDR(i), physaddr + PFN2ADDR(i), PAGE_NOT_CACHEABLE);
     209                page_mapping_insert(AS_KERNEL, virtaddr + PFN2ADDR(i), physaddr + PFN2ADDR(i), PAGE_NOT_CACHEABLE | PAGE_WRITE);
    212210       
    213211        last_frame = ALIGN_UP(last_frame + size, FRAME_SIZE);
  • kernel/arch/ia32/src/boot/boot.S

    r328f324b r7cb567cd  
    6464        multiboot_meeting_point:
    6565       
    66         pushl %ebx                                                      # save parameters from GRUB
    67         pushl %eax
     66        movl %eax, grub_eax                                     # save parameters from GRUB
     67        movl %ebx, grub_ebx
    6868       
    6969        xorl %eax, %eax 
     
    105105        call map_kernel                                                 # map kernel and turn paging on
    106106       
    107         popl %eax
    108         popl %ebx
     107        movl grub_eax, %eax
     108        movl grub_ebx, %ebx
    109109        cmpl $MULTIBOOT_LOADER_MAGIC, %eax                              # compare GRUB signature
    110110        je valid_boot
     
    482482.code32
    483483vesa_init_protect:
    484         popl %esp
    485 
    486484        movw $selector(KDATA_DES), %cx
    487485        movw %cx, %es
     
    491489        movw %cx, %ss
    492490       
     491        movl $START_STACK, %esp                 # initialize stack pointer
     492
    493493        jmpl $selector(KTEXT_DES), $vesa_meeting_point
    494494
     
    503503        .space 4096, 0
    504504
     505grub_eax:
     506        .long 0
     507
     508grub_ebx:
     509        .long 0
     510
    505511pse_msg:
    506512        .ascii "Page Size Extension not supported. System halted.\0"
  • kernel/arch/ia32/src/mm/page.c

    r328f324b r7cb567cd  
    6262                 */
    6363                for (cur = 0; cur < last_frame; cur += FRAME_SIZE) {
    64                         flags = PAGE_CACHEABLE;
     64                        flags = PAGE_CACHEABLE | PAGE_WRITE;
    6565                        if ((PA2KA(cur) >= config.base) && (PA2KA(cur) < config.base + config.kernel_size))
    6666                                flags |= PAGE_GLOBAL;
     
    7070                exc_register(14, "page_fault", (iroutine) page_fault);
    7171                write_cr3((uintptr_t) AS_KERNEL->genarch.page_table);
    72         }
    73         else {
     72        } else
    7473                write_cr3((uintptr_t) AS_KERNEL->genarch.page_table);
    75         }
    7674
    7775        paging_on();
     
    8785        pfn_t i;
    8886        for (i = 0; i < ADDR2PFN(ALIGN_UP(size, PAGE_SIZE)); i++)
    89                 page_mapping_insert(AS_KERNEL, virtaddr + PFN2ADDR(i), physaddr + PFN2ADDR(i), PAGE_NOT_CACHEABLE);
     87                page_mapping_insert(AS_KERNEL, virtaddr + PFN2ADDR(i), physaddr + PFN2ADDR(i), PAGE_NOT_CACHEABLE | PAGE_WRITE);
    9088       
    9189        last_frame = ALIGN_UP(last_frame + size, FRAME_SIZE);
     
    9694void page_fault(int n, istate_t *istate)
    9795{
    98         uintptr_t page;
     96        uintptr_t page;
    9997        pf_access_t access;
    10098       
    101         page = read_cr2();
     99        page = read_cr2();
    102100               
    103         if (istate->error_word & PFERR_CODE_RSVD)
     101        if (istate->error_word & PFERR_CODE_RSVD)
    104102                panic("Reserved bit set in page directory.\n");
    105103
     
    108106        else
    109107                access = PF_ACCESS_READ;
    110 
    111         if (as_page_fault(page, access, istate) == AS_PF_FAULT) {
     108       
     109        if (as_page_fault(page, access, istate) == AS_PF_FAULT) {
    112110                fault_if_from_uspace(istate, "Page fault: %#x", page);
    113 
    114                 decode_istate(istate);
    115                 printf("page fault address: %#x\n", page);
    116                 panic("page fault\n");
    117         }
     111               
     112                decode_istate(istate);
     113                printf("page fault address: %#x\n", page);
     114                panic("page fault\n");
     115        }
    118116}
    119117
  • kernel/arch/ia32/src/smp/smp.c

    r328f324b r7cb567cd  
    8383        if (config.cpu_count > 1) {             
    8484                page_mapping_insert(AS_KERNEL, l_apic_address, (uintptr_t) l_apic,
    85                                   PAGE_NOT_CACHEABLE);
     85                                  PAGE_NOT_CACHEABLE | PAGE_WRITE);
    8686                page_mapping_insert(AS_KERNEL, io_apic_address, (uintptr_t) io_apic,
    87                                   PAGE_NOT_CACHEABLE);
     87                                  PAGE_NOT_CACHEABLE | PAGE_WRITE);
    8888                                 
    8989                l_apic = (uint32_t *) l_apic_address;
    9090                io_apic = (uint32_t *) io_apic_address;
    91         }
     91        }
    9292}
    9393
  • kernel/arch/ia32xen/src/smp/smp.c

    r328f324b r7cb567cd  
    8181        if (config.cpu_count > 1) {             
    8282                page_mapping_insert(AS_KERNEL, l_apic_address, (uintptr_t) l_apic,
    83                                   PAGE_NOT_CACHEABLE);
     83                                  PAGE_NOT_CACHEABLE | PAGE_WRITE);
    8484                page_mapping_insert(AS_KERNEL, io_apic_address, (uintptr_t) io_apic,
    85                                   PAGE_NOT_CACHEABLE);
     85                                  PAGE_NOT_CACHEABLE | PAGE_WRITE);
    8686                                 
    8787                l_apic = (uint32_t *) l_apic_address;
    8888                io_apic = (uint32_t *) io_apic_address;
    89         }
     89        }
    9090}
    9191
  • kernel/arch/ppc32/src/mm/page.c

    r328f324b r7cb567cd  
    5454        pfn_t i;
    5555        for (i = 0; i < ADDR2PFN(ALIGN_UP(size, PAGE_SIZE)); i++)
    56                 page_mapping_insert(AS_KERNEL, virtaddr + PFN2ADDR(i), physaddr + PFN2ADDR(i), PAGE_NOT_CACHEABLE);
     56                page_mapping_insert(AS_KERNEL, virtaddr + PFN2ADDR(i), physaddr + PFN2ADDR(i), PAGE_NOT_CACHEABLE | PAGE_WRITE);
    5757       
    5858        last_frame = ALIGN_UP(last_frame + size, FRAME_SIZE);
  • kernel/arch/ppc64/src/mm/page.c

    r328f324b r7cb567cd  
    265265                int flags;
    266266               
    267                 /* Frames below 128 MB are mapped using BAT,
    268                    map rest of the physical memory */
    269267                for (cur = 128 << 20; cur < last_frame; cur += FRAME_SIZE) {
    270                         flags = PAGE_CACHEABLE;
     268                        flags = PAGE_CACHEABLE | PAGE_WRITE;
    271269                        if ((PA2KA(cur) >= config.base) && (PA2KA(cur) < config.base + config.kernel_size))
    272270                                flags |= PAGE_GLOBAL;
     
    297295        pfn_t i;
    298296        for (i = 0; i < ADDR2PFN(ALIGN_UP(size, PAGE_SIZE)); i++)
    299                 page_mapping_insert(AS_KERNEL, virtaddr + PFN2ADDR(i), physaddr + PFN2ADDR(i), PAGE_NOT_CACHEABLE);
     297                page_mapping_insert(AS_KERNEL, virtaddr + PFN2ADDR(i), physaddr + PFN2ADDR(i), PAGE_NOT_CACHEABLE | PAGE_WRITE);
    300298       
    301299        last_frame = ALIGN_UP(last_frame + size, FRAME_SIZE);
  • kernel/genarch/src/acpi/acpi.c

    r328f324b r7cb567cd  
    8989static void map_sdt(struct acpi_sdt_header *sdt)
    9090{
    91         page_mapping_insert(AS_KERNEL, (uintptr_t) sdt, (uintptr_t) sdt, PAGE_NOT_CACHEABLE);
     91        page_mapping_insert(AS_KERNEL, (uintptr_t) sdt, (uintptr_t) sdt, PAGE_NOT_CACHEABLE | PAGE_WRITE);
    9292        map_structure((uintptr_t) sdt, sdt->length);
    9393}
  • kernel/generic/src/mm/page.c

    r328f324b r7cb567cd  
    7777
    7878        for (i = 0; i < cnt; i++)
    79                 page_mapping_insert(AS_KERNEL, s + i * PAGE_SIZE, s + i * PAGE_SIZE, PAGE_NOT_CACHEABLE);
     79                page_mapping_insert(AS_KERNEL, s + i * PAGE_SIZE, s + i * PAGE_SIZE, PAGE_NOT_CACHEABLE | PAGE_WRITE);
    8080
    8181}
Note: See TracChangeset for help on using the changeset viewer.