Changeset ac5d02b in mainline


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.

Files:
10 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 */
  • arch/ia64/_link.ld

    rdcbc8be rac5d02b  
    1212
    1313SECTIONS {
    14     .image 0x0000000000001000: AT (0x0000000000001000) {
    15             *(K_TEXT_START)
    16             *(.text .stub .text.* .gnu.linkonce.t.*)
    17             *(.interp)
    18             *(.hash)
    19             *(.dynsym)
    20             *(.dynstr)
    21             *(.rel.init)
    22             *(.rela.init)
    23             *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*)
    24             *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
    25             *(.rel.fini)
    26             *(.rela.fini)
    27             *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*)
    28             *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)
    29             *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*)
    30             *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*)
    31             *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*)
    32             *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*)
    33             *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*)
    34             *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*)
    35             *(.rel.got)
    36             *(.rela.got)
    37             *(.rel.sdata .rel.sdata.* .rel.gnu.linkonce.s.*)
    38             *(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*)
    39             *(.rel.sbss .rel.sbss.* .rel.gnu.linkonce.sb.*)
    40             *(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*)
    41             *(.rel.sdata2 .rel.sdata2.* .rel.gnu.linkonce.s2.*)
    42             *(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*)
    43             *(.rel.sbss2 .rel.sbss2.* .rel.gnu.linkonce.sb2.*)
    44             *(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*)
    45             *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*)
    46             *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*)
    47             *(.rel.plt)
    48             *(.rela.plt)
    49             *(.rela.IA_64.pltoff)
    50             *(.init)
    51             *(.plt)
    52             *(.fini)
    53             *(K_TEXT_END)
    54             *(K_DATA_START)
    55             *(.rodata .rodata.* .gnu.linkonce.r.*)
    56             *(.rodata1)
    57             *(.sdata2 .sdata2.* .gnu.linkonce.s2.*)
    58             *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*)
    59             *(.opd)
    60             *(.IA_64.unwind_info* .gnu.linkonce.ia64unwi.*)
    61             *(.IA_64.unwind* .gnu.linkonce.ia64unw.*)
    62             *(.eh_frame_hdr)
    63             *(.preinit_array)
    64             *(.init_array)
    65             *(.fini_array)
    66             *(.data .data.* .gnu.linkonce.d.*)
    67             *(.data1)
    68             *(.tdata .tdata.* .gnu.linkonce.td.*)
    69             *(.tcommon)
    70             *(.eh_frame)
    71             *(.gcc_except_table)
    72             *(.dynamic)
    73             *(.jcr)
    74             *(.got)
    75             *(.IA_64.pltoff)
    76             *(.sdata .sdata.* .gnu.linkonce.s.*)
    77             *(.dynsbss)
    78             *(.sbss .sbss.* .gnu.linkonce.sb.*)
    79             *(.scommon)
    80             *(.dynbss)
    81             *(.bss .bss.* .gnu.linkonce.b.*)
    82             *(COMMON);
    83             *(K_DATA_END)
    84     }
     14        .image 0x0000000000001000: AT (0x0000000000001000) {
     15                ktext_start = .;
     16                *(K_TEXT_START);
     17                *(.text .stub .text.* .gnu.linkonce.t.*)
     18                *(.interp)
     19                *(.hash)
     20                *(.dynsym)
     21                *(.dynstr)
     22                *(.rel.init)
     23                *(.rela.init)
     24                *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*)
     25                *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
     26                *(.rel.fini)
     27                *(.rela.fini)
     28                *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*)
     29                *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)
     30                *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*)
     31                *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*)
     32                *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*)
     33                *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*)
     34                *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*)
     35                *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*)
     36                *(.rel.got)
     37                *(.rela.got)
     38                *(.rel.sdata .rel.sdata.* .rel.gnu.linkonce.s.*)
     39                *(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*)
     40                *(.rel.sbss .rel.sbss.* .rel.gnu.linkonce.sb.*)
     41                *(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*)
     42                *(.rel.sdata2 .rel.sdata2.* .rel.gnu.linkonce.s2.*)
     43                *(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*)
     44                *(.rel.sbss2 .rel.sbss2.* .rel.gnu.linkonce.sb2.*)
     45                *(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*)
     46                *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*)
     47                *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*)
     48                *(.rel.plt)
     49                *(.rela.plt)
     50                *(.rela.IA_64.pltoff)
     51                *(.init)
     52                *(.plt)
     53                *(.fini)
     54                ktext_end = .;
     55                kdata_start = .;
     56                *(K_DATA_START)
     57                *(.rodata .rodata.* .gnu.linkonce.r.*)
     58                *(.rodata1)
     59                *(.sdata2 .sdata2.* .gnu.linkonce.s2.*)
     60                *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*)
     61                *(.opd)
     62                *(.IA_64.unwind_info* .gnu.linkonce.ia64unwi.*)
     63                *(.IA_64.unwind* .gnu.linkonce.ia64unw.*)
     64                *(.eh_frame_hdr)
     65                *(.preinit_array)
     66                *(.init_array)
     67                *(.fini_array)
     68                *(.data .data.* .gnu.linkonce.d.*)
     69                *(.data1)
     70                *(.tdata .tdata.* .gnu.linkonce.td.*)
     71                *(.tcommon)
     72                *(.eh_frame)
     73                *(.gcc_except_table)
     74                *(.dynamic)
     75                *(.jcr)
     76                *(.got)
     77                *(.IA_64.pltoff)
     78                *(.sdata .sdata.* .gnu.linkonce.s.*)
     79                *(.dynsbss)
     80                *(.sbss .sbss.* .gnu.linkonce.sb.*)
     81                *(.scommon)
     82                *(.dynbss)
     83                *(.bss .bss.* .gnu.linkonce.b.*)
     84                *(COMMON);
     85                kdata_end = .;
     86        }
    8587
     88        _hardcoded_ktext_size = ktext_end - ktext_start;
     89        _hardcoded_kdata_size = kdata_end - kdata_start;
     90        _hardcoded_load_address = 0x0000000000001000;
    8691   
    8792}
  • arch/ia64/src/start.S

    rdcbc8be rac5d02b  
    2828
    2929.section K_TEXT_START
    30 .global k_text_start
    31 k_text_start:
    3230
    3331.global kernel_image_start
     
    5048
    5149        # initialize gp (Global Pointer) register
    52         movl r1=k_text_start
     50        movl r1 = _hardcoded_load_address
     51       
     52        ;;
    5353
    5454        #
    5555        # Initialize hardcoded_* variables.
    56         # (IA-64 port doesn't get these values from linker.)
    5756        #
    58         movl r8 = k_text_start  ;;
    59         movl r9 = k_text_end    ;;
    60         sub r8 = r9, r8         
    61         addl r10 = @gprel(hardcoded_ktext_size), gp;;
    62         st4 [r10] = r8          ;;
    63 
    64         movl r8 = k_data_start  ;;
    65         movl r9 = k_data_end    ;;
    66         sub r8 = r9, r8         
    67         addl r10 = @gprel(hardcoded_kdata_size), gp;;
    68         st4 [r10] = r8          ;;
    69        
    70         addl r10 = @gprel(hardcoded_load_address), gp;;
    71         st8 [r10] = r1
     57        movl r14 = _hardcoded_ktext_size
     58        movl r15 = _hardcoded_kdata_size
     59        movl r16 = _hardcoded_load_address
     60        addl r17 = @gprel(hardcoded_ktext_size), gp
     61        addl r18 = @gprel(hardcoded_kdata_size), gp
     62        addl r19 = @gprel(hardcoded_load_address), gp
     63        ;;
     64        st4 [r17] = r14
     65        st4 [r18] = r15
     66        st8 [r19] = r16
    7267       
    7368        br.call.sptk.many b0=main_bsp
     
    75700:
    7671        br 0b
    77 
    78 .section K_TEXT_END
    79 .global k_text_end
    80 k_text_end:
    81 
    82 .section K_DATA_START
    83 .global k_data_start
    84 k_data_start:
    85 
    86 .section K_DATA_END
    87 .global k_data_end
    88 k_data_end:
  • arch/mips/_link.ld

    rdcbc8be rac5d02b  
    1111
    1212SECTIONS {
    13     .image 0x80000000: AT (0x80000000) {
    14         ktext_start = .;
    15         *(.text);
    16         ktext_end = .;
     13        .image 0x80000000: AT (0x80000000) {
     14                ktext_start = .;
     15                *(.text);
     16                ktext_end = .;
    1717
    18         kdata_start = .;
    19         *(.rdata);
    20         *(.data);               /* initialized data */
    21         *(.lit8);
    22         *(.lit4);
    23         *(.sdata);
    24         *(.sbss);
    25         *(.bss);                /* uninitialized static variables */   
    26         *(.scommon);
    27         *(COMMON);              /* global variables */
    28         kdata_end = .;
     18                kdata_start = .;
     19                *(.rdata);
     20                *(.data);               /* initialized data */
     21                *(.lit8);
     22                *(.lit4);
     23                *(.sdata);
     24                *(.sbss);
     25                *(.bss);                /* uninitialized static variables */   
     26                *(.scommon);
     27                *(COMMON);              /* global variables */
     28                kdata_end = .;
    2929
    30     } = 0x00000000
     30        } = 0x00000000
    3131
    32     . = ABSOLUTE(hardcoded_ktext_size);
    33     .patch_1 : {
    34         LONG(ktext_end - ktext_start);
    35     }
     32        . = ABSOLUTE(hardcoded_ktext_size);
     33        .patch_1 : {
     34                LONG(ktext_end - ktext_start);
     35        }
    3636
    37     . = ABSOLUTE(hardcoded_kdata_size);
    38     .patch_2 : {
    39         LONG(kdata_end - kdata_start);
    40     }
     37        . = ABSOLUTE(hardcoded_kdata_size);
     38        .patch_2 : {
     39                LONG(kdata_end - kdata_start);
     40        }
    4141
    42     . = ABSOLUTE(hardcoded_load_address);
    43     .patch_3 : {
    44         LONG(0x80000000);
    45     }
     42        . = ABSOLUTE(hardcoded_load_address);
     43        .patch_3 : {
     44                LONG(0x80000000);
     45        }
    4646
    4747}
  • src/main/main.c

    rdcbc8be rac5d02b  
    5656#include <arch/faddr.h>
    5757
     58#include <typedefs.h>
     59
    5860char *project = "SPARTAN kernel";
    5961char *copyright = "Copyright (C) 2001-2005 Jakub Jermar\nCopyright (C) 2005 HelenOS project";
     
    6870 */
    6971__address hardcoded_load_address = 0;
    70 __u32 hardcoded_ktext_size = 0;
    71 __u32 hardcoded_kdata_size = 0;
     72size_t hardcoded_ktext_size = 0;
     73size_t hardcoded_kdata_size = 0;
    7274
    7375void main_bsp(void);
Note: See TracChangeset for help on using the changeset viewer.