Changeset 38de8a5 in mainline


Ignore:
Timestamp:
2005-09-09T13:50:54Z (19 years ago)
Author:
Ondrej Palkovsky <ondrap@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
b02e5d1
Parents:
b0edf3b2
Message:

MIPS architecture now works without any problems in

  • msim: compile as OUTPUT_FORMAT(binary)
  • gxemul: compile as OUTPUT_FORMAT(ecoff-littlemips), or create

configuration file for binary format (will be done later)

  • simics: compile as OUTPUT_FORMAT(elf32-little), might work with binary

format, didn't try yet.

Files:
2 added
6 edited
1 moved

Legend:

Unmodified
Added
Removed
  • arch/mips/Makefile.inc

    rb0edf3b2 r38de8a5  
    2525        arch/mips.c \
    2626        arch/dummy.S \
    27         arch/putchar.c \
     27        arch/console.c \
    2828        arch/asm.S \
    2929        arch/exception.c \
  • arch/mips/_link.ld

    rb0edf3b2 r38de8a5  
    77 */
    88
     9/* OUTPUT_FORMAT(ecoff-littlemips) */
    910OUTPUT_FORMAT(binary)
     11/* OUTPUT_FORMAT(elf32-little) */
     12
    1013ENTRY(kernel_image_start)
    1114
    1215SECTIONS {
    13         .image 0x80000000: AT (0x80000000) {
     16        .image 0x80000000: AT (0) {
    1417                _gp = 0x00000000;
    1518               
     
    2831                *(.sdata);
    2932                *(.sbss);
     33                *(.comment);
     34                *(.pdr);
     35
    3036                hardcoded_ktext_size = .;
    3137                LONG(ktext_end - ktext_start); 
     
    4349                kdata_end = .;
    4450
    45         } = 0x00000000
     51        }
    4652}
  • arch/mips/src/console.c

    rb0edf3b2 r38de8a5  
    11/*
    2  * Copyright (C) 2003-2004 Jakub Jermar
     2 * Copyright (C) 2005 Ondrej Palkovsky
    33 * All rights reserved.
    44 *
     
    3030#include <arch/types.h>
    3131#include <arch/cp0.h>
     32#include <arch/console.h>
    3233
    33 #define VIDEORAM        0xB0000000
     34static void (*putchar_func)(const char ch) = NULL;
     35
     36static void cons_putchar(const char ch)
     37{
     38        *((char *) VIDEORAM) = ch;
     39}
     40
     41
     42static void serial_putchar(const char ch)
     43{
     44        int i;
     45
     46        if (ch=='\n')
     47                putchar('\r');
     48
     49        /* Wait until transmit buffer empty */
     50        while (! ((*SERIAL_LSR) & (1<<TRANSMIT_EMPTY_BIT)))
     51                ;
     52        *(SERIAL_PORT_BASE) = ch;
     53}
     54
     55void console_init(void)
     56{
     57        /* The LSR on the start usually contains this value */
     58        if (*SERIAL_LSR == 0x60)
     59                putchar_func = serial_putchar;
     60        else
     61                putchar_func = cons_putchar;
     62}
    3463
    3564void putchar(const char ch)
    3665{
    37 //      __u32 status = cp0_status_read();
    38        
    39 //      cp0_status_write(cp0_status_read() | cp0_status_erl_error_bit);
    40         *((char *) VIDEORAM) = ch;
    41 //      cp0_status_write(status);
     66        putchar_func(ch);
    4267}
  • arch/mips/src/cpu/cpu.c

    rb0edf3b2 r38de8a5  
    3535
    3636#include <typedefs.h>
    37 #include <print.h>
     37#include <print.h>     
    3838
    39 struct {
     39struct data_t {
    4040        char *vendor;
    4141        char *model;
    42 } imp_data[] = {
     42};
     43
     44static struct data_t imp_data[] = {
    4345        { "Invalid", "Invalid" },       /* 0x00 */
    4446        { "MIPS", "R2000" },            /* 0x01 */
     
    7981};
    8082
     83static struct data_t imp_data80[] = {
     84        { "MIPS", "4Kc" },  /* 0x80 */
     85        {"Invalid","Invalid"}, /* 0x81 */
     86        {"Invalid","Invalid"}, /* 0x82 */
     87        {"MIPS","4Km & 4Kp"} /* 0x83 */
     88};
     89
    8190void cpu_arch_init(void)
    8291{
     
    91100void cpu_print_report(cpu_t *m)
    92101{
     102        struct data_t *data;
     103
     104        if (m->arch.imp_num & 0x80) {
     105                data = &imp_data80[m->arch.imp_num & 0x7f];
     106        } else
     107                data = &imp_data[m->arch.imp_num];
     108
    93109        printf("cpu%d: %s %s (rev=%d.%d, imp=%d)\n",
    94                 m->id, imp_data[m->arch.imp_num].vendor, imp_data[m->arch.imp_num].model, m->arch.rev_num >> 4, m->arch.rev_num & 0xf, m->arch.imp_num);
     110                m->id, data->vendor, data->model, m->arch.rev_num >> 4,
     111               m->arch.rev_num & 0xf, m->arch.imp_num);
    95112}
  • arch/mips/src/interrupt.c

    rb0edf3b2 r38de8a5  
    5858}
    5959
    60 
    6160void interrupt(void)
    6261{
     
    8483                                        break;
    8584                                case 7: /* Timer Interrupt */
    86                                         cp0_compare_write(cp0_compare_value); /* clear timer interrupt */
     85                                        cp0_compare_write(cp0_count_read() + cp0_compare_value); /* clear timer interrupt */
    8786                                        /* start counting over again */
    88                                         cp0_count_write(0);
    8987                                        clock();
    9088                                        break;
  • arch/mips/src/mips.c

    rb0edf3b2 r38de8a5  
    3434#include <mm/vm.h>
    3535#include <userspace.h>
     36#include <arch/console.h>
    3637
    3738void arch_pre_mm_init(void)
     
    5152         * Start hardware clock.
    5253         */
    53         cp0_compare_write(cp0_compare_value);
    54         cp0_count_write(0);
     54        cp0_compare_write(cp0_compare_value + cp0_count_read());
     55
     56        console_init();
    5557}
    5658
  • arch/mips/src/mm/tlb.c

    rb0edf3b2 r38de8a5  
    3838void tlb_refill(struct exception_regdump *pstate)
    3939{
    40         panic("tlb_refill exception\n");
     40        char *symbol = "";
     41        char *sym2 = "";
     42
     43        if (THREAD) {
     44                char *s = get_symtab_entry(pstate->epc);
     45                if (s)
     46                        symbol = s;
     47                s = get_symtab_entry(pstate->ra);
     48                if (s)
     49                        sym2 = s;
     50        }
     51        panic("%X: tlb_refill exception at %X(%s<-%s)\n", cp0_badvaddr_read(),
     52              pstate->epc, symbol,sym2);
    4153}
    4254
Note: See TracChangeset for help on using the changeset viewer.