diff options
author | Chris Johns <chrisj@rtems.org> | 2016-11-03 16:58:08 +1100 |
---|---|---|
committer | Chris Johns <chrisj@rtems.org> | 2016-11-03 16:58:08 +1100 |
commit | 72a62ad88f82fe1ffee50024db4dd0f3fa5806f7 (patch) | |
tree | 6b0e527e67141f8126ba56b8a3c1eb90aeed5849 /cpu_supplement/m68xxx_and_coldfire.rst | |
parent | waf: Use separate doctrees so avoid sphinx clashes. (diff) | |
download | rtems-docs-72a62ad88f82fe1ffee50024db4dd0f3fa5806f7.tar.bz2 |
Rename all manuals with an _ to have a -. It helps released naming of files.
Diffstat (limited to 'cpu_supplement/m68xxx_and_coldfire.rst')
-rw-r--r-- | cpu_supplement/m68xxx_and_coldfire.rst | 356 |
1 files changed, 0 insertions, 356 deletions
diff --git a/cpu_supplement/m68xxx_and_coldfire.rst b/cpu_supplement/m68xxx_and_coldfire.rst deleted file mode 100644 index d448276..0000000 --- a/cpu_supplement/m68xxx_and_coldfire.rst +++ /dev/null @@ -1,356 +0,0 @@ -.. comment SPDX-License-Identifier: CC-BY-SA-4.0 - -.. COMMENT: Copyright (c) 2014 embedded brains GmbH. All rights reserved. - -M68xxx and Coldfire Specific Information -######################################## - -This chapter discusses the Freescale (formerly Motorola) MC68xxx and Coldfire -architectural dependencies. The MC68xxx family has a wide variety of CPU -models within it based upon different CPU core implementations. Ignoring the -Coldfire parts, the part numbers for these models are generally divided into -MC680xx and MC683xx. The MC680xx models are more general purpose processors -with no integrated peripherals. The MC683xx models, on the other hand, are -more specialized and have a variety of peripherals on chip including -sophisticated timers and serial communications controllers. - -**Architecture Documents** - -For information on the MC68xxx and Coldfire architecture, refer to the -following documents available from Freescale website -(http//www.freescale.com/): - -- *M68000 Family Reference, Motorola, FR68K/D*. - -- *MC68020 User's Manual, Motorola, MC68020UM/AD*. - -- *MC68881/MC68882 Floating-Point Coprocessor User's Manual, - Motorola, MC68881UM/AD*. - -CPU Model Dependent Features -============================ - -This section presents the set of features which vary across m68k/Coldfire -implementations that are of importance to RTEMS. The set of CPU model feature -macros are defined in the file :file:`cpukit/score/cpu/m68k/m68k.h` based upon -the particular CPU model selected on the compilation command line. - -BFFFO Instruction ------------------ - -The macro ``M68K_HAS_BFFFO`` is set to 1 to indicate that this CPU model has -the bfffo instruction. - -Vector Base Register --------------------- - -The macro ``M68K_HAS_VBR`` is set to 1 to indicate that this CPU model has a -vector base register (vbr). - -Separate Stacks ---------------- - -The macro ``M68K_HAS_SEPARATE_STACKS`` is set to 1 to indicate that this CPU -model has separate interrupt, user, and supervisor mode stacks. - -Pre-Indexing Address Mode -------------------------- - -The macro ``M68K_HAS_PREINDEXING`` is set to 1 to indicate that this CPU model -has the pre-indexing address mode. - -Extend Byte to Long Instruction -------------------------------- - -The macro ``M68K_HAS_EXTB_L`` is set to 1 to indicate that this CPU model has -the extb.l instruction. This instruction is supposed to be available in all -models based on the cpu32 core as well as mc68020 and up models. - -Calling Conventions -=================== - -The MC68xxx architecture supports a simple yet effective call and return -mechanism. A subroutine is invoked via the branch to subroutine (``bsr``) or -the jump to subroutine (``jsr``) instructions. These instructions push the -return address on the current stack. The return from subroutine (``rts``) -instruction pops the return address off the current stack and transfers control -to that instruction. It is is important to note that the MC68xxx call and -return mechanism does not automatically save or restore any registers. It is -the responsibility of the high-level language compiler to define the register -preservation and usage convention. - -Calling Mechanism ------------------ - -All RTEMS directives are invoked using either a ``bsr`` or ``jsr`` instruction -and return to the user application via the rts instruction. - -Register Usage --------------- - -As discussed above, the ``bsr`` and ``jsr`` instructions do not automatically -save any registers. RTEMS uses the registers D0, D1, A0, and A1 as scratch -registers. These registers are not preserved by RTEMS directives therefore, -the contents of these registers should not be assumed upon return from any -RTEMS directive. - -Parameter Passing ------------------ - -RTEMS assumes that arguments are placed on the current stack before the -directive is invoked via the bsr or jsr instruction. The first argument is -assumed to be closest to the return address on the stack. This means that the -first argument of the C calling sequence is pushed last. The following -pseudo-code illustrates the typical sequence used to call a RTEMS directive -with three (3) arguments: - -.. code-block:: c - - push third argument - push second argument - push first argument - invoke directive - remove arguments from the stack - -The arguments to RTEMS are typically pushed onto the stack using a move -instruction with a pre-decremented stack pointer as the destination. These -arguments must be removed from the stack after control is returned to the -caller. This removal is typically accomplished by adding the size of the -argument list in bytes to the current stack pointer. - -Memory Model -============ - -The MC68xxx family supports a flat 32-bit address space with addresses ranging -from 0x00000000 to 0xFFFFFFFF (4 gigabytes). Each address is represented by a -32-bit value and is byte addressable. The address may be used to reference a -single byte, word (2-bytes), or long word (4 bytes). Memory accesses within -this address space are performed in big endian fashion by the processors in -this family. - -Some of the MC68xxx family members such as the MC68020, MC68030, and MC68040 -support virtual memory and segmentation. The MC68020 requires external -hardware support such as the MC68851 Paged Memory Management Unit coprocessor -which is typically used to perform address translations for these systems. -RTEMS does not support virtual memory or segmentation on any of the MC68xxx -family members. - -Interrupt Processing -==================== - -Discussed in this section are the MC68xxx's interrupt response and control -mechanisms as they pertain to RTEMS. - -Vectoring of an Interrupt Handler ---------------------------------- - -Depending on whether or not the particular CPU supports a separate interrupt -stack, the MC68xxx family has two different interrupt handling models. - -Models Without Separate Interrupt Stacks -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Upon receipt of an interrupt the MC68xxx family members without separate -interrupt stacks automatically use software to switch stacks. - -Models With Separate Interrupt Stacks -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Upon receipt of an interrupt the MC68xxx family members with separate interrupt -stacks automatically perform the following actions: - -- saves the current status register (SR), - -- clears the master/interrupt (M) bit of the SR to indicate the switch from - master state to interrupt state, - -- sets the privilege mode to supervisor, - -- suppresses tracing, - -- sets the interrupt mask level equal to the level of the interrupt being - serviced, - -- pushes an interrupt stack frame (ISF), which includes the program counter - (PC), the status register (SR), and the format/exception vector offset (FVO) - word, onto the supervisor and interrupt stacks, - -- switches the current stack to the interrupt stack and vectors to an interrupt - service routine (ISR). If the ISR was installed with the interrupt_catch - directive, then the RTEMS interrupt handler will begin execution. The RTEMS - interrupt handler saves all registers which are not preserved according to - the calling conventions and invokes the application's ISR. - -A nested interrupt is processed similarly by these CPU models with the -exception that only a single ISF is placed on the interrupt stack and the -current stack need not be switched. - -The FVO word in the Interrupt Stack Frame is examined by RTEMS to determine -when an outer most interrupt is being exited. Since the FVO is used by RTEMS -for this purpose, the user application code MUST NOT modify this field. - -The following shows the Interrupt Stack Frame for MC68xxx CPU models with -separate interrupt stacks: - -+----------------------+-----+ -| Status Register | 0x0 | -+----------------------+-----+ -| Program Counter High | 0x2 | -+----------------------+-----+ -| Program Counter Low | 0x4 | -+----------------------+-----+ -| Format/Vector Offset | 0x6 | -+----------------------+-----+ - - -CPU Models Without VBR and RAM at 0 ------------------------------------ - -This is from a post by Zoltan Kocsi <zoltan@bendor.com.au> and is a nice trick -in certain situations. In his words: - -I think somebody on this list asked about the interupt vector handling w/o VBR -and RAM at 0. The usual trick is to initialise the vector table (except the -first 2 two entries, of course) to point to the same location BUT you also add -the vector number times 0x1000000 to them. That is, bits 31-24 contain the -vector number and 23-0 the address of the common handler. Since the PC is 32 -bit wide but the actual address bus is only 24, the top byte will be in the PC -but will be ignored when jumping onto your routine. - -Then your common interrupt routine gets this info by loading the PC into some -register and based on that info, you can jump to a vector in a vector table -pointed by a virtual VBR: - -.. code-block:: c - - // - // Real vector table at 0 - // - .long initial_sp - .long initial_pc - .long myhandler+0x02000000 - .long myhandler+0x03000000 - .long myhandler+0x04000000 - ... - .long myhandler+0xff000000 - // - // This handler will jump to the interrupt routine of which - // the address is stored at VBR[ vector_no ] - // The registers and stackframe will be intact, the interrupt - // routine will see exactly what it would see if it was called - // directly from the HW vector table at 0. - // - .comm VBR,4,2 // This defines the 'virtual' VBR - // From C: extern void *VBR; - myhandler: // At entry, PC contains the full vector - move.l %d0,-(%sp) // Save d0 - move.l %a0,-(%sp) // Save a0 - lea 0(%pc),%a0 // Get the value of the PC - move.l %a0,%d0 // Copy it to a data reg, d0 is VV?????? - swap %d0 // Now d0 is ????VV?? - and.w #0xff00,%d0 // Now d0 is ????VV00 (1) - lsr.w #6,%d0 // Now d0.w contains the VBR table offset - move.l VBR,%a0 // Get the address from VBR to a0 - move.l (%a0,%d0.w),%a0 // Fetch the vector - move.l 4(%sp),%d0 // Restore d0 - move.l %a0,4(%sp) // Place target address to the stack - move.l (%sp)+,%a0 // Restore a0, target address is on TOS - ret // This will jump to the handler and - // restore the stack - -(1) If 'myhandler' is guaranteed to be in the first 64K, e.g. just - after the vector table then that insn is not needed. - -There are probably shorter ways to do this, but it I believe is enough to -illustrate the trick. Optimisation is left as an exercise to the reader :-) - -Interrupt Levels ----------------- - -Eight levels (0-7) of interrupt priorities are supported by MC68xxx family -members with level seven (7) being the highest priority. Level zero (0) -indicates that interrupts are fully enabled. Interrupt requests for interrupts -with priorities less than or equal to the current interrupt mask level are -ignored. - -Although RTEMS supports 256 interrupt levels, the MC68xxx family only supports -eight. RTEMS interrupt levels 0 through 7 directly correspond to MC68xxx -interrupt levels. All other RTEMS interrupt levels are undefined and their -behavior is unpredictable. - -Default Fatal Error Processing -============================== - -The default fatal error handler for this architecture disables processor -interrupts to level 7, places the error code in D0, and executes a ``stop`` -instruction to simulate a halt processor instruction. - -Symmetric Multiprocessing -========================= - -SMP is not supported. - -Thread-Local Storage -==================== - -Thread-local storage is supported. - -Board Support Packages -====================== - -System Reset ------------- - -An RTEMS based application is initiated or re-initiated when the MC68020 -processor is reset. When the MC68020 is reset, the processor performs the -following actions: - -- The tracing bits of the status register are cleared to disable tracing. - -- The supervisor interrupt state is entered by setting the supervisor (S) bit - and clearing the master/interrupt (M) bit of the status register. - -- The interrupt mask of the status register is set to level 7 to effectively - disable all maskable interrupts. - -- The vector base register (VBR) is set to zero. - -- The cache control register (CACR) is set to zero to disable and freeze the - processor cache. - -- The interrupt stack pointer (ISP) is set to the value stored at vector 0 - (bytes 0-3) of the exception vector table (EVT). - -- The program counter (PC) is set to the value stored at vector 1 (bytes 4-7) - of the EVT. - -- The processor begins execution at the address stored in the PC. - -Processor Initialization ------------------------- - -The address of the application's initialization code should be stored in the -first vector of the EVT which will allow the immediate vectoring to the -application code. If the application requires that the VBR be some value -besides zero, then it should be set to the required value at this point. All -tasks share the same MC68020's VBR value. Because interrupts are enabled -automatically by RTEMS as part of the context switch to the first task, the VBR -MUST be set by either RTEMS of the BSP before this occurs ensure correct -interrupt vectoring. If processor caching is to be utilized, then it should be -enabled during the reset application initialization code. - -In addition to the requirements described in the Board Support Packages chapter -of the Applications User's Manual for the reset code which is executed before -the call to initialize executive, the MC68020 version has the following -specific requirements: - -- Must leave the S bit of the status register set so that the MC68020 remains - in the supervisor state. - -- Must set the M bit of the status register to remove the MC68020 from the - interrupt state. - -- Must set the master stack pointer (MSP) such that a minimum stack size of - MINIMUM_STACK_SIZE bytes is provided for the initialize executive directive. - -- Must initialize the MC68020's vector table. |