OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [tags/] [gnu-src/] [newlib-1.18.0/] [newlib-1.18.0-or32-1.0rc1/] [libgloss/] [mips/] [pmon.S] - Diff between revs 207 and 345

Only display areas with differences | Details | Blame | View Log

Rev 207 Rev 345
/*
/*
 * pmon.S -- low-level entry points into PMON monitor.
 * pmon.S -- low-level entry points into PMON monitor.
 *
 *
 * Copyright (c) 1996, 1997, 2002 Cygnus Support
 * Copyright (c) 1996, 1997, 2002 Cygnus Support
 *
 *
 * The authors hereby grant permission to use, copy, modify, distribute,
 * The authors hereby grant permission to use, copy, modify, distribute,
 * and license this software and its documentation for any purpose, provided
 * and license this software and its documentation for any purpose, provided
 * that existing copyright notices are retained in all copies and that this
 * that existing copyright notices are retained in all copies and that this
 * notice is included verbatim in any distributions. No written agreement,
 * notice is included verbatim in any distributions. No written agreement,
 * license, or royalty fee is required for any of the authorized uses.
 * license, or royalty fee is required for any of the authorized uses.
 * Modifications to this software may be copyrighted by their authors
 * Modifications to this software may be copyrighted by their authors
 * and need not follow the licensing terms described here, provided that
 * and need not follow the licensing terms described here, provided that
 * the new terms are clearly indicated on the first page of each file where
 * the new terms are clearly indicated on the first page of each file where
 * they apply.
 * they apply.
 */
 */
#ifdef __mips16
#ifdef __mips16
/* This file contains 32 bit assembly code.  */
/* This file contains 32 bit assembly code.  */
        .set nomips16
        .set nomips16
#endif
#endif
#if !defined(__mips64)
#if !defined(__mips64)
  /* This machine does not support 64-bit operations.  */
  /* This machine does not support 64-bit operations.  */
  #define ADDU addu
  #define ADDU addu
  #define SUBU subu
  #define SUBU subu
#else
#else
  /* This machine supports 64-bit operations.  */
  /* This machine supports 64-bit operations.  */
  #define ADDU daddu
  #define ADDU daddu
  #define SUBU dsubu
  #define SUBU dsubu
#endif
#endif
#include "regs.S"
#include "regs.S"
        .text
        .text
        .align  2
        .align  2
#ifdef LSI
#ifdef LSI
  #define PMON_VECTOR 0xffffffffbfc00200
  #define PMON_VECTOR 0xffffffffbfc00200
#else
#else
  #define PMON_VECTOR 0xffffffffbfc00500
  #define PMON_VECTOR 0xffffffffbfc00500
#endif
#endif
#ifndef __mips_eabi
#ifndef __mips_eabi
/* Provide named functions for entry into the monitor: */
/* Provide named functions for entry into the monitor: */
#define INDIRECT(name,index)                            \
#define INDIRECT(name,index)                            \
        .globl  name;                                   \
        .globl  name;                                   \
        .ent    name;                                   \
        .ent    name;                                   \
        .set    noreorder;                              \
        .set    noreorder;                              \
name:   la      $2,+(PMON_VECTOR+((index)*4));          \
name:   la      $2,+(PMON_VECTOR+((index)*4));          \
        lw      $2,0($2);                               \
        lw      $2,0($2);                               \
        j       $2;                                     \
        j       $2;                                     \
        nop;                                            \
        nop;                                            \
        .set    reorder;                                \
        .set    reorder;                                \
        .end    name
        .end    name
#else
#else
#define INDIRECT(name,index)                            \
#define INDIRECT(name,index)                            \
        .globl  name;                                   \
        .globl  name;                                   \
        .ent    name;                                   \
        .ent    name;                                   \
        .set    noreorder;                              \
        .set    noreorder;                              \
name:   la      $2,+(PMON_VECTOR+((index)*4));          \
name:   la      $2,+(PMON_VECTOR+((index)*4));          \
        lw      $2,0($2);                               \
        lw      $2,0($2);                               \
        SUBU    sp,sp,0x40;                             \
        SUBU    sp,sp,0x40;                             \
        sd      ra,0x38(sp);                            \
        sd      ra,0x38(sp);                            \
        sd      fp,0x30(sp);                            \
        sd      fp,0x30(sp);                            \
        jal     $2;                                     \
        jal     $2;                                     \
        move    fp,sp;                                  \
        move    fp,sp;                                  \
        ld      ra,0x38(sp);                            \
        ld      ra,0x38(sp);                            \
        ld      fp,0x30(sp);                            \
        ld      fp,0x30(sp);                            \
        j       ra;                                     \
        j       ra;                                     \
        ADDU    sp,sp,0x40;                             \
        ADDU    sp,sp,0x40;                             \
        .set    reorder;                                \
        .set    reorder;                                \
        .end    name
        .end    name
#endif
#endif
/* The following magic numbers are for the slots into the PMON monitor */
/* The following magic numbers are for the slots into the PMON monitor */
/* The first are used as the lo-level library run-time: */
/* The first are used as the lo-level library run-time: */
INDIRECT(read,0)
INDIRECT(read,0)
INDIRECT(write,1)
INDIRECT(write,1)
INDIRECT(open,2)
INDIRECT(open,2)
INDIRECT(close,3)
INDIRECT(close,3)
/* The following are useful monitor routines: */
/* The following are useful monitor routines: */
INDIRECT(mon_ioctl,4)
INDIRECT(mon_ioctl,4)
INDIRECT(mon_printf,5)
INDIRECT(mon_printf,5)
INDIRECT(mon_vsprintf,6)
INDIRECT(mon_vsprintf,6)
INDIRECT(mon_ttctl,7)
INDIRECT(mon_ttctl,7)
INDIRECT(mon_cliexit,8)
INDIRECT(mon_cliexit,8)
INDIRECT(mon_getenv,9)
INDIRECT(mon_getenv,9)
INDIRECT(mon_onintr,10)
INDIRECT(mon_onintr,10)
INDIRECT(mon_flush_cache,11)
INDIRECT(mon_flush_cache,11)
INDIRECT(_flush_cache,11)
INDIRECT(_flush_cache,11)
INDIRECT(mon_exception,12)
INDIRECT(mon_exception,12)
/* The following routine is required by the "print()" function: */
/* The following routine is required by the "print()" function: */
        .globl  outbyte
        .globl  outbyte
        .ent    outbyte
        .ent    outbyte
        .set    noreorder
        .set    noreorder
outbyte:
outbyte:
        subu    sp,sp,0x20      /* allocate stack space for string */
        subu    sp,sp,0x20      /* allocate stack space for string */
        sd      ra,0x18(sp)     /* stack return address */
        sd      ra,0x18(sp)     /* stack return address */
        sd      fp,0x10(sp)     /* stack frame-pointer */
        sd      fp,0x10(sp)     /* stack frame-pointer */
        move    fp,sp           /* take a copy of the stack pointer */
        move    fp,sp           /* take a copy of the stack pointer */
        /* We leave so much space on the stack for the string (16
        /* We leave so much space on the stack for the string (16
           characters), since the call to mon_printf seems to corrupt
           characters), since the call to mon_printf seems to corrupt
           the 8bytes at offset 8 into the string/stack. */
           the 8bytes at offset 8 into the string/stack. */
        sb      a0,0x00(sp)     /* character to print */
        sb      a0,0x00(sp)     /* character to print */
        sb      z0,0x01(sp)     /* NUL terminator */
        sb      z0,0x01(sp)     /* NUL terminator */
        jal     mon_printf      /* and output the string */
        jal     mon_printf      /* and output the string */
        move    a0,sp           /* take a copy of the string pointer {DELAY SLOT} */
        move    a0,sp           /* take a copy of the string pointer {DELAY SLOT} */
        move    sp,fp           /* recover stack pointer */
        move    sp,fp           /* recover stack pointer */
        ld      ra,0x18(sp)     /* recover return address */
        ld      ra,0x18(sp)     /* recover return address */
        ld      fp,0x10(sp)     /* recover frame-pointer */
        ld      fp,0x10(sp)     /* recover frame-pointer */
        j       ra              /* return to the caller */
        j       ra              /* return to the caller */
        addu    sp,sp,0x20      /* dump the stack space {DELAY SLOT} */
        addu    sp,sp,0x20      /* dump the stack space {DELAY SLOT} */
        .set    reorder
        .set    reorder
        .end    outbyte
        .end    outbyte
/* The following routine is required by the "sbrk()" function: */
/* The following routine is required by the "sbrk()" function: */
        .globl  get_mem_info
        .globl  get_mem_info
        .ent    get_mem_info
        .ent    get_mem_info
        .set    noreorder
        .set    noreorder
get_mem_info:
get_mem_info:
        # in:  a0 = pointer to 3 word structure
        # in:  a0 = pointer to 3 word structure
        # out: void
        # out: void
        subu    sp,sp,0x18      /* create some stack space */
        subu    sp,sp,0x18      /* create some stack space */
        sd      ra,0x00(sp)     /* stack return address */
        sd      ra,0x00(sp)     /* stack return address */
        sd      fp,0x08(sp)     /* stack frame-pointer */
        sd      fp,0x08(sp)     /* stack frame-pointer */
        sd      a0,0x10(sp)     /* stack structure pointer */
        sd      a0,0x10(sp)     /* stack structure pointer */
        move    fp,sp           /* take a copy of the stack pointer */
        move    fp,sp           /* take a copy of the stack pointer */
        # The monitor has already sized memory, but unfortunately we
        # The monitor has already sized memory, but unfortunately we
        # do not have access to the data location containing the
        # do not have access to the data location containing the
        # memory size.
        # memory size.
        jal     __sizemem
        jal     __sizemem
        nop
        nop
        ld      a0,0x10(sp)     # recover structure pointer
        ld      a0,0x10(sp)     # recover structure pointer
        sw      v0,0(a0)        # amount of memory available
        sw      v0,0(a0)        # amount of memory available
        # Deal with getting the cache size information:
        # Deal with getting the cache size information:
        mfc0    a1, C0_CONFIG
        mfc0    a1, C0_CONFIG
        nop
        nop
        nop
        nop
        andi    a2,a1,0x7 << 9  # bits 11..9 for instruction cache size
        andi    a2,a1,0x7 << 9  # bits 11..9 for instruction cache size
        sll     a2,a2,12 - 8
        sll     a2,a2,12 - 8
        sw      a2,4(a0)
        sw      a2,4(a0)
        andi    a2,a1,0x7 << 6  # bits 8..6 for data cache size
        andi    a2,a1,0x7 << 6  # bits 8..6 for data cache size
        sll     a2,a2,12 - 5
        sll     a2,a2,12 - 5
        sw      a2,8(a0)        # data cache size
        sw      a2,8(a0)        # data cache size
        #
        #
        move    sp,fp           /* recover stack pointer */
        move    sp,fp           /* recover stack pointer */
        ld      ra,0x00(sp)     /* recover return address */
        ld      ra,0x00(sp)     /* recover return address */
        ld      fp,0x08(sp)     /* recover frame-pointer */
        ld      fp,0x08(sp)     /* recover frame-pointer */
        j       ra              /* return to the caller */
        j       ra              /* return to the caller */
        addu    sp,sp,0x18      /* restore stack pointer {DELAY SLOT} */
        addu    sp,sp,0x18      /* restore stack pointer {DELAY SLOT} */
        .set    reorder
        .set    reorder
        .end    get_mem_info
        .end    get_mem_info
#ifdef LSI
#ifdef LSI
# For the LSI MiniRISC board, we can safely assume that we have
# For the LSI MiniRISC board, we can safely assume that we have
# at least one megabyte of RAM.
# at least one megabyte of RAM.
        .globl  __sizemem
        .globl  __sizemem
        .ent    __sizemem
        .ent    __sizemem
__sizemem:
__sizemem:
        li      v0,0x100000
        li      v0,0x100000
        j       ra
        j       ra
        .end    __sizemem
        .end    __sizemem
#else
#else
#endif
#endif
/* EOF pmon.S */
/* EOF pmon.S */
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.