~ubuntu-branches/ubuntu/trusty/linux-armadaxp/trusty

« back to all changes in this revision

Viewing changes to arch/s390/kernel/entry.S

  • Committer: Package Import Robot
  • Author(s): Michael Casadevall, Bryan Wu, Dann Frazier, Michael Casadeall
  • Date: 2012-03-10 15:00:54 UTC
  • mfrom: (1.1.1)
  • Revision ID: package-import@ubuntu.com-20120310150054-flugb39zon8vvgwe
Tags: 3.2.0-1600.1
[ Bryan Wu ]
* UBUNTU: import debian/debian.env and debian.armadaxp

[ Dann Frazier ]
* ARM: Armada XP: remove trailing '/' in dirnames in mvRules.mk

[ Michael Casadeall ]
* tools: add some tools for Marvell Armada XP processor
* kernel: timer tick hacking from Marvell
* kernel: Sheeva Errata: add delay on Sheeva when powering down
* net: add Marvell NFP netfilter
* net: socket and skb modifications made by Marvell
* miscdevice: add minor IDs for some Marvell Armada drivers
* fs: introduce memory pool for splice()
* video: EDID detection updates from Marvell Armada XP patchset
* video: backlight: add Marvell Dove LCD backlight driver
* video: display: add THS8200 display driver
* video: framebuffer: add Marvell Dove and Armada XP processor onchip LCD controller driver
* usbtest: add Interrupt transfer testing by Marvell Armada XP code
* usb: ehci: add support for Marvell EHCI controler
* tty/serial: 8250: add support for Marvell Armada XP processor and DeviceTree work
* rtc: add support for Marvell Armada XP onchip RTC controller
* net: pppoe: add Marvell ethernet NFP hook in PPPoE networking driver
* mtd: nand: add support for Marvell Armada XP Nand Flash Controller
* mtd: maps: add Marvell Armada XP specific map driver
* mmc: add support for Marvell Armada XP MMC/SD host controller
* i2c: add support for Marvell Armada XP onchip i2c bus controller
* hwmon: add Kconfig option for Armada XP onchip thermal sensor driver
* dmaengine: add Net DMA support for splice and update Marvell XOR DMA engine driver
* ata: add support for Marvell Armada XP SATA controller and update some quirks
* ARM: add Marvell Armada XP machine to mach-types
* ARM: oprofile: add support for Marvell PJ4B core
* ARM: mm: more ARMv6 switches for Marvell Armada XP
* ARM: remove static declaration to allow compilation
* ARM: alignment access fault trick
* ARM: mm: skip some fault fixing when run on NONE SMP ARMv6 mode during early abort event
* ARM: mm: add Marvell Sheeva CPU Architecture for PJ4B
* ARM: introduce optimized copy operation for Marvell Armada XP
* ARM: SAUCE: hardware breakpoint trick for Marvell Armada XP
* ARM: big endian and little endian tricks for Marvell Armada XP
* ARM: SAUCE: Add Marvell Armada XP build rules to arch/arm/kernel/Makefile
* ARM: vfp: add special handling for Marvell Armada XP
* ARM: add support for Marvell U-Boot
* ARM: add mv_controller_num for ARM PCI drivers
* ARM: add support for local PMUs, general SMP tweaks and cache flushing
* ARM: add Marvell device identifies in glue-proc.h
* ARM: add IPC driver support for Marvell platforms
* ARM: add DMA mapping for Marvell platforms
* ARM: add Sheeva errata and PJ4B code for booting
* ARM: update Kconfig and Makefile to include Marvell Armada XP platforms
* ARM: Armada XP: import LSP from Marvell for Armada XP 3.2 kernel enablement

Show diffs side-by-side

added added

removed removed

Lines of Context:
9
9
 *               Heiko Carstens <heiko.carstens@de.ibm.com>
10
10
 */
11
11
 
 
12
#include <linux/init.h>
12
13
#include <linux/linkage.h>
13
 
#include <linux/init.h>
14
14
#include <asm/cache.h>
15
15
#include <asm/errno.h>
16
16
#include <asm/ptrace.h>
43
43
SP_R14       =  STACK_FRAME_OVERHEAD + __PT_GPRS + 56
44
44
SP_R15       =  STACK_FRAME_OVERHEAD + __PT_GPRS + 60
45
45
SP_ORIG_R2   =  STACK_FRAME_OVERHEAD + __PT_ORIG_GPR2
46
 
SP_ILC       =  STACK_FRAME_OVERHEAD + __PT_ILC
47
 
SP_SVCNR     =  STACK_FRAME_OVERHEAD + __PT_SVCNR
 
46
SP_SVC_CODE  =  STACK_FRAME_OVERHEAD + __PT_SVC_CODE
48
47
SP_SIZE      =  STACK_FRAME_OVERHEAD + __PT_SIZE
49
48
 
50
49
_TIF_WORK_SVC = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \
51
 
                 _TIF_MCCK_PENDING | _TIF_RESTART_SVC | _TIF_PER_TRAP )
 
50
                 _TIF_MCCK_PENDING | _TIF_PER_TRAP )
52
51
_TIF_WORK_INT = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \
53
52
                 _TIF_MCCK_PENDING)
54
 
_TIF_SYSCALL = (_TIF_SYSCALL_TRACE>>8 | _TIF_SYSCALL_AUDIT>>8 | \
55
 
                _TIF_SECCOMP>>8 | _TIF_SYSCALL_TRACEPOINT>>8)
 
53
_TIF_TRACE    = (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | _TIF_SECCOMP | \
 
54
                 _TIF_SYSCALL_TRACEPOINT)
56
55
 
57
56
STACK_SHIFT = PAGE_SHIFT + THREAD_ORDER
58
57
STACK_SIZE  = 1 << STACK_SHIFT
197
196
 * Returns:
198
197
 *  gpr2 = prev
199
198
 */
200
 
        .globl  __switch_to
201
 
__switch_to:
 
199
ENTRY(__switch_to)
202
200
        basr    %r1,0
203
201
0:      l       %r4,__THREAD_info(%r2)          # get thread_info of prev
204
202
        l       %r5,__THREAD_info(%r3)          # get thread_info of next
224
222
 * are executed with interrupts enabled.
225
223
 */
226
224
 
227
 
        .globl  system_call
228
 
system_call:
 
225
ENTRY(system_call)
229
226
        stpt    __LC_SYNC_ENTER_TIMER
230
227
sysc_saveall:
231
228
        SAVE_ALL_SVC __LC_SVC_OLD_PSW,__LC_SAVE_AREA
232
229
        CREATE_STACK_FRAME __LC_SAVE_AREA
 
230
        l       %r12,__LC_THREAD_INFO   # load pointer to thread_info struct
233
231
        mvc     SP_PSW(8,%r15),__LC_SVC_OLD_PSW
234
 
        mvc     SP_ILC(4,%r15),__LC_SVC_ILC
235
 
        l       %r12,__LC_THREAD_INFO   # load pointer to thread_info struct
 
232
        mvc     SP_SVC_CODE(4,%r15),__LC_SVC_ILC
 
233
        oi      __TI_flags+3(%r12),_TIF_SYSCALL
236
234
sysc_vtime:
237
235
        UPDATE_VTIME __LC_EXIT_TIMER,__LC_SYNC_ENTER_TIMER,__LC_USER_TIMER
238
236
sysc_stime:
241
239
        mvc     __LC_LAST_UPDATE_TIMER(8),__LC_SYNC_ENTER_TIMER
242
240
sysc_do_svc:
243
241
        xr      %r7,%r7
244
 
        icm     %r7,3,SP_SVCNR(%r15)    # load svc number and test for svc 0
 
242
        icm     %r7,3,SP_SVC_CODE+2(%r15)# load svc number and test for svc 0
245
243
        bnz     BASED(sysc_nr_ok)       # svc number > 0
246
244
        # svc 0: system call number in %r1
247
245
        cl      %r1,BASED(.Lnr_syscalls)
248
246
        bnl     BASED(sysc_nr_ok)
249
 
        sth     %r1,SP_SVCNR(%r15)
 
247
        sth     %r1,SP_SVC_CODE+2(%r15)
250
248
        lr      %r7,%r1           # copy svc number to %r7
251
249
sysc_nr_ok:
252
250
        sll     %r7,2             # svc number *4
253
251
        l       %r10,BASED(.Lsysc_table)
254
 
        tm      __TI_flags+2(%r12),_TIF_SYSCALL
 
252
        tm      __TI_flags+2(%r12),_TIF_TRACE >> 8
255
253
        mvc     SP_ARGS(4,%r15),SP_R7(%r15)
256
254
        l       %r8,0(%r7,%r10)   # get system call addr.
257
255
        bnz     BASED(sysc_tracesys)
261
259
sysc_return:
262
260
        LOCKDEP_SYS_EXIT
263
261
sysc_tif:
 
262
        tm      SP_PSW+1(%r15),0x01     # returning to user ?
 
263
        bno     BASED(sysc_restore)
264
264
        tm      __TI_flags+3(%r12),_TIF_WORK_SVC
265
265
        bnz     BASED(sysc_work)  # there is work to do (signals etc.)
 
266
        ni      __TI_flags+3(%r12),255-_TIF_SYSCALL
266
267
sysc_restore:
267
268
        RESTORE_ALL __LC_RETURN_PSW,1
268
269
sysc_done:
269
270
 
270
271
#
271
 
# There is work to do, but first we need to check if we return to userspace.
 
272
# One of the work bits is on. Find out which one.
272
273
#
273
274
sysc_work:
274
 
        tm      SP_PSW+1(%r15),0x01     # returning to user ?
275
 
        bno     BASED(sysc_restore)
276
 
 
277
 
#
278
 
# One of the work bits is on. Find out which one.
279
 
#
280
 
sysc_work_tif:
281
275
        tm      __TI_flags+3(%r12),_TIF_MCCK_PENDING
282
276
        bo      BASED(sysc_mcck_pending)
283
277
        tm      __TI_flags+3(%r12),_TIF_NEED_RESCHED
286
280
        bo      BASED(sysc_sigpending)
287
281
        tm      __TI_flags+3(%r12),_TIF_NOTIFY_RESUME
288
282
        bo      BASED(sysc_notify_resume)
289
 
        tm      __TI_flags+3(%r12),_TIF_RESTART_SVC
290
 
        bo      BASED(sysc_restart)
291
283
        tm      __TI_flags+3(%r12),_TIF_PER_TRAP
292
284
        bo      BASED(sysc_singlestep)
293
285
        b       BASED(sysc_return)      # beware of critical section cleanup
316
308
        la      %r2,SP_PTREGS(%r15)     # load pt_regs
317
309
        l       %r1,BASED(.Ldo_signal)
318
310
        basr    %r14,%r1                # call do_signal
319
 
        tm      __TI_flags+3(%r12),_TIF_RESTART_SVC
320
 
        bo      BASED(sysc_restart)
321
 
        tm      __TI_flags+3(%r12),_TIF_PER_TRAP
322
 
        bo      BASED(sysc_singlestep)
323
 
        b       BASED(sysc_return)
 
311
        tm      __TI_flags+3(%r12),_TIF_SYSCALL
 
312
        bno     BASED(sysc_return)
 
313
        lm      %r2,%r6,SP_R2(%r15)     # load svc arguments
 
314
        xr      %r7,%r7                 # svc 0 returns -ENOSYS
 
315
        clc     SP_SVC_CODE+2(2,%r15),BASED(.Lnr_syscalls+2)
 
316
        bnl     BASED(sysc_nr_ok)       # invalid svc number -> do svc 0
 
317
        icm     %r7,3,SP_SVC_CODE+2(%r15)# load new svc number
 
318
        b       BASED(sysc_nr_ok)       # restart svc
324
319
 
325
320
#
326
321
# _TIF_NOTIFY_RESUME is set, call do_notify_resume
331
326
        la      %r14,BASED(sysc_return)
332
327
        br      %r1                     # call do_notify_resume
333
328
 
334
 
 
335
 
#
336
 
# _TIF_RESTART_SVC is set, set up registers and restart svc
337
 
#
338
 
sysc_restart:
339
 
        ni      __TI_flags+3(%r12),255-_TIF_RESTART_SVC # clear TIF_RESTART_SVC
340
 
        l       %r7,SP_R2(%r15)         # load new svc number
341
 
        mvc     SP_R2(4,%r15),SP_ORIG_R2(%r15) # restore first argument
342
 
        lm      %r2,%r6,SP_R2(%r15)     # load svc arguments
343
 
        sth     %r7,SP_SVCNR(%r15)
344
 
        b       BASED(sysc_nr_ok)       # restart svc
345
 
 
346
329
#
347
330
# _TIF_PER_TRAP is set, call do_per_trap
348
331
#
349
332
sysc_singlestep:
350
 
        ni      __TI_flags+3(%r12),255-_TIF_PER_TRAP # clear TIF_PER_TRAP
351
 
        xc      SP_SVCNR(2,%r15),SP_SVCNR(%r15)         # clear svc number
 
333
        ni      __TI_flags+3(%r12),255-(_TIF_SYSCALL | _TIF_PER_TRAP)
352
334
        la      %r2,SP_PTREGS(%r15)     # address of register-save area
353
335
        l       %r1,BASED(.Lhandle_per) # load adr. of per handler
354
336
        la      %r14,BASED(sysc_return) # load adr. of system return
363
345
        la      %r2,SP_PTREGS(%r15)     # load pt_regs
364
346
        la      %r3,0
365
347
        xr      %r0,%r0
366
 
        icm     %r0,3,SP_SVCNR(%r15)
 
348
        icm     %r0,3,SP_SVC_CODE(%r15)
367
349
        st      %r0,SP_R2(%r15)
368
350
        basr    %r14,%r1
369
351
        cl      %r2,BASED(.Lnr_syscalls)
378
360
        basr    %r14,%r8                # call sys_xxx
379
361
        st      %r2,SP_R2(%r15)         # store return value
380
362
sysc_tracenogo:
381
 
        tm      __TI_flags+2(%r12),_TIF_SYSCALL
 
363
        tm      __TI_flags+2(%r12),_TIF_TRACE >> 8
382
364
        bz      BASED(sysc_return)
383
365
        l       %r1,BASED(.Ltrace_exit)
384
366
        la      %r2,SP_PTREGS(%r15)     # load pt_regs
388
370
#
389
371
# a new process exits the kernel with ret_from_fork
390
372
#
391
 
        .globl  ret_from_fork
392
 
ret_from_fork:
 
373
ENTRY(ret_from_fork)
393
374
        l       %r13,__LC_SVC_NEW_PSW+4
394
375
        l       %r12,__LC_THREAD_INFO   # load pointer to thread_info struct
395
376
        tm      SP_PSW+1(%r15),0x01     # forking a kernel thread ?
405
386
# kernel_execve function needs to deal with pt_regs that is not
406
387
# at the usual place
407
388
#
408
 
        .globl  kernel_execve
409
 
kernel_execve:
 
389
ENTRY(kernel_execve)
410
390
        stm     %r12,%r15,48(%r15)
411
391
        lr      %r14,%r15
412
392
        l       %r13,__LC_SVC_NEW_PSW+4
438
418
 * Program check handler routine
439
419
 */
440
420
 
441
 
        .globl  pgm_check_handler
442
 
pgm_check_handler:
 
421
ENTRY(pgm_check_handler)
443
422
/*
444
423
 * First we need to check for a special case:
445
424
 * Single stepping an instruction that disables the PER event mask will
459
438
        bnz     BASED(pgm_per)          # got per exception -> special case
460
439
        SAVE_ALL_PGM __LC_PGM_OLD_PSW,__LC_SAVE_AREA
461
440
        CREATE_STACK_FRAME __LC_SAVE_AREA
462
 
        xc      SP_ILC(4,%r15),SP_ILC(%r15)
463
441
        mvc     SP_PSW(8,%r15),__LC_PGM_OLD_PSW
464
442
        l       %r12,__LC_THREAD_INFO   # load pointer to thread_info struct
465
443
        tm      SP_PSW+1(%r15),0x01     # interrupting from user ?
535
513
pgm_svcper:
536
514
        SAVE_ALL_PGM __LC_SVC_OLD_PSW,__LC_SAVE_AREA
537
515
        CREATE_STACK_FRAME __LC_SAVE_AREA
 
516
        l       %r12,__LC_THREAD_INFO   # load pointer to thread_info struct
538
517
        mvc     SP_PSW(8,%r15),__LC_SVC_OLD_PSW
539
 
        mvc     SP_ILC(4,%r15),__LC_SVC_ILC
540
 
        l       %r12,__LC_THREAD_INFO   # load pointer to thread_info struct
 
518
        mvc     SP_SVC_CODE(4,%r15),__LC_SVC_ILC
 
519
        oi      __TI_flags+3(%r12),(_TIF_SYSCALL | _TIF_PER_TRAP)
541
520
        UPDATE_VTIME __LC_EXIT_TIMER,__LC_SYNC_ENTER_TIMER,__LC_USER_TIMER
542
521
        UPDATE_VTIME __LC_LAST_UPDATE_TIMER,__LC_EXIT_TIMER,__LC_SYSTEM_TIMER
543
522
        mvc     __LC_LAST_UPDATE_TIMER(8),__LC_SYNC_ENTER_TIMER
545
524
        mvc     __THREAD_per_cause(2,%r8),__LC_PER_CAUSE
546
525
        mvc     __THREAD_per_address(4,%r8),__LC_PER_ADDRESS
547
526
        mvc     __THREAD_per_paid(1,%r8),__LC_PER_PAID
548
 
        oi      __TI_flags+3(%r12),_TIF_PER_TRAP # set TIF_PER_TRAP
549
527
        stosm   __SF_EMPTY(%r15),0x03   # reenable interrupts
550
528
        lm      %r2,%r6,SP_R2(%r15)     # load svc arguments
551
529
        b       BASED(sysc_do_svc)
555
533
#
556
534
kernel_per:
557
535
        REENABLE_IRQS
558
 
        xc      SP_SVCNR(2,%r15),SP_SVCNR(%r15)
559
536
        la      %r2,SP_PTREGS(%r15)     # address of register-save area
560
537
        l       %r1,BASED(.Lhandle_per) # load adr. of per handler
561
538
        basr    %r14,%r1                # branch to do_single_step
565
542
 * IO interrupt handler routine
566
543
 */
567
544
 
568
 
        .globl io_int_handler
569
 
io_int_handler:
 
545
ENTRY(io_int_handler)
570
546
        stck    __LC_INT_CLOCK
571
547
        stpt    __LC_ASYNC_ENTER_TIMER
572
548
        SAVE_ALL_ASYNC __LC_IO_OLD_PSW,__LC_SAVE_AREA+16
703
679
 * External interrupt handler routine
704
680
 */
705
681
 
706
 
        .globl  ext_int_handler
707
 
ext_int_handler:
 
682
ENTRY(ext_int_handler)
708
683
        stck    __LC_INT_CLOCK
709
684
        stpt    __LC_ASYNC_ENTER_TIMER
710
685
        SAVE_ALL_ASYNC __LC_EXT_OLD_PSW,__LC_SAVE_AREA+16
731
706
 * Machine check handler routines
732
707
 */
733
708
 
734
 
        .globl mcck_int_handler
735
 
mcck_int_handler:
 
709
ENTRY(mcck_int_handler)
736
710
        stck    __LC_MCCK_CLOCK
737
711
        spt     __LC_CPU_TIMER_SAVE_AREA        # revalidate cpu timer
738
712
        lm      %r0,%r15,__LC_GPREGS_SAVE_AREA  # revalidate gprs
818
792
 */
819
793
#ifdef CONFIG_SMP
820
794
        __CPUINIT
821
 
        .globl restart_int_handler
822
 
restart_int_handler:
 
795
ENTRY(restart_int_handler)
823
796
        basr    %r1,0
824
797
restart_base:
825
798
        spt     restart_vtime-restart_base(%r1)
848
821
/*
849
822
 * If we do not run with SMP enabled, let the new CPU crash ...
850
823
 */
851
 
        .globl restart_int_handler
852
 
restart_int_handler:
 
824
ENTRY(restart_int_handler)
853
825
        basr    %r1,0
854
826
restart_base:
855
827
        lpsw    restart_crash-restart_base(%r1)
859
831
restart_go:
860
832
#endif
861
833
 
 
834
#
 
835
# PSW restart interrupt handler
 
836
#
 
837
ENTRY(psw_restart_int_handler)
 
838
        st      %r15,__LC_SAVE_AREA+48(%r0)     # save r15
 
839
        basr    %r15,0
 
840
0:      l       %r15,.Lrestart_stack-0b(%r15)   # load restart stack
 
841
        l       %r15,0(%r15)
 
842
        ahi     %r15,-SP_SIZE                   # make room for pt_regs
 
843
        stm     %r0,%r14,SP_R0(%r15)            # store gprs %r0-%r14 to stack
 
844
        mvc     SP_R15(4,%r15),__LC_SAVE_AREA+48(%r0)# store saved %r15 to stack
 
845
        mvc     SP_PSW(8,%r15),__LC_RST_OLD_PSW(%r0) # store restart old psw
 
846
        xc      __SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15) # set backchain to 0
 
847
        basr    %r14,0
 
848
1:      l       %r14,.Ldo_restart-1b(%r14)
 
849
        basr    %r14,%r14
 
850
 
 
851
        basr    %r14,0                          # load disabled wait PSW if
 
852
2:      lpsw    restart_psw_crash-2b(%r14)      # do_restart returns
 
853
        .align 4
 
854
.Ldo_restart:
 
855
        .long   do_restart
 
856
.Lrestart_stack:
 
857
        .long   restart_stack
 
858
        .align 8
 
859
restart_psw_crash:
 
860
        .long   0x000a0000,0x00000000 + restart_psw_crash
 
861
 
862
862
        .section .kprobes.text, "ax"
863
863
 
864
864
#ifdef CONFIG_CHECK_STACK
947
947
        s       %r15,BASED(.Lc_spsize)  # make room for registers & psw
948
948
        st      %r15,12(%r12)
949
949
        CREATE_STACK_FRAME __LC_SAVE_AREA
950
 
        mvc     SP_PSW(8,%r15),__LC_SVC_OLD_PSW
951
 
        mvc     SP_ILC(4,%r15),__LC_SVC_ILC
952
950
        mvc     0(4,%r12),__LC_THREAD_INFO
 
951
        l       %r12,__LC_THREAD_INFO
 
952
        mvc     SP_PSW(8,%r15),__LC_SVC_OLD_PSW
 
953
        mvc     SP_SVC_CODE(4,%r15),__LC_SVC_ILC
 
954
        oi      __TI_flags+3(%r12),_TIF_SYSCALL
953
955
cleanup_vtime:
954
956
        clc     __LC_RETURN_PSW+4(4),BASED(cleanup_system_call_insn+12)
955
957
        bhe     BASED(cleanup_stime)