root/arch/alpha/kernel/entry.S

/* [previous][next][first][last][top][bottom][index][help] */
   1 /*
   2  * alpha/entry.S
   3  *
   4  * kernel entry-points
   5  */
   6 
   7 #include <asm/system.h>
   8 
   9 #define halt    .long PAL_halt
  10 #define rti     .long PAL_rti
  11 
  12 #define NR_SYSCALLS 310
  13 #define osf_vfork sys_fork
  14 
  15 /*
  16  * These offsets must match with "struct hae" in io.h:  
  17  */
  18 #define HAE_CACHE       0
  19 #define HAE_REG         8
  20 
  21 /*
  22  * stack offsets
  23  */
  24 #define SP_OFF          160
  25 
  26 #define SWITCH_STACK_SIZE 320
  27 
  28 /*
  29  * task structure offsets
  30  */
  31 #define TASK_STATE      0
  32 #define TASK_COUNTER    8
  33 #define TASK_PRIORITY   16
  34 #define TASK_SIGNAL     24
  35 #define TASK_BLOCKED    32
  36 #define TASK_FLAGS      40
  37 
  38 /*
  39  * This defines the normal kernel pt-regs layout.
  40  *
  41  * regs 9-15 preserved by C code
  42  * regs 16-18 saved by PAL-code
  43  * regs 29-30 saved and set up by PAL-code
  44  */
  45 #define SAVE_ALL                        \
  46         subq    $30,160,$30;            \
  47         stq     $0,0($30);              \
  48         stq     $1,8($30);              \
  49         stq     $2,16($30);             \
  50         stq     $3,24($30);             \
  51         stq     $4,32($30);             \
  52         stq     $5,40($30);             \
  53         stq     $6,48($30);             \
  54         stq     $7,56($30);             \
  55         stq     $8,64($30);             \
  56         stq     $19,72($30);            \
  57         stq     $20,80($30);            \
  58         stq     $21,88($30);            \
  59         stq     $22,96($30);            \
  60         stq     $23,104($30);           \
  61         stq     $24,112($30);           \
  62         stq     $25,120($30);           \
  63         stq     $26,128($30);           \
  64         stq     $27,136($30);           \
  65         stq     $28,144($30);           \
  66         lda     $2,hae;                 \
  67         ldq     $2,HAE_CACHE($2);       \
  68         stq     $2,152($30)
  69 
  70 #define RESTORE_ALL                     \
  71         lda     $8,hae;                 \
  72         ldq     $7,HAE_CACHE($8);       \
  73         ldq     $6,152($30);            \
  74         subq    $7,$6,$5;               \
  75         beq     $5,99f;                 \
  76         ldq     $7,HAE_REG($8);         \
  77         addq    $31,7,$16;              \
  78         call_pal PAL_swpipl;            \
  79         stq     $6,HAE_CACHE($8);       \
  80         stq     $6,0($7);               \
  81         mb;                             \
  82         bis     $0,$0,$16;              \
  83         call_pal PAL_swpipl;            \
  84 99:;                                    \
  85         ldq     $0,0($30);              \
  86         ldq     $1,8($30);              \
  87         ldq     $2,16($30);             \
  88         ldq     $3,24($30);             \
  89         ldq     $4,32($30);             \
  90         ldq     $5,40($30);             \
  91         ldq     $6,48($30);             \
  92         ldq     $7,56($30);             \
  93         ldq     $8,64($30);             \
  94         ldq     $19,72($30);            \
  95         ldq     $20,80($30);            \
  96         ldq     $21,88($30);            \
  97         ldq     $22,96($30);            \
  98         ldq     $23,104($30);           \
  99         ldq     $24,112($30);           \
 100         ldq     $25,120($30);           \
 101         ldq     $26,128($30);           \
 102         ldq     $27,136($30);           \
 103         ldq     $28,144($30);           \
 104         addq    $30,160,$30
 105 
 106 .text
 107 .set noat
 108 
 109 .align 3
 110 .globl  entInt
 111 .ent    entInt
 112 entInt:
 113         SAVE_ALL
 114 /* start atomic operation with respect to software interrupts */
 115         lda     $0,intr_count
 116         ldq     $1,0($0)
 117         addq    $1,1,$1
 118         stq     $1,0($0)
 119 /* set up the arguments to the C interrupt handler */
 120         lda     $27,do_entInt
 121         jsr     $26,($27),do_entInt
 122 /* ok, check if we need to do software interrupts */
 123 1:      lda     $0,intr_count
 124         ldq     $1,0($0)
 125         subq    $1,1,$1
 126         bne     $1,2f           /* interrupt within interrupt: return now */
 127         lda     $2,bh_active
 128         ldq     $3,0($2)
 129         lda     $2,bh_mask
 130         ldq     $2,0($2)
 131         and     $2,$3,$2
 132         bne     $2,3f
 133         stq     $1,0($0)
 134         br      $31,ret_from_sys_call
 135 .align 3
 136 2:      stq     $1,0($0)
 137         br      $31,restore_all
 138 .align 3
 139 3:      lda     $27,do_bottom_half
 140         jsr     $26,($27),do_bottom_half
 141         br      $31,1b
 142 .end entInt
 143 
 144 .align 3
 145 .globl  entMM
 146 .ent    entMM
 147 entMM:
 148         SAVE_ALL
 149         lda     $27,do_page_fault
 150         lda     $26,ret_from_sys_call
 151         jsr     $31,($27),do_page_fault
 152 .end entMM
 153 
 154 .align 3
 155 .globl  entArith
 156 .ent    entArith
 157 entArith:
 158         SAVE_ALL
 159         lda     $27,do_entArith
 160         lda     $26,ret_from_sys_call
 161         jsr     $31,($27),do_entArith
 162 .end entArith
 163 
 164 .align 3
 165 .globl  entIF
 166 .ent    entIF
 167 entIF:
 168         SAVE_ALL
 169         lda     $27,do_entIF
 170         lda     $26,ret_from_sys_call
 171         jsr     $31,($27),do_entIF
 172 .end entIF
 173 
 174 /*
 175  * Fork() is one of the special system calls: it needs to
 176  * save the callee-saved regs so that the regs can be found
 177  * for the new process.. We save them in the "context switch"
 178  * stack format (see arch/alpha/kernel/process.c).
 179  *
 180  * Also, for the kernel fork, we need to fake the system call
 181  * stack buildup, as we can't do system calls from kernel space.
 182  */
 183 .align 3
 184 .globl  kernel_fork
 185 .ent    kernel_fork
 186 kernel_fork:
 187         subq $30,6*8,$30
 188         stq $31,0($30)
 189         stq $26,8($30)
 190         stq $29,16($30)
 191         stq $16,24($30)
 192         stq $17,32($30)
 193         stq $18,40($30)
 194         SAVE_ALL
 195         lda $27,sys_fork
 196         jsr $26,($27),sys_fork
 197         br ret_from_sys_call
 198 .end    kernel_fork
 199 
 200 .align 3
 201 .ent    do_switch_stack
 202 do_switch_stack:
 203         lda $30,-SWITCH_STACK_SIZE($30)
 204         stq  $9,0($30)
 205         stq $10,8($30)
 206         stq $11,16($30)
 207         stq $12,24($30)
 208         stq $13,32($30)
 209         stq $14,40($30)
 210         stq $15,48($30)
 211         stq $26,56($30)
 212         stt $f0,64($30)
 213         stt $f1,72($30)
 214         stt $f2,80($30)
 215         stt $f3,88($30)
 216         stt $f4,96($30)
 217         stt $f5,104($30)
 218         stt $f6,112($30)
 219         stt $f7,120($30)
 220         stt $f8,128($30)
 221         stt $f9,136($30)
 222         stt $f10,144($30)
 223         stt $f11,152($30)
 224         stt $f12,160($30)
 225         stt $f13,168($30)
 226         stt $f14,176($30)
 227         stt $f15,184($30)
 228         stt $f16,192($30)
 229         stt $f17,200($30)
 230         stt $f18,208($30)
 231         stt $f19,216($30)
 232         stt $f20,224($30)
 233         stt $f21,232($30)
 234         stt $f22,240($30)
 235         stt $f23,248($30)
 236         stt $f24,256($30)
 237         stt $f25,264($30)
 238         stt $f26,272($30)
 239         stt $f27,280($30)
 240         stt $f28,288($30)
 241         stt $f29,296($30)
 242         stt $f30,304($30)
 243         ret $31,($0),1
 244 .end do_switch_stack
 245 
 246 .align 3
 247 .ent    undo_switch_stack
 248 undo_switch_stack:
 249         ldq  $9,0($30)
 250         ldq $10,8($30)
 251         ldq $11,16($30)
 252         ldq $12,24($30)
 253         ldq $13,32($30)
 254         ldq $14,40($30)
 255         ldq $15,48($30)
 256         ldq $26,56($30)
 257         ldt $f0,64($30)
 258         ldt $f1,72($30)
 259         ldt $f2,80($30)
 260         ldt $f3,88($30)
 261         ldt $f4,96($30)
 262         ldt $f5,104($30)
 263         ldt $f6,112($30)
 264         ldt $f7,120($30)
 265         ldt $f8,128($30)
 266         ldt $f9,136($30)
 267         ldt $f10,144($30)
 268         ldt $f11,152($30)
 269         ldt $f12,160($30)
 270         ldt $f13,168($30)
 271         ldt $f14,176($30)
 272         ldt $f15,184($30)
 273         ldt $f16,192($30)
 274         ldt $f17,200($30)
 275         ldt $f18,208($30)
 276         ldt $f19,216($30)
 277         ldt $f20,224($30)
 278         ldt $f21,232($30)
 279         ldt $f22,240($30)
 280         ldt $f23,248($30)
 281         ldt $f24,256($30)
 282         ldt $f25,264($30)
 283         ldt $f26,272($30)
 284         ldt $f27,280($30)
 285         ldt $f28,288($30)
 286         ldt $f29,296($30)
 287         ldt $f30,304($30)
 288         lda $30,SWITCH_STACK_SIZE($30)
 289         ret $31,($0),1
 290 .end undo_switch_stack
 291 
 292 .align 3
 293 .globl  entUna
 294 .ent    entUna
 295 entUna:
 296         lda $30,-256($30)
 297         stq $0,0($30)
 298         stq $1,8($30)
 299         stq $2,16($30)
 300         stq $3,24($30)
 301         stq $4,32($30)
 302         stq $5,40($30)
 303         stq $6,48($30)
 304         stq $7,56($30)
 305         stq $8,64($30)
 306         stq $9,72($30)
 307         stq $10,80($30)
 308         stq $11,88($30)
 309         stq $12,96($30)
 310         stq $13,104($30)
 311         stq $14,112($30)
 312         stq $15,120($30)
 313         /* 16-18 PAL-saved */
 314         stq $19,152($30)
 315         stq $20,160($30)
 316         stq $21,168($30)
 317         stq $22,176($30)
 318         stq $23,184($30)
 319         stq $24,192($30)
 320         stq $25,200($30)
 321         stq $26,208($30)
 322         stq $27,216($30)
 323         stq $28,224($30)
 324         stq $29,232($30)
 325         stq $30,240($30)
 326         stq $31,248($30)
 327         lda $27,do_entUna
 328         jsr $26,($27),do_entUna
 329         ldq $0,0($30)
 330         ldq $1,8($30)
 331         ldq $2,16($30)
 332         ldq $3,24($30)
 333         ldq $4,32($30)
 334         ldq $5,40($30)
 335         ldq $6,48($30)
 336         ldq $7,56($30)
 337         ldq $8,64($30)
 338         ldq $9,72($30)
 339         ldq $10,80($30)
 340         ldq $11,88($30)
 341         ldq $12,96($30)
 342         ldq $13,104($30)
 343         ldq $14,112($30)
 344         ldq $15,120($30)
 345         /* 16-18 PAL-saved */
 346         ldq $19,152($30)
 347         ldq $20,160($30)
 348         ldq $21,168($30)
 349         ldq $22,176($30)
 350         ldq $23,184($30)
 351         ldq $24,192($30)
 352         ldq $25,200($30)
 353         ldq $26,208($30)
 354         ldq $27,216($30)
 355         ldq $28,224($30)
 356         ldq $29,232($30)
 357         ldq $30,240($30)
 358         lda $30,256($30)
 359         rti
 360 .end entUna
 361 
 362 .align 3
 363 .globl  sys_fork
 364 .ent    sys_fork
 365 sys_fork:
 366         br $0,do_switch_stack
 367         bis $30,$30,$16
 368         lda $27,alpha_fork
 369         jsr $26,($27),alpha_fork
 370         br $0,undo_switch_stack
 371         ldq $0,0($30)
 372         ret $31,($26),1
 373 .end    sys_fork
 374 
 375 .align 3
 376 .globl  alpha_switch_to
 377 .ent    alpha_switch_to
 378 alpha_switch_to:
 379         br $0,do_switch_stack
 380         call_pal PAL_swpctx
 381         br $0,undo_switch_stack
 382         ret $31,($26),1
 383 .end alpha_switch_to
 384 
 385 /*
 386  * Oh, well.. Disassembling OSF/1 binaries to find out how the
 387  * system calls work isn't much fun.
 388  *
 389  * entSys is special in that the PAL-code doesn't save a0-a2, so
 390  * we start off by doing that by hand.
 391  */
 392 .align 3
 393 .globl  entSys
 394 .globl  ret_from_sys_call
 395 .ent    entSys
 396 entSys:
 397         stq     $16,24($30)
 398         stq     $17,32($30)
 399         stq     $18,40($30)
 400         SAVE_ALL
 401         lda     $1,NR_SYSCALLS($31)
 402         lda     $2,sys_call_table
 403         lda     $27,do_entSys
 404         cmpult  $0,$1,$1
 405         s8addq  $0,$2,$2
 406         beq     $1,1f
 407         ldq     $27,0($2)
 408 1:      jsr     $26,($27),do_entSys
 409         bis     $31,$31,$1
 410         bge     $0,2f
 411         bis     $31,$31,$26     /* tell "ret_from_sys_call" that we can restart */
 412         ldq     $19,0($30)      /* .. with this syscall nr */
 413         ldq     $20,72($30)     /* .. and this a3 */
 414         addq    $31,1,$1        /* set a3 for errno return */
 415         subq    $31,$0,$0       /* with error in v0 */
 416 2:      stq     $0,0($30)
 417         stq     $1,72($30)      /* a3 for return */
 418 .align 3
 419 ret_from_sys_call:
 420         ldq     $0,SP_OFF($30)
 421         cmovne  $26,0,$19
 422         and     $0,8,$0
 423         beq     $0,restore_all
 424 ret_from_reschedule:
 425         lda     $0,need_resched
 426         lda     $1,current
 427         ldl     $2,0($0)
 428         lda     $4,init_task
 429         ldq     $3,0($1)
 430         bne     $2,reschedule
 431         subq    $4,$3,$4
 432         beq     $4,restore_all
 433         ldq     $4,TASK_SIGNAL($3)
 434         ldq     $16,TASK_BLOCKED($3)
 435         bic     $4,$16,$4
 436         bne     $4,signal_return
 437 restore_all:
 438         RESTORE_ALL
 439         rti
 440 .align 3
 441 signal_return:
 442         bis     $30,$30,$17
 443         br      $0,do_switch_stack
 444         bis     $30,$30,$18
 445         lda     $27,do_signal
 446         jsr     $26,($27),do_signal
 447         lda     $30,SWITCH_STACK_SIZE($30)
 448         br      $31,restore_all
 449 .end entSys
 450 
 451 .align 3
 452 .ent reschedule
 453 reschedule:
 454         subq    $30,16,$30
 455         stq     $19,0($30)
 456         stq     $20,8($30)
 457         lda     $27,schedule
 458         jsr     $26,($27),schedule
 459         ldq     $19,0($30)
 460         ldq     $20,8($30)
 461         addq    $30,16,$30
 462         br      $31,ret_from_reschedule
 463 .end reschedule
 464 
 465 .align 3
 466 .ent sys_sigreturn
 467 sys_sigreturn:
 468         bis     $30,$30,$17
 469         lda     $30,-SWITCH_STACK_SIZE($30)
 470         bis     $30,$30,$18
 471         lda     $27,do_sigreturn
 472         jsr     $26,($27),do_sigreturn
 473         br      $0,undo_switch_stack
 474         br      $31,ret_from_sys_call
 475 .end sys_sigreturn
 476 
 477 .align 3
 478 .ent sys_sigsuspend
 479 sys_sigsuspend:
 480         bis     $30,$30,$17
 481         br      $0,do_switch_stack
 482         bis     $30,$30,$18
 483         lda     $27,do_sigsuspend
 484         jsr     $26,($27),do_sigsuspend
 485         lda     $30,SWITCH_STACK_SIZE($30)
 486         br      $31,ret_from_sys_call
 487 .end sys_sigreturn
 488 
 489         .align 3
 490         .globl sys_call_table
 491 sys_call_table:
 492 /*0*/   .quad do_entSys, sys_exit, sys_fork, sys_read, sys_write
 493         .quad do_entSys, sys_close, sys_wait4, do_entSys, sys_link
 494         .quad sys_unlink, do_entSys, sys_chdir, sys_fchdir, sys_mknod
 495         .quad sys_chmod, sys_chown, sys_brk, do_entSys, sys_lseek
 496         .quad sys_getxpid, osf_mount, osf_umount, sys_setuid, sys_getxuid
 497         .quad do_entSys, do_entSys, do_entSys, do_entSys, do_entSys
 498         .quad do_entSys, do_entSys, do_entSys, sys_access, do_entSys
 499         .quad do_entSys, sys_sync, sys_kill, do_entSys, sys_setpgid
 500         .quad do_entSys, sys_dup, sys_pipe, do_entSys, do_entSys
 501         .quad sys_open, do_entSys, sys_getxgid, osf_sigprocmask, do_entSys
 502 /*50*/  .quad do_entSys, do_entSys, do_entSys, do_entSys, sys_ioctl
 503         .quad do_entSys, do_entSys, sys_symlink, sys_readlink, sys_execve
 504         .quad sys_umask, do_entSys, do_entSys, sys_getpgrp, sys_getpagesize
 505         .quad do_entSys, osf_vfork, sys_newstat, sys_newlstat, do_entSys
 506         .quad do_entSys, osf_mmap, do_entSys, sys_munmap, sys_mprotect
 507         .quad sys_madvise, do_entSys, do_entSys, do_entSys, sys_getgroups
 508         /* map BSD's setpgrp to sys_setpgid for binary compatibility: */
 509         .quad sys_setgroups, do_entSys, sys_setpgid, sys_setitimer, do_entSys
 510         .quad do_entSys, sys_getitimer, sys_gethostname, sys_sethostname, sys_getdtablesize
 511         .quad sys_dup2, sys_newfstat, sys_fcntl, sys_select, do_entSys
 512         .quad sys_fsync, sys_setpriority, sys_socket, do_entSys, do_entSys
 513 /*100*/ .quad do_entSys, do_entSys, do_entSys, sys_sigreturn, sys_bind
 514         .quad do_entSys, sys_listen, do_entSys, do_entSys, do_entSys
 515         .quad do_entSys, sys_sigsuspend, do_entSys, do_entSys, do_entSys
 516         .quad do_entSys, sys_gettimeofday, sys_getrusage, do_entSys, do_entSys
 517         .quad do_entSys, do_entSys, sys_settimeofday, sys_fchown, sys_fchmod
 518         .quad do_entSys, sys_setreuid, sys_setregid, sys_rename, sys_truncate
 519         .quad sys_ftruncate, do_entSys, sys_setgid, do_entSys, do_entSys
 520         .quad do_entSys, sys_mkdir, sys_rmdir, sys_utimes, do_entSys
 521         .quad do_entSys, do_entSys, do_entSys, do_entSys, sys_getrlimit
 522         .quad sys_setrlimit, do_entSys, sys_setsid, do_entSys, do_entSys
 523 /*150*/ .quad do_entSys, do_entSys, do_entSys, do_entSys, do_entSys
 524         .quad do_entSys, sys_sigaction, do_entSys, do_entSys, osf_getdirentries
 525         .quad osf_statfs, osf_fstatfs, do_entSys, do_entSys, do_entSys
 526         .quad osf_getdomainname, do_entSys, do_entSys, do_entSys, do_entSys
 527         .quad do_entSys, do_entSys, do_entSys, do_entSys, do_entSys
 528         .quad do_entSys, do_entSys, do_entSys, do_entSys, do_entSys
 529         .quad do_entSys, do_entSys, do_entSys, do_entSys, do_entSys
 530         .quad do_entSys, do_entSys, do_entSys, do_entSys, do_entSys
 531         .quad do_entSys, do_entSys, do_entSys, do_entSys, do_entSys
 532         .quad do_entSys, do_entSys, do_entSys, do_entSys, osf_swapon
 533 /*200*/ .quad sys_msgctl, sys_msgget, sys_msgrcv, sys_msgsnd, sys_semctl
 534         .quad sys_semget, sys_semop, osf_utsname, do_entSys, osf_shmat
 535         .quad sys_shmctl, sys_shmdt, sys_shmget, do_entSys, do_entSys
 536         .quad do_entSys, do_entSys, do_entSys, do_entSys, do_entSys
 537         .quad do_entSys, do_entSys, do_entSys, do_entSys, do_entSys
 538         .quad do_entSys, do_entSys, do_entSys, do_entSys, do_entSys
 539         .quad do_entSys, do_entSys, do_entSys, do_entSys, do_entSys
 540         .quad do_entSys, do_entSys, do_entSys, do_entSys, do_entSys
 541         .quad do_entSys, do_entSys, do_entSys, do_entSys, do_entSys
 542         .quad do_entSys, do_entSys, do_entSys, do_entSys, do_entSys
 543 /*250*/ .quad do_entSys, osf_usleep_thread, do_entSys, do_entSys, do_entSys
 544         .quad do_entSys, do_entSys, do_entSys, do_entSys, do_entSys
 545         .quad do_entSys, do_entSys, do_entSys, do_entSys, do_entSys
 546         .quad do_entSys, do_entSys, do_entSys, do_entSys, do_entSys
 547         .quad do_entSys, do_entSys, do_entSys, do_entSys, do_entSys
 548         .quad do_entSys, do_entSys, do_entSys, do_entSys, do_entSys
 549         .quad do_entSys, do_entSys, do_entSys, do_entSys, do_entSys
 550         .quad do_entSys, do_entSys, do_entSys, do_entSys, do_entSys
 551         .quad do_entSys, do_entSys, do_entSys, do_entSys, do_entSys
 552         .quad do_entSys, do_entSys, do_entSys, do_entSys, do_entSys
 553 /* linux-specific system calls start at 300 */
 554 /*300*/ .quad sys_bdflush, sys_sethae, sys_mount, sys_adjtimex, sys_swapoff
 555         .quad do_entSys, do_entSys, do_entSys, do_entSys, do_entSys

/* [previous][next][first][last][top][bottom][index][help] */