From owner-p4-projects Sun Mar 23 16:50:53 2003 Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 4106837B407; Sun, 23 Mar 2003 16:50:44 -0800 (PST) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id BAFED37B405 for ; Sun, 23 Mar 2003 16:50:43 -0800 (PST) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 5A5C443F75 for ; Sun, 23 Mar 2003 16:50:43 -0800 (PST) (envelope-from marcel@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.12.6/8.12.6) with ESMTP id h2O0oh0U001397 for ; Sun, 23 Mar 2003 16:50:43 -0800 (PST) (envelope-from marcel@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.6/8.12.6/Submit) id h2O0ogmQ001389 for perforce@freebsd.org; Sun, 23 Mar 2003 16:50:42 -0800 (PST) Date: Sun, 23 Mar 2003 16:50:42 -0800 (PST) Message-Id: <200303240050.h2O0ogmQ001389@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to marcel@freebsd.org using -f From: Marcel Moolenaar Subject: PERFORCE change 27270 for review To: Perforce Change Reviews Sender: owner-p4-projects@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG http://perforce.freebsd.org/chv.cgi?CH=27270 Change 27270 by marcel@marcel_nfs on 2003/03/23 16:50:13 Implement _get_caller_saved. This function saves the non-FP, non-stacked scratch registers. The primary (only?) use is to save the scratch registers at interruption and thus determines most of what can and cannot be done. In short: o We don't call this function. We jump to it and explicitly pass the return address to jump back to. o We don't pass arguments in the stacked registers, because we may not have a register stack usable. o We assume the function is called with register bank 0 selected and we have to save the registers in bank 1. This is normal procedure for interrupt handling. o We leave register bank 1 selected on exit. o Assume we cannot use the preserved registers because saving those requires the use of scratch registers, which we're trying to save here. Break the circular dependency with this assumption. Affected files ... .. //depot/projects/ia64_epc/sys/ia64/ia64/context.s#3 edit Differences ... ==== //depot/projects/ia64_epc/sys/ia64/ia64/context.s#3 (text+ko) ==== @@ -285,12 +285,142 @@ /* * _get_caller_saved * - * PRECONDITION: Must be called with register bank 0 selected - * POSTCONDITION: Will return with register bank 1 selected + * Does not follow runtime specification: + * inputs: r16 = pointer to struct _caller_saved + * r17 = return address (no call/ret semantics) + * precondition: Must be called with register bank 0 selected, + * + * postcondition: Will return with register bank 1 selected. */ -ENTRY(_get_caller_saved, 1) - br.ret.sptk rp +ENTRY(_get_caller_saved, 0) + mov r18=ar.unat + mov r19=r2 + add r2=8,r16 + mov r20=r3 + add r3=16,r16 + mov r21=r8 + ;; +{ .mmi + .mem.offset 8,0 + st8.spill [r2]=r19,16 // r2 + .mem.offset 16,0 + st8.spill [r3]=r20,16 // r3 + mov r8=r16 + ;; +} +{ .mmi + .mem.offset 24,0 + st8.spill [r2]=r21,16 // r8 + .mem.offset 32,0 + st8.spill [r3]=r9,16 // r9 + mov r9=r17 + ;; +} +{ .mmi + .mem.offset 40,0 + st8.spill [r2]=r10,16 // r10 + .mem.offset 48,0 + st8.spill [r3]=r11,16 // r11 + mov r10=r18 + ;; +} +{ .mmb + .mem.offset 56,0 + st8.spill [r2]=r14,16 // r14 + .mem.offset 64,0 + st8.spill [r3]=r15,16 // r15 + bsw.1 + ;; +} + /* We're using register bank 1 now. */ +{ .mmi + .mem.offset 72,0 + st8.spill [r2]=r16,16 // r16 + .mem.offset 80,0 + st8.spill [r3]=r17,16 // r17 + mov r14=b6 + ;; +} +{ .mmi + .mem.offset 88,0 + st8.spill [r2]=r18,16 // r18 + .mem.offset 96,0 + st8.spill [r3]=r19,16 // r19 + mov r15=b7 + ;; +} +{ .mmi + .mem.offset 104,0 + st8.spill [r2]=r20,16 // r20 + .mem.offset 112,0 + st8.spill [r3]=r21,16 // r21 + mov b6=r9 + ;; +} +{ .mmb + .mem.offset 120,0 + st8.spill [r2]=r22,16 // r22 + .mem.offset 128,0 + st8.spill [r3]=r23,16 // r23 + nop 0 + ;; +} +{ .mmi + .mem.offset 136,0 + st8.spill [r2]=r24,16 // r24 + .mem.offset 144,0 + st8.spill [r3]=r25,16 // r25 + nop 1 + ;; +} +{ .mmb + .mem.offset 152,0 + st8.spill [r2]=r26,16 // r26 + .mem.offset 160,0 + st8.spill [r3]=r27,16 // r27 + nop 2 + ;; +} +{ .mmi + .mem.offset 168,0 + st8.spill [r2]=r28,16 // r28 + .mem.offset 176,0 + st8.spill [r3]=r29,16 // r29 + nop 3 + ;; +} +{ .mmb + .mem.offset 184,0 + st8.spill [r2]=r30,16 // r30 + .mem.offset 192,0 + st8.spill [r3]=r31,16 // r31 + nop 4 + ;; +} +{ .mmi + st8 [r2]=r10,16 // unat (before) + mov r9=ar.unat + nop 5 + ;; +} +{ .mmb + st8 [r3]=r14,16 // b6 + st8 [r2]=r15,16 // b7 + nop 6 + ;; +} +{ .mmi + st8 [r8]=r9,16 // nat (after) + mov r10=ar.ccv + nop 7 + ;; +} +{ .mmb + st8 [r3]=r10 // ccv + st8 [r2]=r0 // __spare + br.sptk b6 ;; +} END(_get_caller_saved) /* To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe p4-projects" in the body of the message