Changeset ac5d02b in mainline for arch/ia32


Ignore:
Timestamp:
2005-06-03T13:17:05Z (20 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
70527f1
Parents:
dcbc8be
Message:

IA-32 fixes.
Use kernel addresses instead of physical addresses in map_page_to_frame().
Physical addresses are supposed to only be exported to mm hardware.
Because of this fix, userspace is functional again.

Remap EGA videoram to (0x80000000 + videoram) and change the ega driver to work with the new address.

Minor cosmetics through out the code.
Changes in linker scripts.

Location:
arch/ia32
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • arch/ia32/_link.ld

    rdcbc8be rac5d02b  
    1313
    1414SECTIONS {
    15     .unmapped 0x8000: AT (0x8000) {
    16         unmapped_ktext_start = .;
    17         *(K_TEXT_START);
    18         unmapped_ktext_end = .;
    19         unmapped_kdata_start = .;
    20         *(K_DATA_START);
    21         unmapped_kdata_end = .;
    22     }
    23    
    24     .mapped (0x80000000+SIZEOF(.unmapped)+0x8000) : AT (0x8000+SIZEOF(.unmapped)) {
    25         ktext_start = .;
    26         *(.text);
    27         ktext_end = .;
     15        .unmapped 0x8000: AT (0x8000) {
     16                unmapped_ktext_start = .;
     17                *(K_TEXT_START);
     18                unmapped_ktext_end = .;
     19                unmapped_kdata_start = .;
     20                *(K_DATA_START);
     21                unmapped_kdata_end = .;
     22        }
    2823
    29         kdata_start = .;
    30         *(.data);               /* initialized data */
    31         *(.rodata*);            /* string literals */
    32         *(COMMON);              /* global variables */
    33         *(.bss);                /* uninitialized static variables */
    34         *(K_DATA_END);
    35         kdata_end = .;
    36     }
     24        .mapped (0x80000000+SIZEOF(.unmapped)+0x8000) : AT (0x8000+SIZEOF(.unmapped)) {
     25                ktext_start = .;
     26                *(.text);
     27                ktext_end = .;
    3728
    38     _hardcoded_ktext_size = ktext_end - ktext_start + (unmapped_ktext_end - unmapped_ktext_start);
    39     _hardcoded_kdata_size = kdata_end - kdata_start + (unmapped_kdata_end - unmapped_kdata_start);
    40     _hardcoded_load_address = 0x80008000;
     29                kdata_start = .;
     30                *(.data);               /* initialized data */
     31                *(.rodata*);            /* string literals */
     32                *(COMMON);              /* global variables */
     33                *(.bss);                /* uninitialized static variables */
     34                *(K_DATA_END);
     35                kdata_end = .;
     36        }
     37
     38        _hardcoded_ktext_size = ktext_end - ktext_start + (unmapped_ktext_end - unmapped_ktext_start);
     39        _hardcoded_kdata_size = kdata_end - kdata_start + (unmapped_kdata_end - unmapped_kdata_start);
     40        _hardcoded_load_address = 0x80008000;
    4141
    4242}
  • arch/ia32/include/mm/vm.h

    rdcbc8be rac5d02b  
    3838
    3939#define UTEXT_ADDRESS_ARCH      0x00001000
    40 #define USTACK_ADDRESS_ARCH     (0x7fffffffUL-(PAGE_SIZE-1))
     40#define USTACK_ADDRESS_ARCH     (0x7fffffff-(PAGE_SIZE-1))
    4141#define UDATA_ADDRESS_ARCH      0x21000000
    4242
  • arch/ia32/src/asm.s

    rdcbc8be rac5d02b  
    445445
    446446
    447 .section K_DATA_START
     447#.section K_DATA_START
    448448.global interrupt_handler_size
    449449
  • arch/ia32/src/drivers/ega.c

    rdcbc8be rac5d02b  
    4848        __u8 hi, lo;
    4949
    50         map_page_to_frame(VIDEORAM, VIDEORAM, PAGE_NOT_CACHEABLE, 0);
     50        map_page_to_frame(PA2KA(VIDEORAM), VIDEORAM, PAGE_NOT_CACHEABLE, 0);
    5151        outb(0x3d4,0xe);
    5252        hi = inb(0x3d5);
     
    5959void ega_display_char(char ch)
    6060{
    61         __u8 *vram = (__u8 *) VIDEORAM;
     61        __u8 *vram = (__u8 *) PA2KA(VIDEORAM);
    6262       
    6363        vram[ega_cursor*2] = ch;
     
    7272            return;
    7373
    74         memcopy(VIDEORAM + ROW*2, VIDEORAM, (SCREEN - ROW)*2);
    75         memsetw(VIDEORAM + (SCREEN - ROW)*2, ROW, 0x0720);
     74        memcopy(PA2KA(VIDEORAM) + ROW*2, PA2KA(VIDEORAM), (SCREEN - ROW)*2);
     75        memsetw(PA2KA(VIDEORAM) + (SCREEN - ROW)*2, ROW, 0x0720);
    7676        ega_cursor = ega_cursor - ROW;
    7777}
  • arch/ia32/src/mm/page.c

    rdcbc8be rac5d02b  
    3636#include <arch/asm.h>
    3737#include <synch/spinlock.h>
     38#include <debug.h>
    3839
    3940/*
     
    5455
    5556        if (config.cpu_active == 1) {
    56                 dba = KA2PA(frame_alloc(FRAME_KA | FRAME_PANIC));
     57                dba = frame_alloc(FRAME_KA | FRAME_PANIC);
    5758                memsetb(dba, PAGE_SIZE, 0);
    5859           
     
    6970
    7071                trap_register(14, page_fault);
    71                 cpu_write_dba(dba);             
     72                cpu_write_dba(KA2PA(dba));
    7273        }
    7374        else {
     
    8283                dba = frame_alloc(FRAME_KA | FRAME_PANIC);
    8384                memcopy(bootstrap_dba, dba, PAGE_SIZE);
    84                 cpu_write_dba(dba);
     85                cpu_write_dba(KA2PA(dba));
    8586        }
    8687
     
    122123                 * frame for the page table and clean it.
    123124                 */
    124                 newpt = KA2PA(frame_alloc(FRAME_KA));
    125                 pd[pde].frame_address = newpt >> 12;
     125                newpt = frame_alloc(FRAME_KA);
     126                pd[pde].frame_address = KA2PA(newpt) >> 12;
    126127                memsetb(newpt, PAGE_SIZE, 0);
    127128                pd[pde].present = 1;
     
    129130        }
    130131        if (copy) {
    131                 newpt = KA2PA(frame_alloc(FRAME_KA));
     132                newpt = frame_alloc(FRAME_KA);
    132133                memcopy(pd[pde].frame_address << 12, newpt, PAGE_SIZE);
    133                 pd[pde].frame_address = newpt >> 12;
     134                pd[pde].frame_address = KA2PA(newpt) >> 12;
    134135        }
    135136       
  • arch/ia32/src/userspace.c

    rdcbc8be rac5d02b  
    5353            "pushl %4\n"
    5454            "iret"
    55             : : "i" (selector(UDATA_DES) | PL_USER), "i" (USTACK_ADDRESS+THREAD_STACK_SIZE-1000), "r" (pri), "i" (selector(UTEXT_DES) | PL_USER), "i" (UTEXT_ADDRESS));
     55            : : "i" (selector(UDATA_DES) | PL_USER), "i" (USTACK_ADDRESS+(THREAD_STACK_SIZE-1)), "r" (pri), "i" (selector(UTEXT_DES) | PL_USER), "i" (UTEXT_ADDRESS));
    5656       
    5757        /* Unreachable */
Note: See TracChangeset for help on using the changeset viewer.