linux/arch/frv/kernel/entry.S
<<
>>
Prefs
   1/* entry.S: FR-V entry
   2 *
   3 * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved.
   4 * Written by David Howells (dhowells@redhat.com)
   5 *
   6 * This program is free software; you can redistribute it and/or
   7 * modify it under the terms of the GNU General Public License
   8 * as published by the Free Software Foundation; either version
   9 * 2 of the License, or (at your option) any later version.
  10 *
  11 *
  12 * Entry to the kernel is "interesting":
  13 *  (1) There are no stack pointers, not even for the kernel
  14 *  (2) General Registers should not be clobbered
  15 *  (3) There are no kernel-only data registers
  16 *  (4) Since all addressing modes are wrt to a General Register, no global
  17 *      variables can be reached
  18 *
  19 * We deal with this by declaring that we shall kill GR28 on entering the
  20 * kernel from userspace
  21 *
  22 * However, since break interrupts can interrupt the CPU even when PSR.ET==0,
  23 * they can't rely on GR28 to be anything useful, and so need to clobber a
  24 * separate register (GR31). Break interrupts are managed in break.S
  25 *
  26 * GR29 _is_ saved, and holds the current task pointer globally
  27 *
  28 */
  29
  30#include <linux/linkage.h>
  31#include <asm/thread_info.h>
  32#include <asm/setup.h>
  33#include <asm/segment.h>
  34#include <asm/ptrace.h>
  35#include <asm/errno.h>
  36#include <asm/cache.h>
  37#include <asm/spr-regs.h>
  38
  39#define nr_syscalls ((syscall_table_size)/4)
  40
  41        .section        .text..entry
  42        .balign         4
  43
  44.macro LEDS val
  45#       sethi.p         %hi(0xe1200004),gr30
  46#       setlo           %lo(0xe1200004),gr30
  47#       setlos          #~\val,gr31
  48#       st              gr31,@(gr30,gr0)
  49#       sethi.p         %hi(0xffc00100),gr30
  50#       setlo           %lo(0xffc00100),gr30
  51#       sth             gr0,@(gr30,gr0)
  52#       membar
  53.endm
  54
  55.macro LEDS32
  56#       not             gr31,gr31
  57#       sethi.p         %hi(0xe1200004),gr30
  58#       setlo           %lo(0xe1200004),gr30
  59#       st.p            gr31,@(gr30,gr0)
  60#       srli            gr31,#16,gr31
  61#       sethi.p         %hi(0xffc00100),gr30
  62#       setlo           %lo(0xffc00100),gr30
  63#       sth             gr31,@(gr30,gr0)
  64#       membar
  65.endm
  66
  67###############################################################################
  68#
  69# entry point for External interrupts received whilst executing userspace code
  70#
  71###############################################################################
  72        .globl          __entry_uspace_external_interrupt
  73        .type           __entry_uspace_external_interrupt,@function
  74__entry_uspace_external_interrupt:
  75        LEDS            0x6200
  76        sethi.p         %hi(__kernel_frame0_ptr),gr28
  77        setlo           %lo(__kernel_frame0_ptr),gr28
  78        ldi             @(gr28,#0),gr28
  79
  80        # handle h/w single-step through exceptions
  81        sti             gr0,@(gr28,#REG__STATUS)
  82
  83        .globl          __entry_uspace_external_interrupt_reentry
  84__entry_uspace_external_interrupt_reentry:
  85        LEDS            0x6201
  86
  87        setlos          #REG__END,gr30
  88        dcpl            gr28,gr30,#0
  89
  90        # finish building the exception frame
  91        sti             sp,  @(gr28,#REG_SP)
  92        stdi            gr2, @(gr28,#REG_GR(2))
  93        stdi            gr4, @(gr28,#REG_GR(4))
  94        stdi            gr6, @(gr28,#REG_GR(6))
  95        stdi            gr8, @(gr28,#REG_GR(8))
  96        stdi            gr10,@(gr28,#REG_GR(10))
  97        stdi            gr12,@(gr28,#REG_GR(12))
  98        stdi            gr14,@(gr28,#REG_GR(14))
  99        stdi            gr16,@(gr28,#REG_GR(16))
 100        stdi            gr18,@(gr28,#REG_GR(18))
 101        stdi            gr20,@(gr28,#REG_GR(20))
 102        stdi            gr22,@(gr28,#REG_GR(22))
 103        stdi            gr24,@(gr28,#REG_GR(24))
 104        stdi            gr26,@(gr28,#REG_GR(26))
 105        sti             gr0, @(gr28,#REG_GR(28))
 106        sti             gr29,@(gr28,#REG_GR(29))
 107        stdi.p          gr30,@(gr28,#REG_GR(30))
 108
 109        # set up the kernel stack pointer
 110        ori             gr28,0,sp
 111
 112        movsg           tbr ,gr20
 113        movsg           psr ,gr22
 114        movsg           pcsr,gr21
 115        movsg           isr ,gr23
 116        movsg           ccr ,gr24
 117        movsg           cccr,gr25
 118        movsg           lr  ,gr26
 119        movsg           lcr ,gr27
 120
 121        setlos.p        #-1,gr4
 122        andi            gr22,#PSR_PS,gr5                /* try to rebuild original PSR value */
 123        andi.p          gr22,#~(PSR_PS|PSR_S),gr6
 124        slli            gr5,#1,gr5
 125        or              gr6,gr5,gr5
 126        andi            gr5,#~PSR_ET,gr5
 127
 128        sti             gr20,@(gr28,#REG_TBR)
 129        sti             gr21,@(gr28,#REG_PC)
 130        sti             gr5 ,@(gr28,#REG_PSR)
 131        sti             gr23,@(gr28,#REG_ISR)
 132        stdi            gr24,@(gr28,#REG_CCR)
 133        stdi            gr26,@(gr28,#REG_LR)
 134        sti             gr4 ,@(gr28,#REG_SYSCALLNO)
 135
 136        movsg           iacc0h,gr4
 137        movsg           iacc0l,gr5
 138        stdi            gr4,@(gr28,#REG_IACC0)
 139
 140        movsg           gner0,gr4
 141        movsg           gner1,gr5
 142        stdi.p          gr4,@(gr28,#REG_GNER0)
 143
 144        # interrupts start off fully disabled in the interrupt handler
 145        subcc           gr0,gr0,gr0,icc2                /* set Z and clear C */
 146
 147        # set up kernel global registers
 148        sethi.p         %hi(__kernel_current_task),gr5
 149        setlo           %lo(__kernel_current_task),gr5
 150        sethi.p         %hi(_gp),gr16
 151        setlo           %lo(_gp),gr16
 152        ldi             @(gr5,#0),gr29
 153        ldi.p           @(gr29,#4),gr15         ; __current_thread_info = current->thread_info
 154
 155        # make sure we (the kernel) get div-zero and misalignment exceptions
 156        setlos          #ISR_EDE|ISR_DTT_DIVBYZERO|ISR_EMAM_EXCEPTION,gr5
 157        movgs           gr5,isr
 158
 159        # switch to the kernel trap table
 160        sethi.p         %hi(__entry_kerneltrap_table),gr6
 161        setlo           %lo(__entry_kerneltrap_table),gr6
 162        movgs           gr6,tbr
 163
 164        # set the return address
 165        sethi.p         %hi(__entry_return_from_user_interrupt),gr4
 166        setlo           %lo(__entry_return_from_user_interrupt),gr4
 167        movgs           gr4,lr
 168
 169        # raise the minimum interrupt priority to 15 (NMI only) and enable exceptions
 170        movsg           psr,gr4
 171
 172        ori             gr4,#PSR_PIL_14,gr4
 173        movgs           gr4,psr
 174        ori             gr4,#PSR_PIL_14|PSR_ET,gr4
 175        movgs           gr4,psr
 176
 177        LEDS            0x6202
 178        bra             do_IRQ
 179
 180        .size           __entry_uspace_external_interrupt,.-__entry_uspace_external_interrupt
 181
 182###############################################################################
 183#
 184# entry point for External interrupts received whilst executing kernel code
 185# - on arriving here, the following registers should already be set up:
 186#       GR15    - current thread_info struct pointer
 187#       GR16    - kernel GP-REL pointer
 188#       GR29    - current task struct pointer
 189#       TBR     - kernel trap vector table
 190#       ISR     - kernel's preferred integer controls
 191#
 192###############################################################################
 193        .globl          __entry_kernel_external_interrupt
 194        .type           __entry_kernel_external_interrupt,@function
 195__entry_kernel_external_interrupt:
 196        LEDS            0x6210
 197//      sub             sp,gr15,gr31
 198//      LEDS32
 199
 200        # set up the stack pointer
 201        or.p            sp,gr0,gr30
 202        subi            sp,#REG__END,sp
 203        sti             gr30,@(sp,#REG_SP)
 204
 205        # handle h/w single-step through exceptions
 206        sti             gr0,@(sp,#REG__STATUS)
 207
 208        .globl          __entry_kernel_external_interrupt_reentry
 209__entry_kernel_external_interrupt_reentry:
 210        LEDS            0x6211
 211
 212        # set up the exception frame
 213        setlos          #REG__END,gr30
 214        dcpl            sp,gr30,#0
 215
 216        sti.p           gr28,@(sp,#REG_GR(28))
 217        ori             sp,0,gr28
 218
 219        # finish building the exception frame
 220        stdi            gr2,@(gr28,#REG_GR(2))
 221        stdi            gr4,@(gr28,#REG_GR(4))
 222        stdi            gr6,@(gr28,#REG_GR(6))
 223        stdi            gr8,@(gr28,#REG_GR(8))
 224        stdi            gr10,@(gr28,#REG_GR(10))
 225        stdi            gr12,@(gr28,#REG_GR(12))
 226        stdi            gr14,@(gr28,#REG_GR(14))
 227        stdi            gr16,@(gr28,#REG_GR(16))
 228        stdi            gr18,@(gr28,#REG_GR(18))
 229        stdi            gr20,@(gr28,#REG_GR(20))
 230        stdi            gr22,@(gr28,#REG_GR(22))
 231        stdi            gr24,@(gr28,#REG_GR(24))
 232        stdi            gr26,@(gr28,#REG_GR(26))
 233        sti             gr29,@(gr28,#REG_GR(29))
 234        stdi.p          gr30,@(gr28,#REG_GR(30))
 235
 236        # note virtual interrupts will be fully enabled upon return
 237        subicc          gr0,#1,gr0,icc2                 /* clear Z, set C */
 238
 239        movsg           tbr ,gr20
 240        movsg           psr ,gr22
 241        movsg           pcsr,gr21
 242        movsg           isr ,gr23
 243        movsg           ccr ,gr24
 244        movsg           cccr,gr25
 245        movsg           lr  ,gr26
 246        movsg           lcr ,gr27
 247
 248        setlos.p        #-1,gr4
 249        andi            gr22,#PSR_PS,gr5                /* try to rebuild original PSR value */
 250        andi.p          gr22,#~(PSR_PS|PSR_S),gr6
 251        slli            gr5,#1,gr5
 252        or              gr6,gr5,gr5
 253        andi.p          gr5,#~PSR_ET,gr5
 254
 255        # set CCCR.CC3 to Undefined to abort atomic-modify completion inside the kernel
 256        # - for an explanation of how it works, see: Documentation/frv/atomic-ops.txt
 257        andi            gr25,#~0xc0,gr25
 258
 259        sti             gr20,@(gr28,#REG_TBR)
 260        sti             gr21,@(gr28,#REG_PC)
 261        sti             gr5 ,@(gr28,#REG_PSR)
 262        sti             gr23,@(gr28,#REG_ISR)
 263        stdi            gr24,@(gr28,#REG_CCR)
 264        stdi            gr26,@(gr28,#REG_LR)
 265        sti             gr4 ,@(gr28,#REG_SYSCALLNO)
 266
 267        movsg           iacc0h,gr4
 268        movsg           iacc0l,gr5
 269        stdi            gr4,@(gr28,#REG_IACC0)
 270
 271        movsg           gner0,gr4
 272        movsg           gner1,gr5
 273        stdi.p          gr4,@(gr28,#REG_GNER0)
 274
 275        # interrupts start off fully disabled in the interrupt handler
 276        subcc           gr0,gr0,gr0,icc2                        /* set Z and clear C */
 277
 278        # set the return address
 279        sethi.p         %hi(__entry_return_from_kernel_interrupt),gr4
 280        setlo           %lo(__entry_return_from_kernel_interrupt),gr4
 281        movgs           gr4,lr
 282
 283        # clear power-saving mode flags
 284        movsg           hsr0,gr4
 285        andi            gr4,#~HSR0_PDM,gr4
 286        movgs           gr4,hsr0
 287
 288        # raise the minimum interrupt priority to 15 (NMI only) and enable exceptions
 289        movsg           psr,gr4
 290        ori             gr4,#PSR_PIL_14,gr4
 291        movgs           gr4,psr
 292        ori             gr4,#PSR_ET,gr4
 293        movgs           gr4,psr
 294
 295        LEDS            0x6212
 296        bra             do_IRQ
 297
 298        .size           __entry_kernel_external_interrupt,.-__entry_kernel_external_interrupt
 299
 300###############################################################################
 301#
 302# deal with interrupts that were actually virtually disabled
 303# - we need to really disable them, flag the fact and return immediately
 304# - if you change this, you must alter break.S also
 305#
 306###############################################################################
 307        .balign         L1_CACHE_BYTES
 308        .globl          __entry_kernel_external_interrupt_virtually_disabled
 309        .type           __entry_kernel_external_interrupt_virtually_disabled,@function
 310__entry_kernel_external_interrupt_virtually_disabled:
 311        movsg           psr,gr30
 312        andi            gr30,#~PSR_PIL,gr30
 313        ori             gr30,#PSR_PIL_14,gr30           ; debugging interrupts only
 314        movgs           gr30,psr
 315        subcc           gr0,gr0,gr0,icc2                ; leave Z set, clear C
 316        rett            #0
 317
 318        .size           __entry_kernel_external_interrupt_virtually_disabled,.-__entry_kernel_external_interrupt_virtually_disabled
 319
 320###############################################################################
 321#
 322# deal with re-enablement of interrupts that were pending when virtually re-enabled
 323# - set ICC2.C, re-enable the real interrupts and return
 324# - we can clear ICC2.Z because we shouldn't be here if it's not 0 [due to TIHI]
 325# - if you change this, you must alter break.S also
 326#
 327###############################################################################
 328        .balign         L1_CACHE_BYTES
 329        .globl          __entry_kernel_external_interrupt_virtual_reenable
 330        .type           __entry_kernel_external_interrupt_virtual_reenable,@function
 331__entry_kernel_external_interrupt_virtual_reenable:
 332        movsg           psr,gr30
 333        andi            gr30,#~PSR_PIL,gr30             ; re-enable interrupts
 334        movgs           gr30,psr
 335        subicc          gr0,#1,gr0,icc2                 ; clear Z, set C
 336        rett            #0
 337
 338        .size           __entry_kernel_external_interrupt_virtual_reenable,.-__entry_kernel_external_interrupt_virtual_reenable
 339
 340###############################################################################
 341#
 342# entry point for Software and Progam interrupts generated whilst executing userspace code
 343#
 344###############################################################################
 345        .globl          __entry_uspace_softprog_interrupt
 346        .type           __entry_uspace_softprog_interrupt,@function
 347        .globl          __entry_uspace_handle_mmu_fault
 348__entry_uspace_softprog_interrupt:
 349        LEDS            0x6000
 350#ifdef CONFIG_MMU
 351        movsg           ear0,gr28
 352__entry_uspace_handle_mmu_fault:
 353        movgs           gr28,scr2
 354#endif
 355        sethi.p         %hi(__kernel_frame0_ptr),gr28
 356        setlo           %lo(__kernel_frame0_ptr),gr28
 357        ldi             @(gr28,#0),gr28
 358
 359        # handle h/w single-step through exceptions
 360        sti             gr0,@(gr28,#REG__STATUS)
 361
 362        .globl          __entry_uspace_softprog_interrupt_reentry
 363__entry_uspace_softprog_interrupt_reentry:
 364        LEDS            0x6001
 365
 366        setlos          #REG__END,gr30
 367        dcpl            gr28,gr30,#0
 368
 369        # set up the kernel stack pointer
 370        sti.p           sp,@(gr28,#REG_SP)
 371        ori             gr28,0,sp
 372        sti             gr0,@(gr28,#REG_GR(28))
 373
 374        stdi            gr20,@(gr28,#REG_GR(20))
 375        stdi            gr22,@(gr28,#REG_GR(22))
 376
 377        movsg           tbr,gr20
 378        movsg           pcsr,gr21
 379        movsg           psr,gr22
 380
 381        sethi.p         %hi(__entry_return_from_user_exception),gr23
 382        setlo           %lo(__entry_return_from_user_exception),gr23
 383
 384        bra             __entry_common
 385
 386        .size           __entry_uspace_softprog_interrupt,.-__entry_uspace_softprog_interrupt
 387
 388        # single-stepping was disabled on entry to a TLB handler that then faulted
 389#ifdef CONFIG_MMU
 390        .globl          __entry_uspace_handle_mmu_fault_sstep
 391__entry_uspace_handle_mmu_fault_sstep:
 392        movgs           gr28,scr2
 393        sethi.p         %hi(__kernel_frame0_ptr),gr28
 394        setlo           %lo(__kernel_frame0_ptr),gr28
 395        ldi             @(gr28,#0),gr28
 396
 397        # flag single-step re-enablement
 398        sti             gr0,@(gr28,#REG__STATUS)
 399        bra             __entry_uspace_softprog_interrupt_reentry
 400#endif
 401
 402
 403###############################################################################
 404#
 405# entry point for Software and Progam interrupts generated whilst executing kernel code
 406#
 407###############################################################################
 408        .globl          __entry_kernel_softprog_interrupt
 409        .type           __entry_kernel_softprog_interrupt,@function
 410__entry_kernel_softprog_interrupt:
 411        LEDS            0x6004
 412
 413#ifdef CONFIG_MMU
 414        movsg           ear0,gr30
 415        movgs           gr30,scr2
 416#endif
 417
 418        .globl          __entry_kernel_handle_mmu_fault
 419__entry_kernel_handle_mmu_fault:
 420        # set up the stack pointer
 421        subi            sp,#REG__END,sp
 422        sti             sp,@(sp,#REG_SP)
 423        sti             sp,@(sp,#REG_SP-4)
 424        andi            sp,#~7,sp
 425
 426        # handle h/w single-step through exceptions
 427        sti             gr0,@(sp,#REG__STATUS)
 428
 429        .globl          __entry_kernel_softprog_interrupt_reentry
 430__entry_kernel_softprog_interrupt_reentry:
 431        LEDS            0x6005
 432
 433        setlos          #REG__END,gr30
 434        dcpl            sp,gr30,#0
 435
 436        # set up the exception frame
 437        sti.p           gr28,@(sp,#REG_GR(28))
 438        ori             sp,0,gr28
 439
 440        stdi            gr20,@(gr28,#REG_GR(20))
 441        stdi            gr22,@(gr28,#REG_GR(22))
 442
 443        ldi             @(sp,#REG_SP),gr22              /* reconstruct the old SP */
 444        addi            gr22,#REG__END,gr22
 445        sti             gr22,@(sp,#REG_SP)
 446
 447        # set CCCR.CC3 to Undefined to abort atomic-modify completion inside the kernel
 448        # - for an explanation of how it works, see: Documentation/frv/atomic-ops.txt
 449        movsg           cccr,gr20
 450        andi            gr20,#~0xc0,gr20
 451        movgs           gr20,cccr
 452
 453        movsg           tbr,gr20
 454        movsg           pcsr,gr21
 455        movsg           psr,gr22
 456
 457        sethi.p         %hi(__entry_return_from_kernel_exception),gr23
 458        setlo           %lo(__entry_return_from_kernel_exception),gr23
 459        bra             __entry_common
 460
 461        .size           __entry_kernel_softprog_interrupt,.-__entry_kernel_softprog_interrupt
 462
 463        # single-stepping was disabled on entry to a TLB handler that then faulted
 464#ifdef CONFIG_MMU
 465        .globl          __entry_kernel_handle_mmu_fault_sstep
 466__entry_kernel_handle_mmu_fault_sstep:
 467        # set up the stack pointer
 468        subi            sp,#REG__END,sp
 469        sti             sp,@(sp,#REG_SP)
 470        sti             sp,@(sp,#REG_SP-4)
 471        andi            sp,#~7,sp
 472
 473        # flag single-step re-enablement
 474        sethi           #REG__STATUS_STEP,gr30
 475        sti             gr30,@(sp,#REG__STATUS)
 476        bra             __entry_kernel_softprog_interrupt_reentry
 477#endif
 478
 479
 480###############################################################################
 481#
 482# the rest of the kernel entry point code
 483# - on arriving here, the following registers should be set up:
 484#       GR1     - kernel stack pointer
 485#       GR7     - syscall number (trap 0 only)
 486#       GR8-13  - syscall args (trap 0 only)
 487#       GR20    - saved TBR
 488#       GR21    - saved PC
 489#       GR22    - saved PSR
 490#       GR23    - return handler address
 491#       GR28    - exception frame on stack
 492#       SCR2    - saved EAR0 where applicable (clobbered by ICI & ICEF insns on FR451)
 493#       PSR     - PSR.S 1, PSR.ET 0
 494#
 495###############################################################################
 496        .globl          __entry_common
 497        .type           __entry_common,@function
 498__entry_common:
 499        LEDS            0x6008
 500
 501        # finish building the exception frame
 502        stdi            gr2,@(gr28,#REG_GR(2))
 503        stdi            gr4,@(gr28,#REG_GR(4))
 504        stdi            gr6,@(gr28,#REG_GR(6))
 505        stdi            gr8,@(gr28,#REG_GR(8))
 506        stdi            gr10,@(gr28,#REG_GR(10))
 507        stdi            gr12,@(gr28,#REG_GR(12))
 508        stdi            gr14,@(gr28,#REG_GR(14))
 509        stdi            gr16,@(gr28,#REG_GR(16))
 510        stdi            gr18,@(gr28,#REG_GR(18))
 511        stdi            gr24,@(gr28,#REG_GR(24))
 512        stdi            gr26,@(gr28,#REG_GR(26))
 513        sti             gr29,@(gr28,#REG_GR(29))
 514        stdi            gr30,@(gr28,#REG_GR(30))
 515
 516        movsg           lcr ,gr27
 517        movsg           lr  ,gr26
 518        movgs           gr23,lr
 519        movsg           cccr,gr25
 520        movsg           ccr ,gr24
 521        movsg           isr ,gr23
 522
 523        setlos.p        #-1,gr4
 524        andi            gr22,#PSR_PS,gr5                /* try to rebuild original PSR value */
 525        andi.p          gr22,#~(PSR_PS|PSR_S),gr6
 526        slli            gr5,#1,gr5
 527        or              gr6,gr5,gr5
 528        andi            gr5,#~PSR_ET,gr5
 529
 530        sti             gr20,@(gr28,#REG_TBR)
 531        sti             gr21,@(gr28,#REG_PC)
 532        sti             gr5 ,@(gr28,#REG_PSR)
 533        sti             gr23,@(gr28,#REG_ISR)
 534        stdi            gr24,@(gr28,#REG_CCR)
 535        stdi            gr26,@(gr28,#REG_LR)
 536        sti             gr4 ,@(gr28,#REG_SYSCALLNO)
 537
 538        movsg           iacc0h,gr4
 539        movsg           iacc0l,gr5
 540        stdi            gr4,@(gr28,#REG_IACC0)
 541
 542        movsg           gner0,gr4
 543        movsg           gner1,gr5
 544        stdi.p          gr4,@(gr28,#REG_GNER0)
 545
 546        # set up virtual interrupt disablement
 547        subicc          gr0,#1,gr0,icc2                 /* clear Z flag, set C flag */
 548
 549        # set up kernel global registers
 550        sethi.p         %hi(__kernel_current_task),gr5
 551        setlo           %lo(__kernel_current_task),gr5
 552        sethi.p         %hi(_gp),gr16
 553        setlo           %lo(_gp),gr16
 554        ldi             @(gr5,#0),gr29
 555        ldi             @(gr29,#4),gr15         ; __current_thread_info = current->thread_info
 556
 557        # switch to the kernel trap table
 558        sethi.p         %hi(__entry_kerneltrap_table),gr6
 559        setlo           %lo(__entry_kerneltrap_table),gr6
 560        movgs           gr6,tbr
 561
 562        # make sure we (the kernel) get div-zero and misalignment exceptions
 563        setlos          #ISR_EDE|ISR_DTT_DIVBYZERO|ISR_EMAM_EXCEPTION,gr5
 564        movgs           gr5,isr
 565
 566        # clear power-saving mode flags
 567        movsg           hsr0,gr4
 568        andi            gr4,#~HSR0_PDM,gr4
 569        movgs           gr4,hsr0
 570
 571        # multiplex again using old TBR as a guide
 572        setlos.p        #TBR_TT,gr3
 573        sethi           %hi(__entry_vector_table),gr6
 574        and.p           gr20,gr3,gr5
 575        setlo           %lo(__entry_vector_table),gr6
 576        srli            gr5,#2,gr5
 577        ld              @(gr5,gr6),gr5
 578
 579        LEDS            0x6009
 580        jmpl            @(gr5,gr0)
 581
 582
 583        .size           __entry_common,.-__entry_common
 584
 585###############################################################################
 586#
 587# handle instruction MMU fault
 588#
 589###############################################################################
 590#ifdef CONFIG_MMU
 591        .globl          __entry_insn_mmu_fault
 592__entry_insn_mmu_fault:
 593        LEDS            0x6010
 594        setlos          #0,gr8
 595        movsg           esr0,gr9
 596        movsg           scr2,gr10
 597
 598        # now that we've accessed the exception regs, we can enable exceptions
 599        movsg           psr,gr4
 600        ori             gr4,#PSR_ET,gr4
 601        movgs           gr4,psr
 602
 603        sethi.p         %hi(do_page_fault),gr5
 604        setlo           %lo(do_page_fault),gr5
 605        jmpl            @(gr5,gr0)      ; call do_page_fault(0,esr0,ear0)
 606#endif
 607
 608
 609###############################################################################
 610#
 611# handle instruction access error
 612#
 613###############################################################################
 614        .globl          __entry_insn_access_error
 615__entry_insn_access_error:
 616        LEDS            0x6011
 617        sethi.p         %hi(insn_access_error),gr5
 618        setlo           %lo(insn_access_error),gr5
 619        movsg           esfr1,gr8
 620        movsg           epcr0,gr9
 621        movsg           esr0,gr10
 622
 623        # now that we've accessed the exception regs, we can enable exceptions
 624        movsg           psr,gr4
 625        ori             gr4,#PSR_ET,gr4
 626        movgs           gr4,psr
 627        jmpl            @(gr5,gr0)      ; call insn_access_error(esfr1,epcr0,esr0)
 628
 629###############################################################################
 630#
 631# handle various instructions of dubious legality
 632#
 633###############################################################################
 634        .globl          __entry_unsupported_trap
 635        .globl          __entry_illegal_instruction
 636        .globl          __entry_privileged_instruction
 637        .globl          __entry_debug_exception
 638__entry_unsupported_trap:
 639        subi            gr21,#4,gr21
 640        sti             gr21,@(gr28,#REG_PC)
 641__entry_illegal_instruction:
 642__entry_privileged_instruction:
 643__entry_debug_exception:
 644        LEDS            0x6012
 645        sethi.p         %hi(illegal_instruction),gr5
 646        setlo           %lo(illegal_instruction),gr5
 647        movsg           esfr1,gr8
 648        movsg           epcr0,gr9
 649        movsg           esr0,gr10
 650
 651        # now that we've accessed the exception regs, we can enable exceptions
 652        movsg           psr,gr4
 653        ori             gr4,#PSR_ET,gr4
 654        movgs           gr4,psr
 655        jmpl            @(gr5,gr0)      ; call ill_insn(esfr1,epcr0,esr0)
 656
 657###############################################################################
 658#
 659# handle atomic operation emulation for userspace
 660#
 661###############################################################################
 662        .globl          __entry_atomic_op
 663__entry_atomic_op:
 664        LEDS            0x6012
 665        sethi.p         %hi(atomic_operation),gr5
 666        setlo           %lo(atomic_operation),gr5
 667        movsg           esfr1,gr8
 668        movsg           epcr0,gr9
 669        movsg           esr0,gr10
 670
 671        # now that we've accessed the exception regs, we can enable exceptions
 672        movsg           psr,gr4
 673        ori             gr4,#PSR_ET,gr4
 674        movgs           gr4,psr
 675        jmpl            @(gr5,gr0)      ; call atomic_operation(esfr1,epcr0,esr0)
 676
 677###############################################################################
 678#
 679# handle media exception
 680#
 681###############################################################################
 682        .globl          __entry_media_exception
 683__entry_media_exception:
 684        LEDS            0x6013
 685        sethi.p         %hi(media_exception),gr5
 686        setlo           %lo(media_exception),gr5
 687        movsg           msr0,gr8
 688        movsg           msr1,gr9
 689
 690        # now that we've accessed the exception regs, we can enable exceptions
 691        movsg           psr,gr4
 692        ori             gr4,#PSR_ET,gr4
 693        movgs           gr4,psr
 694        jmpl            @(gr5,gr0)      ; call media_excep(msr0,msr1)
 695
 696###############################################################################
 697#
 698# handle data MMU fault
 699# handle data DAT fault (write-protect exception)
 700#
 701###############################################################################
 702#ifdef CONFIG_MMU
 703        .globl          __entry_data_mmu_fault
 704__entry_data_mmu_fault:
 705        .globl          __entry_data_dat_fault
 706__entry_data_dat_fault:
 707        LEDS            0x6014
 708        setlos          #1,gr8
 709        movsg           esr0,gr9
 710        movsg           scr2,gr10       ; saved EAR0
 711
 712        # now that we've accessed the exception regs, we can enable exceptions
 713        movsg           psr,gr4
 714        ori             gr4,#PSR_ET,gr4
 715        movgs           gr4,psr
 716
 717        sethi.p         %hi(do_page_fault),gr5
 718        setlo           %lo(do_page_fault),gr5
 719        jmpl            @(gr5,gr0)      ; call do_page_fault(1,esr0,ear0)
 720#endif
 721
 722###############################################################################
 723#
 724# handle data and instruction access exceptions
 725#
 726###############################################################################
 727        .globl          __entry_insn_access_exception
 728        .globl          __entry_data_access_exception
 729__entry_insn_access_exception:
 730__entry_data_access_exception:
 731        LEDS            0x6016
 732        sethi.p         %hi(memory_access_exception),gr5
 733        setlo           %lo(memory_access_exception),gr5
 734        movsg           esr0,gr8
 735        movsg           scr2,gr9        ; saved EAR0
 736        movsg           epcr0,gr10
 737
 738        # now that we've accessed the exception regs, we can enable exceptions
 739        movsg           psr,gr4
 740        ori             gr4,#PSR_ET,gr4
 741        movgs           gr4,psr
 742        jmpl            @(gr5,gr0)      ; call memory_access_error(esr0,ear0,epcr0)
 743
 744###############################################################################
 745#
 746# handle data access error
 747#
 748###############################################################################
 749        .globl          __entry_data_access_error
 750__entry_data_access_error:
 751        LEDS            0x6016
 752        sethi.p         %hi(data_access_error),gr5
 753        setlo           %lo(data_access_error),gr5
 754        movsg           esfr1,gr8
 755        movsg           esr15,gr9
 756        movsg           ear15,gr10
 757
 758        # now that we've accessed the exception regs, we can enable exceptions
 759        movsg           psr,gr4
 760        ori             gr4,#PSR_ET,gr4
 761        movgs           gr4,psr
 762        jmpl            @(gr5,gr0)      ; call data_access_error(esfr1,esr15,ear15)
 763
 764###############################################################################
 765#
 766# handle data store error
 767#
 768###############################################################################
 769        .globl          __entry_data_store_error
 770__entry_data_store_error:
 771        LEDS            0x6017
 772        sethi.p         %hi(data_store_error),gr5
 773        setlo           %lo(data_store_error),gr5
 774        movsg           esfr1,gr8
 775        movsg           esr14,gr9
 776
 777        # now that we've accessed the exception regs, we can enable exceptions
 778        movsg           psr,gr4
 779        ori             gr4,#PSR_ET,gr4
 780        movgs           gr4,psr
 781        jmpl            @(gr5,gr0)      ; call data_store_error(esfr1,esr14)
 782
 783###############################################################################
 784#
 785# handle division exception
 786#
 787###############################################################################
 788        .globl          __entry_division_exception
 789__entry_division_exception:
 790        LEDS            0x6018
 791        sethi.p         %hi(division_exception),gr5
 792        setlo           %lo(division_exception),gr5
 793        movsg           esfr1,gr8
 794        movsg           esr0,gr9
 795        movsg           isr,gr10
 796
 797        # now that we've accessed the exception regs, we can enable exceptions
 798        movsg           psr,gr4
 799        ori             gr4,#PSR_ET,gr4
 800        movgs           gr4,psr
 801        jmpl            @(gr5,gr0)      ; call div_excep(esfr1,esr0,isr)
 802
 803###############################################################################
 804#
 805# handle compound exception
 806#
 807###############################################################################
 808        .globl          __entry_compound_exception
 809__entry_compound_exception:
 810        LEDS            0x6019
 811        sethi.p         %hi(compound_exception),gr5
 812        setlo           %lo(compound_exception),gr5
 813        movsg           esfr1,gr8
 814        movsg           esr0,gr9
 815        movsg           esr14,gr10
 816        movsg           esr15,gr11
 817        movsg           msr0,gr12
 818        movsg           msr1,gr13
 819
 820        # now that we've accessed the exception regs, we can enable exceptions
 821        movsg           psr,gr4
 822        ori             gr4,#PSR_ET,gr4
 823        movgs           gr4,psr
 824        jmpl            @(gr5,gr0)      ; call comp_excep(esfr1,esr0,esr14,esr15,msr0,msr1)
 825
 826###############################################################################
 827#
 828# handle interrupts and NMIs
 829#
 830###############################################################################
 831        .globl          __entry_do_IRQ
 832__entry_do_IRQ:
 833        LEDS            0x6020
 834
 835        # we can enable exceptions
 836        movsg           psr,gr4
 837        ori             gr4,#PSR_ET,gr4
 838        movgs           gr4,psr
 839        bra             do_IRQ
 840
 841        .globl          __entry_do_NMI
 842__entry_do_NMI:
 843        LEDS            0x6021
 844
 845        # we can enable exceptions
 846        movsg           psr,gr4
 847        ori             gr4,#PSR_ET,gr4
 848        movgs           gr4,psr
 849        bra             do_NMI
 850
 851###############################################################################
 852#
 853# the return path for a newly forked child process
 854# - __switch_to() saved the old current pointer in GR8 for us
 855#
 856###############################################################################
 857        .globl          ret_from_fork
 858ret_from_fork:
 859        LEDS            0x6100
 860        call            schedule_tail
 861
 862        # fork & co. return 0 to child
 863        setlos.p        #0,gr8
 864        bra             __syscall_exit
 865
 866        .globl          ret_from_kernel_thread
 867ret_from_kernel_thread:
 868        lddi.p          @(gr28,#REG_GR(8)),gr20
 869        call            schedule_tail
 870        calll.p         @(gr21,gr0)
 871        or              gr20,gr20,gr8
 872        bra             __syscall_exit
 873
 874###################################################################################################
 875#
 876# Return to user mode is not as complex as all this looks,
 877# but we want the default path for a system call return to
 878# go as quickly as possible which is why some of this is
 879# less clear than it otherwise should be.
 880#
 881###################################################################################################
 882        .balign         L1_CACHE_BYTES
 883        .globl          system_call
 884system_call:
 885        LEDS            0x6101
 886        movsg           psr,gr4                 ; enable exceptions
 887        ori             gr4,#PSR_ET,gr4
 888        movgs           gr4,psr
 889
 890        sti             gr7,@(gr28,#REG_SYSCALLNO)
 891        sti.p           gr8,@(gr28,#REG_ORIG_GR8)
 892
 893        subicc          gr7,#nr_syscalls,gr0,icc0
 894        bnc             icc0,#0,__syscall_badsys
 895
 896        ldi             @(gr15,#TI_FLAGS),gr4
 897        andicc          gr4,#_TIF_SYSCALL_TRACE,gr0,icc0
 898        bne             icc0,#0,__syscall_trace_entry
 899
 900__syscall_call:
 901        slli.p          gr7,#2,gr7
 902        sethi           %hi(sys_call_table),gr5
 903        setlo           %lo(sys_call_table),gr5
 904        ld              @(gr5,gr7),gr4
 905        calll           @(gr4,gr0)
 906
 907
 908###############################################################################
 909#
 910# return to interrupted process
 911#
 912###############################################################################
 913__syscall_exit:
 914        LEDS            0x6300
 915
 916        # keep current PSR in GR23
 917        movsg           psr,gr23
 918
 919        ldi             @(gr28,#REG_PSR),gr22
 920
 921        sti.p           gr8,@(gr28,#REG_GR(8))  ; save return value
 922
 923        # rebuild saved psr - execve will change it for init/main.c
 924        srli            gr22,#1,gr5
 925        andi.p          gr22,#~PSR_PS,gr22
 926        andi            gr5,#PSR_PS,gr5
 927        or              gr5,gr22,gr22
 928        ori.p           gr22,#PSR_S,gr22
 929
 930        # make sure we don't miss an interrupt setting need_resched or sigpending between
 931        # sampling and the RETT
 932        ori             gr23,#PSR_PIL_14,gr23
 933        movgs           gr23,psr
 934
 935        ldi             @(gr15,#TI_FLAGS),gr4
 936        andicc          gr4,#_TIF_ALLWORK_MASK,gr0,icc0
 937        bne             icc0,#0,__syscall_exit_work
 938
 939        # restore all registers and return
 940__entry_return_direct:
 941        LEDS            0x6301
 942
 943        andi            gr22,#~PSR_ET,gr22
 944        movgs           gr22,psr
 945
 946        ldi             @(gr28,#REG_ISR),gr23
 947        lddi            @(gr28,#REG_CCR),gr24
 948        lddi            @(gr28,#REG_LR) ,gr26
 949        ldi             @(gr28,#REG_PC) ,gr21
 950        ldi             @(gr28,#REG_TBR),gr20
 951
 952        movgs           gr20,tbr
 953        movgs           gr21,pcsr
 954        movgs           gr23,isr
 955        movgs           gr24,ccr
 956        movgs           gr25,cccr
 957        movgs           gr26,lr
 958        movgs           gr27,lcr
 959
 960        lddi            @(gr28,#REG_GNER0),gr4
 961        movgs           gr4,gner0
 962        movgs           gr5,gner1
 963
 964        lddi            @(gr28,#REG_IACC0),gr4
 965        movgs           gr4,iacc0h
 966        movgs           gr5,iacc0l
 967
 968        lddi            @(gr28,#REG_GR(4)) ,gr4
 969        lddi            @(gr28,#REG_GR(6)) ,gr6
 970        lddi            @(gr28,#REG_GR(8)) ,gr8
 971        lddi            @(gr28,#REG_GR(10)),gr10
 972        lddi            @(gr28,#REG_GR(12)),gr12
 973        lddi            @(gr28,#REG_GR(14)),gr14
 974        lddi            @(gr28,#REG_GR(16)),gr16
 975        lddi            @(gr28,#REG_GR(18)),gr18
 976        lddi            @(gr28,#REG_GR(20)),gr20
 977        lddi            @(gr28,#REG_GR(22)),gr22
 978        lddi            @(gr28,#REG_GR(24)),gr24
 979        lddi            @(gr28,#REG_GR(26)),gr26
 980        ldi             @(gr28,#REG_GR(29)),gr29
 981        lddi            @(gr28,#REG_GR(30)),gr30
 982
 983        # check to see if a debugging return is required
 984        LEDS            0x67f0
 985        movsg           ccr,gr2
 986        ldi             @(gr28,#REG__STATUS),gr3
 987        andicc          gr3,#REG__STATUS_STEP,gr0,icc0
 988        bne             icc0,#0,__entry_return_singlestep
 989        movgs           gr2,ccr
 990
 991        ldi             @(gr28,#REG_SP)    ,sp
 992        lddi            @(gr28,#REG_GR(2)) ,gr2
 993        ldi             @(gr28,#REG_GR(28)),gr28
 994
 995        LEDS            0x67fe
 996//      movsg           pcsr,gr31
 997//      LEDS32
 998
 999#if 0
1000        # store the current frame in the workram on the FR451
1001        movgs           gr28,scr2
1002        sethi.p         %hi(0xfe800000),gr28
1003        setlo           %lo(0xfe800000),gr28
1004
1005        stdi            gr2,@(gr28,#REG_GR(2))
1006        stdi            gr4,@(gr28,#REG_GR(4))
1007        stdi            gr6,@(gr28,#REG_GR(6))
1008        stdi            gr8,@(gr28,#REG_GR(8))
1009        stdi            gr10,@(gr28,#REG_GR(10))
1010        stdi            gr12,@(gr28,#REG_GR(12))
1011        stdi            gr14,@(gr28,#REG_GR(14))
1012        stdi            gr16,@(gr28,#REG_GR(16))
1013        stdi            gr18,@(gr28,#REG_GR(18))
1014        stdi            gr24,@(gr28,#REG_GR(24))
1015        stdi            gr26,@(gr28,#REG_GR(26))
1016        sti             gr29,@(gr28,#REG_GR(29))
1017        stdi            gr30,@(gr28,#REG_GR(30))
1018
1019        movsg           tbr ,gr30
1020        sti             gr30,@(gr28,#REG_TBR)
1021        movsg           pcsr,gr30
1022        sti             gr30,@(gr28,#REG_PC)
1023        movsg           psr ,gr30
1024        sti             gr30,@(gr28,#REG_PSR)
1025        movsg           isr ,gr30
1026        sti             gr30,@(gr28,#REG_ISR)
1027        movsg           ccr ,gr30
1028        movsg           cccr,gr31
1029        stdi            gr30,@(gr28,#REG_CCR)
1030        movsg           lr  ,gr30
1031        movsg           lcr ,gr31
1032        stdi            gr30,@(gr28,#REG_LR)
1033        sti             gr0 ,@(gr28,#REG_SYSCALLNO)
1034        movsg           scr2,gr28
1035#endif
1036
1037        rett            #0
1038
1039        # return via break.S
1040__entry_return_singlestep:
1041        movgs           gr2,ccr
1042        lddi            @(gr28,#REG_GR(2)) ,gr2
1043        ldi             @(gr28,#REG_SP)    ,sp
1044        ldi             @(gr28,#REG_GR(28)),gr28
1045        LEDS            0x67ff
1046        break
1047        .globl          __entry_return_singlestep_breaks_here
1048__entry_return_singlestep_breaks_here:
1049        nop
1050
1051
1052###############################################################################
1053#
1054# return to a process interrupted in kernel space
1055# - we need to consider preemption if that is enabled
1056#
1057###############################################################################
1058        .balign         L1_CACHE_BYTES
1059__entry_return_from_kernel_exception:
1060        LEDS            0x6302
1061        movsg           psr,gr23
1062        ori             gr23,#PSR_PIL_14,gr23
1063        movgs           gr23,psr
1064        bra             __entry_return_direct
1065
1066        .balign         L1_CACHE_BYTES
1067__entry_return_from_kernel_interrupt:
1068        LEDS            0x6303
1069        movsg           psr,gr23
1070        ori             gr23,#PSR_PIL_14,gr23
1071        movgs           gr23,psr
1072
1073#ifdef CONFIG_PREEMPT
1074        ldi             @(gr15,#TI_PRE_COUNT),gr5
1075        subicc          gr5,#0,gr0,icc0
1076        beq             icc0,#0,__entry_return_direct
1077
1078        subcc           gr0,gr0,gr0,icc2                /* set Z and clear C */
1079        call            preempt_schedule_irq
1080#endif
1081        bra             __entry_return_direct
1082
1083
1084###############################################################################
1085#
1086# perform work that needs to be done immediately before resumption
1087#
1088###############################################################################
1089        .globl          __entry_return_from_user_exception
1090        .balign         L1_CACHE_BYTES
1091__entry_return_from_user_exception:
1092        LEDS            0x6501
1093
1094__entry_resume_userspace:
1095        # make sure we don't miss an interrupt setting need_resched or sigpending between
1096        # sampling and the RETT
1097        movsg           psr,gr23
1098        ori             gr23,#PSR_PIL_14,gr23
1099        movgs           gr23,psr
1100
1101__entry_return_from_user_interrupt:
1102        LEDS            0x6402
1103        ldi             @(gr15,#TI_FLAGS),gr4
1104        andicc          gr4,#_TIF_WORK_MASK,gr0,icc0
1105        beq             icc0,#1,__entry_return_direct
1106
1107__entry_work_pending:
1108        LEDS            0x6404
1109        andicc          gr4,#_TIF_NEED_RESCHED,gr0,icc0
1110        beq             icc0,#1,__entry_work_notifysig
1111
1112__entry_work_resched:
1113        LEDS            0x6408
1114        movsg           psr,gr23
1115        andi            gr23,#~PSR_PIL,gr23
1116        movgs           gr23,psr
1117        call            schedule
1118        movsg           psr,gr23
1119        ori             gr23,#PSR_PIL_14,gr23
1120        movgs           gr23,psr
1121
1122        LEDS            0x6401
1123        ldi             @(gr15,#TI_FLAGS),gr4
1124        andicc          gr4,#_TIF_WORK_MASK,gr0,icc0
1125        beq             icc0,#1,__entry_return_direct
1126        andicc          gr4,#_TIF_NEED_RESCHED,gr0,icc0
1127        bne             icc0,#1,__entry_work_resched
1128
1129__entry_work_notifysig:
1130        LEDS            0x6410
1131        ori.p           gr4,#0,gr8
1132        call            do_notify_resume
1133        bra             __entry_resume_userspace
1134
1135        # perform syscall entry tracing
1136__syscall_trace_entry:
1137        LEDS            0x6320
1138        call            syscall_trace_entry
1139
1140        lddi.p          @(gr28,#REG_GR(8)) ,gr8
1141        ori             gr8,#0,gr7              ; syscall_trace_entry() returned new syscallno
1142        lddi            @(gr28,#REG_GR(10)),gr10
1143        lddi.p          @(gr28,#REG_GR(12)),gr12
1144
1145        subicc          gr7,#nr_syscalls,gr0,icc0
1146        bnc             icc0,#0,__syscall_badsys
1147        bra             __syscall_call
1148
1149        # perform syscall exit tracing
1150__syscall_exit_work:
1151        LEDS            0x6340
1152        andicc          gr22,#PSR_PS,gr0,icc1   ; don't handle on return to kernel mode
1153        andicc.p        gr4,#_TIF_SYSCALL_TRACE,gr0,icc0
1154        bne             icc1,#0,__entry_return_direct
1155        beq             icc0,#1,__entry_work_pending
1156
1157        movsg           psr,gr23
1158        andi            gr23,#~PSR_PIL,gr23     ; could let syscall_trace_exit() call schedule()
1159        movgs           gr23,psr
1160
1161        call            syscall_trace_exit
1162        bra             __entry_resume_userspace
1163
1164__syscall_badsys:
1165        LEDS            0x6380
1166        setlos          #-ENOSYS,gr8
1167        sti             gr8,@(gr28,#REG_GR(8))  ; save return value
1168        bra             __entry_resume_userspace
1169
1170
1171###############################################################################
1172#
1173# syscall vector table
1174#
1175###############################################################################
1176        .section .rodata
1177ALIGN
1178        .globl          sys_call_table
1179sys_call_table:
1180        .long sys_restart_syscall       /* 0 - old "setup()" system call, used for restarting */
1181        .long sys_exit
1182        .long sys_fork
1183        .long sys_read
1184        .long sys_write
1185        .long sys_open          /* 5 */
1186        .long sys_close
1187        .long sys_waitpid
1188        .long sys_creat
1189        .long sys_link
1190        .long sys_unlink                /* 10 */
1191        .long sys_execve
1192        .long sys_chdir
1193        .long sys_time
1194        .long sys_mknod
1195        .long sys_chmod         /* 15 */
1196        .long sys_lchown16
1197        .long sys_ni_syscall                    /* old break syscall holder */
1198        .long sys_stat
1199        .long sys_lseek
1200        .long sys_getpid                /* 20 */
1201        .long sys_mount
1202        .long sys_oldumount
1203        .long sys_setuid16
1204        .long sys_getuid16
1205        .long sys_ni_syscall // sys_stime               /* 25 */
1206        .long sys_ptrace
1207        .long sys_alarm
1208        .long sys_fstat
1209        .long sys_pause
1210        .long sys_utime         /* 30 */
1211        .long sys_ni_syscall                    /* old stty syscall holder */
1212        .long sys_ni_syscall                    /* old gtty syscall holder */
1213        .long sys_access
1214        .long sys_nice
1215        .long sys_ni_syscall    /* 35 */        /* old ftime syscall holder */
1216        .long sys_sync
1217        .long sys_kill
1218        .long sys_rename
1219        .long sys_mkdir
1220        .long sys_rmdir         /* 40 */
1221        .long sys_dup
1222        .long sys_pipe
1223        .long sys_times
1224        .long sys_ni_syscall                    /* old prof syscall holder */
1225        .long sys_brk           /* 45 */
1226        .long sys_setgid16
1227        .long sys_getgid16
1228        .long sys_ni_syscall // sys_signal
1229        .long sys_geteuid16
1230        .long sys_getegid16     /* 50 */
1231        .long sys_acct
1232        .long sys_umount                                /* recycled never used phys( */
1233        .long sys_ni_syscall                    /* old lock syscall holder */
1234        .long sys_ioctl
1235        .long sys_fcntl         /* 55 */
1236        .long sys_ni_syscall                    /* old mpx syscall holder */
1237        .long sys_setpgid
1238        .long sys_ni_syscall                    /* old ulimit syscall holder */
1239        .long sys_ni_syscall                    /* old old uname syscall */
1240        .long sys_umask         /* 60 */
1241        .long sys_chroot
1242        .long sys_ustat
1243        .long sys_dup2
1244        .long sys_getppid
1245        .long sys_getpgrp       /* 65 */
1246        .long sys_setsid
1247        .long sys_sigaction
1248        .long sys_ni_syscall // sys_sgetmask
1249        .long sys_ni_syscall // sys_ssetmask
1250        .long sys_setreuid16    /* 70 */
1251        .long sys_setregid16
1252        .long sys_sigsuspend
1253        .long sys_ni_syscall // sys_sigpending
1254        .long sys_sethostname
1255        .long sys_setrlimit     /* 75 */
1256        .long sys_ni_syscall // sys_old_getrlimit
1257        .long sys_getrusage
1258        .long sys_gettimeofday
1259        .long sys_settimeofday
1260        .long sys_getgroups16   /* 80 */
1261        .long sys_setgroups16
1262        .long sys_ni_syscall                    /* old_select slot */
1263        .long sys_symlink
1264        .long sys_lstat
1265        .long sys_readlink              /* 85 */
1266        .long sys_uselib
1267        .long sys_swapon
1268        .long sys_reboot
1269        .long sys_ni_syscall // old_readdir
1270        .long sys_ni_syscall    /* 90 */        /* old_mmap slot */
1271        .long sys_munmap
1272        .long sys_truncate
1273        .long sys_ftruncate
1274        .long sys_fchmod
1275        .long sys_fchown16              /* 95 */
1276        .long sys_getpriority
1277        .long sys_setpriority
1278        .long sys_ni_syscall                    /* old profil syscall holder */
1279        .long sys_statfs
1280        .long sys_fstatfs               /* 100 */
1281        .long sys_ni_syscall                    /* ioperm for i386 */
1282        .long sys_socketcall
1283        .long sys_syslog
1284        .long sys_setitimer
1285        .long sys_getitimer     /* 105 */
1286        .long sys_newstat
1287        .long sys_newlstat
1288        .long sys_newfstat
1289        .long sys_ni_syscall    /* obsolete olduname( syscall */
1290        .long sys_ni_syscall    /* iopl for i386 */ /* 110 */
1291        .long sys_vhangup
1292        .long sys_ni_syscall    /* obsolete idle( syscall */
1293        .long sys_ni_syscall    /* vm86old for i386 */
1294        .long sys_wait4
1295        .long sys_swapoff               /* 115 */
1296        .long sys_sysinfo
1297        .long sys_ipc
1298        .long sys_fsync
1299        .long sys_sigreturn
1300        .long sys_clone         /* 120 */
1301        .long sys_setdomainname
1302        .long sys_newuname
1303        .long sys_ni_syscall    /* old "cacheflush" */
1304        .long sys_adjtimex
1305        .long sys_mprotect      /* 125 */
1306        .long sys_sigprocmask
1307        .long sys_ni_syscall    /* old "create_module" */
1308        .long sys_init_module
1309        .long sys_delete_module
1310        .long sys_ni_syscall    /* old "get_kernel_syms" */
1311        .long sys_quotactl
1312        .long sys_getpgid
1313        .long sys_fchdir
1314        .long sys_bdflush
1315        .long sys_sysfs         /* 135 */
1316        .long sys_personality
1317        .long sys_ni_syscall    /* for afs_syscall */
1318        .long sys_setfsuid16
1319        .long sys_setfsgid16
1320        .long sys_llseek                /* 140 */
1321        .long sys_getdents
1322        .long sys_select
1323        .long sys_flock
1324        .long sys_msync
1325        .long sys_readv         /* 145 */
1326        .long sys_writev
1327        .long sys_getsid
1328        .long sys_fdatasync
1329        .long sys_sysctl
1330        .long sys_mlock         /* 150 */
1331        .long sys_munlock
1332        .long sys_mlockall
1333        .long sys_munlockall
1334        .long sys_sched_setparam
1335        .long sys_sched_getparam   /* 155 */
1336        .long sys_sched_setscheduler
1337        .long sys_sched_getscheduler
1338        .long sys_sched_yield
1339        .long sys_sched_get_priority_max
1340        .long sys_sched_get_priority_min  /* 160 */
1341        .long sys_sched_rr_get_interval
1342        .long sys_nanosleep
1343        .long sys_mremap
1344        .long sys_setresuid16
1345        .long sys_getresuid16   /* 165 */
1346        .long sys_ni_syscall    /* for vm86 */
1347        .long sys_ni_syscall    /* Old sys_query_module */
1348        .long sys_poll
1349        .long sys_ni_syscall    /* Old nfsservctl */
1350        .long sys_setresgid16   /* 170 */
1351        .long sys_getresgid16
1352        .long sys_prctl
1353        .long sys_rt_sigreturn
1354        .long sys_rt_sigaction
1355        .long sys_rt_sigprocmask        /* 175 */
1356        .long sys_rt_sigpending
1357        .long sys_rt_sigtimedwait
1358        .long sys_rt_sigqueueinfo
1359        .long sys_rt_sigsuspend
1360        .long sys_pread64               /* 180 */
1361        .long sys_pwrite64
1362        .long sys_chown16
1363        .long sys_getcwd
1364        .long sys_capget
1365        .long sys_capset           /* 185 */
1366        .long sys_sigaltstack
1367        .long sys_sendfile
1368        .long sys_ni_syscall            /* streams1 */
1369        .long sys_ni_syscall            /* streams2 */
1370        .long sys_vfork            /* 190 */
1371        .long sys_getrlimit
1372        .long sys_mmap2
1373        .long sys_truncate64
1374        .long sys_ftruncate64
1375        .long sys_stat64                /* 195 */
1376        .long sys_lstat64
1377        .long sys_fstat64
1378        .long sys_lchown
1379        .long sys_getuid
1380        .long sys_getgid                /* 200 */
1381        .long sys_geteuid
1382        .long sys_getegid
1383        .long sys_setreuid
1384        .long sys_setregid
1385        .long sys_getgroups     /* 205 */
1386        .long sys_setgroups
1387        .long sys_fchown
1388        .long sys_setresuid
1389        .long sys_getresuid
1390        .long sys_setresgid     /* 210 */
1391        .long sys_getresgid
1392        .long sys_chown
1393        .long sys_setuid
1394        .long sys_setgid
1395        .long sys_setfsuid              /* 215 */
1396        .long sys_setfsgid
1397        .long sys_pivot_root
1398        .long sys_mincore
1399        .long sys_madvise
1400        .long sys_getdents64    /* 220 */
1401        .long sys_fcntl64
1402        .long sys_ni_syscall    /* reserved for TUX */
1403        .long sys_ni_syscall    /* Reserved for Security */
1404        .long sys_gettid
1405        .long sys_readahead     /* 225 */
1406        .long sys_setxattr
1407        .long sys_lsetxattr
1408        .long sys_fsetxattr
1409        .long sys_getxattr
1410        .long sys_lgetxattr     /* 230 */
1411        .long sys_fgetxattr
1412        .long sys_listxattr
1413        .long sys_llistxattr
1414        .long sys_flistxattr
1415        .long sys_removexattr   /* 235 */
1416        .long sys_lremovexattr
1417        .long sys_fremovexattr
1418        .long sys_tkill
1419        .long sys_sendfile64
1420        .long sys_futex         /* 240 */
1421        .long sys_sched_setaffinity
1422        .long sys_sched_getaffinity
1423        .long sys_ni_syscall    //sys_set_thread_area
1424        .long sys_ni_syscall    //sys_get_thread_area
1425        .long sys_io_setup      /* 245 */
1426        .long sys_io_destroy
1427        .long sys_io_getevents
1428        .long sys_io_submit
1429        .long sys_io_cancel
1430        .long sys_fadvise64     /* 250 */
1431        .long sys_ni_syscall
1432        .long sys_exit_group
1433        .long sys_lookup_dcookie
1434        .long sys_epoll_create
1435        .long sys_epoll_ctl     /* 255 */
1436        .long sys_epoll_wait
1437        .long sys_remap_file_pages
1438        .long sys_set_tid_address
1439        .long sys_timer_create
1440        .long sys_timer_settime         /* 260 */
1441        .long sys_timer_gettime
1442        .long sys_timer_getoverrun
1443        .long sys_timer_delete
1444        .long sys_clock_settime
1445        .long sys_clock_gettime         /* 265 */
1446        .long sys_clock_getres
1447        .long sys_clock_nanosleep
1448        .long sys_statfs64
1449        .long sys_fstatfs64
1450        .long sys_tgkill        /* 270 */
1451        .long sys_utimes
1452        .long sys_fadvise64_64
1453        .long sys_ni_syscall    /* sys_vserver */
1454        .long sys_mbind
1455        .long sys_get_mempolicy
1456        .long sys_set_mempolicy
1457        .long sys_mq_open
1458        .long sys_mq_unlink
1459        .long sys_mq_timedsend
1460        .long sys_mq_timedreceive       /* 280 */
1461        .long sys_mq_notify
1462        .long sys_mq_getsetattr
1463        .long sys_ni_syscall            /* reserved for kexec */
1464        .long sys_waitid
1465        .long sys_ni_syscall            /* 285 */ /* available */
1466        .long sys_add_key
1467        .long sys_request_key
1468        .long sys_keyctl
1469        .long sys_ioprio_set
1470        .long sys_ioprio_get            /* 290 */
1471        .long sys_inotify_init
1472        .long sys_inotify_add_watch
1473        .long sys_inotify_rm_watch
1474        .long sys_migrate_pages
1475        .long sys_openat                /* 295 */
1476        .long sys_mkdirat
1477        .long sys_mknodat
1478        .long sys_fchownat
1479        .long sys_futimesat
1480        .long sys_fstatat64             /* 300 */
1481        .long sys_unlinkat
1482        .long sys_renameat
1483        .long sys_linkat
1484        .long sys_symlinkat
1485        .long sys_readlinkat            /* 305 */
1486        .long sys_fchmodat
1487        .long sys_faccessat
1488        .long sys_pselect6
1489        .long sys_ppoll
1490        .long sys_unshare               /* 310 */
1491        .long sys_set_robust_list
1492        .long sys_get_robust_list
1493        .long sys_splice
1494        .long sys_sync_file_range
1495        .long sys_tee                   /* 315 */
1496        .long sys_vmsplice
1497        .long sys_move_pages
1498        .long sys_getcpu
1499        .long sys_epoll_pwait
1500        .long sys_utimensat             /* 320 */
1501        .long sys_signalfd
1502        .long sys_timerfd_create
1503        .long sys_eventfd
1504        .long sys_fallocate
1505        .long sys_timerfd_settime       /* 325 */
1506        .long sys_timerfd_gettime
1507        .long sys_signalfd4
1508        .long sys_eventfd2
1509        .long sys_epoll_create1
1510        .long sys_dup3                  /* 330 */
1511        .long sys_pipe2
1512        .long sys_inotify_init1
1513        .long sys_preadv
1514        .long sys_pwritev
1515        .long sys_rt_tgsigqueueinfo     /* 335 */
1516        .long sys_perf_event_open
1517        .long sys_setns
1518
1519syscall_table_size = (. - sys_call_table)
1520