Changeset c693a3a in rtems


Ignore:
Timestamp:
Aug 11, 2017, 8:44:04 AM (2 years ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
master
Children:
95a4b1f
Parents:
c8aeb76
git-author:
Sebastian Huber <sebastian.huber@…> (08/11/17 08:44:04)
git-committer:
Sebastian Huber <sebastian.huber@…> (08/22/17 14:27:03)
Message:

powerpc: PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE

In 64-bit mode, the linker must have the ability to restore the TOC
pointer after an external function call.

Update #3082.

Files:
5 edited

Legend:

Unmodified
Added
Removed
  • c/src/lib/libbsp/powerpc/qoriq/start/start.S

    rc8aeb76 rc693a3a  
    6868        LA      r4, bsp_section_fast_text_size
    6969        bl      rtems_cache_flush_multiple_data_lines
     70        PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    7071
    7172        /* Copy read-only data */
     
    7879        mr      r3, FDT_REGISTER
    7980        bl      bsp_fdt_copy
     81        PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    8082
    8183        /* Flush read-only data */
     
    8385        LA      r4, bsp_section_rodata_size
    8486        bl      rtems_cache_flush_multiple_data_lines
     87        PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    8588
    8689        /* Copy fast data */
     
    117120        LA      r4, bsp_section_sbss_size
    118121        bl      bsp_start_zero
     122        PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    119123
    120124        /* Clear BSS */
     
    122126        LA      r4, bsp_section_bss_size
    123127        bl      bsp_start_zero
     128        PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    124129
    125130#ifndef __powerpc64__
     
    132137
    133138        bl      boot_card
     139        PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    134140
    135141.Lcopy:
     
    137143        beqlr
    138144        b       memcpy
     145        PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    139146
    140147.Linitearly:
     
    197204        li      r3, 1
    198205        bl      qoriq_tlb1_invalidate_all_by_ts
     206        PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    199207
    200208        /* Add TS1 entry for the first 4GiB of RAM */
     
    207215        li      r9, 11
    208216        bl      qoriq_tlb1_write
     217        PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    209218
    210219        /* MSR initialization and use TS1 for address translation */
     
    238247        li      r5, SCRATCH_TLB
    239248        bl      qoriq_mmu_config
     249        PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    240250        mtmsr   INITIAL_MSR
    241251        isync
    242252        li      r3, SCRATCH_TLB
    243253        bl      qoriq_tlb1_invalidate
     254        PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    244255
    245256        mtlr    SAVED_LINK_REGISTER
     
    315326
    316327        b       qoriq_start_thread
     328        PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    317329#endif
    318330_start_secondary_processor:
     
    326338        bl      .Linitmmu
    327339        b       bsp_start_on_secondary_processor
     340        PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    328341#endif /* RTEMS_SMP */
     342
     343#ifdef __powerpc64__
     344#define START_NOP_FOR_LINKER_TOC_POINTER_RESTORE nop; nop; nop; nop
     345#else
     346#define START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
     347#endif
    329348
    330349        /* Exception vector prologues area */
     
    337356        li      r3, 0
    338357        b       ppc_exc_fatal_critical
     358        START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    339359        /* Machine check */
    340360        PPC_REG_STORE_UPDATE    r1, -EXC_GENERIC_SIZE(r1)
     
    342362        li      r3, 1
    343363        b       ppc_exc_fatal_machine_check
     364        START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    344365        /* Data storage */
    345366        PPC_REG_STORE_UPDATE    r1, -EXC_GENERIC_SIZE(r1)
     
    347368        li      r3, 2
    348369        b       ppc_exc_fatal_normal
     370        START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    349371        /* Instruction storage */
    350372        PPC_REG_STORE_UPDATE    r1, -EXC_GENERIC_SIZE(r1)
     
    352374        li      r3, 3
    353375        b       ppc_exc_fatal_normal
     376        START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    354377        /* External input */
    355378        PPC_REG_STORE_UPDATE    r1, -PPC_EXC_INTERRUPT_FRAME_SIZE(r1)
     
    357380        nop
    358381        nop
     382        START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    359383        /* Alignment */
    360384        PPC_REG_STORE_UPDATE    r1, -EXC_GENERIC_SIZE(r1)
     
    362386        li      r3, 5
    363387        b       ppc_exc_fatal_normal
     388        START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    364389        /* Program */
    365390        PPC_REG_STORE_UPDATE    r1, -EXC_GENERIC_SIZE(r1)
     
    367392        li      r3, 6
    368393        b       ppc_exc_fatal_normal
     394        START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    369395#ifdef __PPC_CPU_E6500__
    370396        /* Floating-point unavailable */
     
    373399        li      r3, 7
    374400        b       ppc_exc_fatal_normal
     401        START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    375402#endif
    376403        /* System call */
     
    379406        li      r3, 8
    380407        b       ppc_exc_fatal_normal
     408        START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    381409#ifdef __PPC_CPU_E6500__
    382410        /* APU unavailable */
     
    385413        li      r3, 9
    386414        b       ppc_exc_fatal_normal
     415        START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    387416#endif
    388417        /* Decrementer */
     
    391420        li      r3, 10
    392421        b       ppc_exc_fatal_normal
     422        START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    393423        /* Fixed-interval timer interrupt */
    394424        PPC_REG_STORE_UPDATE    r1, -EXC_GENERIC_SIZE(r1)
     
    396426        li      r3, 11
    397427        b       ppc_exc_fatal_normal
     428        START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    398429        /* Watchdog timer interrupt */
    399430        PPC_REG_STORE_UPDATE    r1, -EXC_GENERIC_SIZE(r1)
     
    401432        li      r3, 12
    402433        b       ppc_exc_fatal_critical
     434        START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    403435        /* Data TLB error */
    404436        PPC_REG_STORE_UPDATE    r1, -EXC_GENERIC_SIZE(r1)
     
    406438        li      r3, 13
    407439        b       ppc_exc_fatal_normal
     440        START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    408441        /* Instruction TLB error */
    409442        PPC_REG_STORE_UPDATE    r1, -EXC_GENERIC_SIZE(r1)
     
    411444        li      r3, 14
    412445        b       ppc_exc_fatal_normal
     446        START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    413447        /* Debug */
    414448        PPC_REG_STORE_UPDATE    r1, -EXC_GENERIC_SIZE(r1)
     
    416450        li      r3, 15
    417451        b       ppc_exc_fatal_debug
     452        START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    418453        /* SPE APU unavailable or AltiVec unavailable */
    419454        PPC_REG_STORE_UPDATE    r1, -EXC_GENERIC_SIZE(r1)
     
    421456        li      r3, 32
    422457        b       ppc_exc_fatal_normal
     458        START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    423459        /* SPE floating-point data exception or AltiVec assist */
    424460        PPC_REG_STORE_UPDATE    r1, -EXC_GENERIC_SIZE(r1)
     
    426462        li      r3, 33
    427463        b       ppc_exc_fatal_normal
     464        START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    428465#ifndef __PPC_CPU_E6500__
    429466        /* SPE floating-point round exception */
     
    432469        li      r3, 34
    433470        b       ppc_exc_fatal_normal
     471        START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    434472#endif
    435473        /* Performance monitor */
     
    438476        li      r3, 35
    439477        b       ppc_exc_fatal_normal
     478        START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    440479#ifdef __PPC_CPU_E6500__
    441480        /* Processor doorbell interrupt */
     
    444483        li      r3, 36
    445484        b       ppc_exc_fatal_normal
     485        START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    446486        /* Processor doorbell critical interrupt */
    447487        PPC_REG_STORE_UPDATE    r1, -EXC_GENERIC_SIZE(r1)
     
    449489        li      r3, 37
    450490        b       ppc_exc_fatal_critical
     491        START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    451492        /* Guest processor doorbell */
    452493        PPC_REG_STORE_UPDATE    r1, -EXC_GENERIC_SIZE(r1)
     
    454495        li      r3, 38
    455496        b       ppc_exc_fatal_normal
     497        START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    456498        /* Guest processor doorbell critical and machine check */
    457499        PPC_REG_STORE_UPDATE    r1, -EXC_GENERIC_SIZE(r1)
     
    459501        li      r3, 39
    460502        b       ppc_exc_fatal_critical
     503        START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    461504        /* Hypervisor system call */
    462505        PPC_REG_STORE_UPDATE    r1, -EXC_GENERIC_SIZE(r1)
     
    464507        li      r3, 40
    465508        b       ppc_exc_fatal_normal
     509        START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    466510        /* Hypervisor privilege */
    467511        PPC_REG_STORE_UPDATE    r1, -EXC_GENERIC_SIZE(r1)
     
    469513        li      r3, 41
    470514        b       ppc_exc_fatal_normal
     515        START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    471516        /* LRAT error */
    472517        PPC_REG_STORE_UPDATE    r1, -EXC_GENERIC_SIZE(r1)
     
    474519        li      r3, 42
    475520        b       ppc_exc_fatal_normal
     521        START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    476522#endif
    477523
  • c/src/lib/libbsp/powerpc/qoriq/startup/bspstart.c

    rc8aeb76 rc693a3a  
    114114  __asm__ volatile ("mtivpr %0" : : "r" (base))
    115115
     116#ifdef __powerpc64__
     117#define VECTOR_TABLE_ENTRY_SIZE 32
     118#else
     119#define VECTOR_TABLE_ENTRY_SIZE 16
     120#endif
     121
    116122#define MTIVOR(vec, offset) \
    117123  do { \
    118124    __asm__ volatile ("mtspr " RTEMS_XSTRING(vec) ", %0" : : "r" (offset)); \
    119     offset += 16; \
     125    offset += VECTOR_TABLE_ENTRY_SIZE; \
    120126  } while (0)
    121127
  • c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/ppc_exc_async_normal.S

    rc8aeb76 rc693a3a  
    279279        /* Call fixed high level handler */
    280280        bl      bsp_interrupt_dispatch
     281        PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    281282#endif /* PPC_EXC_CONFIG_USE_FIXED_HANDLER */
    282283
     
    288289        GET_TIME_BASE   r5
    289290        bl      _Profiling_Outer_most_interrupt_entry_and_exit
     291        PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    290292.Lprofiling_done:
    291293#endif /* RTEMS_PROFILING */
     
    335337        ori     r4, r4, MSR_EE
    336338        bl      _Thread_Do_dispatch
     339        PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE
    337340
    338341        /* Disable interrupts */
  • c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/ppc_exc_fatal.S

    rc8aeb76 rc693a3a  
    227227        addi    r4, r1, FRAME_LINK_SPACE
    228228        b       _Terminate
     229        PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE
  • cpukit/score/cpu/powerpc/rtems/asm.h

    rc8aeb76 rc693a3a  
    302302#endif
    303303
    304 
    305 #endif
     304#if defined(__powerpc64__)
     305#define PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE nop
     306#else
     307#define PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE
     308#endif
     309
     310#endif
Note: See TracChangeset for help on using the changeset viewer.