From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 11968 invoked by alias); 29 Nov 2007 19:03:01 -0000 Received: (qmail 11918 invoked by uid 9707); 29 Nov 2007 19:03:01 -0000 Date: Thu, 29 Nov 2007 19:03:00 -0000 Message-ID: <20071129190301.11903.qmail@sourceware.org> From: jflavio@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Fixing 64 bit word loading for Power64, add CFI info and other minor issues. X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: bf8d1a49cb3923ca81180d014b9fd03eb699a10a X-Git-Newrev: c6bbbe730513c609fe78bb7f92c9cecab7b1aa33 Mailing-List: contact frysk-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: frysk-cvs-owner@sourceware.org Reply-To: frysk@sourceware.org X-SW-Source: 2007-q4/txt/msg00494.txt.bz2 The branch, master has been updated via c6bbbe730513c609fe78bb7f92c9cecab7b1aa33 (commit) from bf8d1a49cb3923ca81180d014b9fd03eb699a10a (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit c6bbbe730513c609fe78bb7f92c9cecab7b1aa33 Author: Jose Flavio Aguilar Paulino Date: Thu Nov 29 17:02:53 2007 -0200 Fixing 64 bit word loading for Power64, add CFI info and other minor issues. ----------------------------------------------------------------------- Summary of changes: frysk-imports/include/ChangeLog | 5 ++ frysk-imports/include/frysk-asm.h | 115 ++++++++++++++++++++----------------- 2 files changed, 68 insertions(+), 52 deletions(-) First 500 lines of diff: diff --git a/frysk-imports/include/ChangeLog b/frysk-imports/include/ChangeLog index d40a39a..74121b4 100644 --- a/frysk-imports/include/ChangeLog +++ b/frysk-imports/include/ChangeLog @@ -1,3 +1,8 @@ +2007-11-29 Jose Flavio Aguilar Paulino + + * frysk-asm.h: Fixed loading immediate 64 bit word for Power64, + fixed function prologue and epilogue and add call frame info. + 2007-10-03 Andrew Cagney * frysk-asm.h (SP) [__x8664__]: Fix typo, %4sp -> %rsp. diff --git a/frysk-imports/include/frysk-asm.h b/frysk-imports/include/frysk-asm.h index c13173e..06f930b 100644 --- a/frysk-imports/include/frysk-asm.h +++ b/frysk-imports/include/frysk-asm.h @@ -234,10 +234,10 @@ # define LOAD_IMMED_BYTE(DEST_REG,CONST) mov $CONST, DEST_REG #elif defined __x86_64__ # define LOAD_IMMED_BYTE(DEST_REG,CONST) mov $CONST, DEST_REG -#elif defined __powerpc__ -# define LOAD_IMMED_BYTE(DEST_REG,CONST) li DEST_REG, CONST #elif defined __powerpc64__ # define LOAD_IMMED_BYTE(DEST_REG,CONST) li DEST_REG, CONST +#elif defined __powerpc__ +# define LOAD_IMMED_BYTE(DEST_REG,CONST) li DEST_REG, CONST #else # warning "No load immediate instruction sequence defined" #endif @@ -246,9 +246,17 @@ # define LOAD_IMMED_WORD(DEST_REG,CONST) mov $CONST, DEST_REG #elif defined __x86_64__ # define LOAD_IMMED_WORD(DEST_REG,CONST) mov $CONST, DEST_REG -#elif defined __powerpc__ -# define LOAD_IMMED_WORD(DEST_REG,CONST) li DEST_REG, CONST #elif defined __powerpc64__ +// PowerPC instructions have a fixed length +// So in Power64 +// 64-bit immediate must be loaded in 16-bit pieces +# define LOAD_IMMED_WORD(DEST_REG,CONST) \ + lis DEST_REG, CONST@highest ; \ + ori DEST_REG, DEST_REG, CONST@higher ; \ + rldicr DEST_REG, DEST_REG, 32, 31 ; \ + oris DEST_REG, DEST_REG, CONST@h ; \ + ori DEST_REG, DEST_REG, CONST@l ; +#elif defined __powerpc__ # define LOAD_IMMED_WORD(DEST_REG,CONST) li DEST_REG, CONST #else # warning "No load immediate instruction sequence defined" @@ -286,10 +294,10 @@ # define ADD(DEST_REG, SOURCE_REG) addl DEST_REG, SOURCE_REG #elif defined __x86_64__ # define ADD(DEST_REG, SOURCE_REG) addq DEST_REG, SOURCE_REG +#elif defined __powerpc64__ +# define ADD(DEST_REG, SOURCE_REG) add DEST_REG, DEST_REG, SOURCE_REG #elif defined __powerpc__ -# define ADD(DEST_REG, SOURCE_REG) add DEST_REG, SOURCE_REG, DEST_REG -//#elif defined __powerpc64__ -//# define ADD(DEST_REG, SOURCE_REG) +# define ADD(DEST_REG, SOURCE_REG) add DEST_REG, DEST_REG, SOURCE_REG #else # warning "No register-add instruction defined" #endif @@ -298,10 +306,10 @@ # define SUB(DEST_REG, SOURCE_REG) subl DEST_REG, SOURCE_REG #elif defined __x86_64__ # define SUB(DEST_REG, SOURCE_REG) subq DEST_REG, SOURCE_REG +#elif defined __powerpc64__ +# define SUB(DEST_REG, SOURCE_REG) subf DEST_REG, SOURCE_REG, DEST_REG #elif defined __powerpc__ # define SUB(DEST_REG, SOURCE_REG) subf DEST_REG, SOURCE_REG, DEST_REG -//#elif defined __powerpc64__ -//# define SUB(DEST_REG, SOURCE_REG) #else # warning "No register-subtract instruction defined" #endif @@ -310,10 +318,10 @@ # define MOV(SOURCE_REG, DEST_REG) movl SOURCE_REG, DEST_REG #elif defined __x86_64__ # define MOV(SOURCE_REG, DEST_REG) movq SOURCE_REG, DEST_REG +#elif defined __powerpc64__ +# define MOV(SOURCE_REG, DEST_REG) mr DEST_REG, SOURCE_REG #elif defined __powerpc__ # define MOV(SOURCE_REG, DEST_REG) mr DEST_REG, SOURCE_REG -//#elif defined __powerpc64__ -//# define MOV(SOURCE_REG, DEST_REG) #else # warning "No register-move instruction defined" #endif @@ -481,17 +489,18 @@ # define FUNCTION_BEGIN(FUNC,SLOTS) SANE_FUNCTION_BEGIN(FUNC) #elif defined __x86_64__ # define FUNCTION_BEGIN(FUNC,SLOTS) SANE_FUNCTION_BEGIN(FUNC) -#elif defined __powerpc__ -# define FUNCTION_BEGIN(FUNC,SLOTS) SANE_FUNCTION_BEGIN(FUNC) #elif defined __powerpc64__ -# define FUNCTION_BEGIN(FUNC) \ +# define FUNCTION_BEGIN(FUNC,SLOTS) \ .section ".opd","aw" ; \ - .global FUNC ; \ .align 3 ; \ + .global FUNC ; \ FUNC: ; \ - .quad _##FUNC, .TOC.@tocbase, 0 ; \ + .quad ._##FUNC, .TOC.@tocbase, 0 ; \ .text ; \ - _##FUNC: + ._##FUNC: \ + .cfi_startproc; +#elif defined __powerpc__ +# define FUNCTION_BEGIN(FUNC,SLOTS) SANE_FUNCTION_BEGIN(FUNC) #else # warning "no function-begin defined" #endif @@ -508,17 +517,15 @@ .cfi_adjust_cfa_offset 8; \ movq %rsp, %rbp; \ .cfi_offset %rbp, -8 -#elif defined __powerpc__ +#elif defined __powerpc64__ # define FUNCTION_PROLOGUE(FUNC,SLOTS) \ - stwu 1, -32(1) ; \ - mflr 0 ; \ - stw 0, 36(1) ; \ - stw 31, 28(1) ; \ - mr 31, 1 ; \ - stw REG0, 12(31) ; \ - stw REG1, 16(31) ; \ - stw REG2, 20(31) ; \ - stw REG3, 24(31) + mflr 0 ; \ + std 31, -8(1) ; \ + .cfi_offset 31, -8 ; \ + std 0, 16(1) ; \ + .cfi_offset lr, 16 ; \ + stdu 1, -128(1) ; \ + .cfi_adjust_cfa_offset 128 ; #else # warning "No function-prologue compound instruction defined" #endif @@ -533,17 +540,12 @@ leave; \ .cfi_restore %rbp; \ .cfi_adjust_cfa_offset -8 -#elif defined __powerpc__ +#elif defined __powerpc64__ # define FUNCTION_EPILOGUE(FUNC,SLOTS) \ - lwz REG3, 24(31) ; \ - lwz REG2, 20(31) ; \ - lwz REG1, 16(31) ; \ - lwz REG0, 12(31) ; \ - lwz 11, 0(1) ; \ - lwz 0, 4(11) ; \ - mtlr 0 ; \ - lwz 31, -4(11) ; \ - mr 1, 11 + ld 1, 0(1) ; \ + ld 0, 16(1) ; \ + mtlr 0 ; \ + ld 31, -8(1) ; #else # warning "No function-epilogue instruction sequence defined" #endif @@ -552,10 +554,10 @@ # define FUNCTION_RETURN(FUNC,SLOTS) ret #elif defined __x86_64__ # define FUNCTION_RETURN(FUNC,SLOTS) ret -#elif defined __powerpc__ -# define FUNCTION_RETURN(FUNC,SLOTS) blr #elif defined __powerpc64__ # define FUNCTION_RETURN(FUNC,SLOTS) blr +#elif defined __powerpc__ +# define FUNCTION_RETURN(FUNC,SLOTS) blr #else # warning "No function-epilogue instruction sequence defined" #endif @@ -567,10 +569,10 @@ # define FUNCTION_END(FUNC,SLOTS) SANE_FUNCTION_END(FUNC) #elif defined __x86_64__ # define FUNCTION_END(FUNC,SLOTS) SANE_FUNCTION_END(FUNC) +#elif defined __powerpc64__ +# define FUNCTION_END(FUNC,SLOTS) SANE_FUNCTION_END(FUNC) #elif defined __powerpc__ # define FUNCTION_END(FUNC,SLOTS) SANE_FUNCTION_END(FUNC) -#elif defined __powerpc64__ -# define FUNCTION_END(FUNC,SLOTS) .size FUNC, .-_##FUNC #else # warning "No function-epilogue instruction sequence defined" #endif @@ -584,21 +586,29 @@ #elif defined __x86_64__ # define MAIN_PROLOGUE(SLOTS) \ FUNCTION_PROLOGUE (main, SLOTS); // ARGC, ARGV, and ENVP already in correct registers. -#elif defined __powerpc__ -//In PowerPC ABI argc comes by default in reg 3 (Frysk REG1) and argv in reg 4 (Frysk REG2) -#define MAIN_PROLOGUE(SLOTS) FUNCTION_PROLOGUE(main,SLOTS) #elif defined __powerpc64__ -#define MAIN_PROLOGUE(SLOTS) FUNCTION_PROLOGUE(main,SLOTS) +//In PowerPC ABI argc comes +//by default in reg 3 (Frysk REG1) +//and argv in reg 4 (Frysk REG2) +#define MAIN_PROLOGUE(SLOTS) \ + FUNCTION_PROLOGUE(main,SLOTS) +#elif defined __powerpc__ +#define MAIN_PROLOGUE(SLOTS) \ + FUNCTION_PROLOGUE(main,SLOTS) #endif #if defined __i386__ # define MAIN_EPILOGUE(SLOTS) FUNCTION_EPILOGUE(main,SLOTS) #elif defined __x86_64__ # define MAIN_EPILOGUE(SLOTS) FUNCTION_EPILOGUE(main,SLOTS) -#elif defined __powerpc__ -# define MAIN_EPILOGUE(SLOTS) FUNCTION_EPILOGUE(main,SLOTS) #elif defined __powerpc64__ -# define MAIN_EPILOGUE(SLOTS) FUNCTION_EPILOGUE(main,SLOTS) +# define MAIN_EPILOGUE(SLOTS) \ + mr 3, REG0; \ + FUNCTION_EPILOGUE(main,SLOTS) +#elif defined __powerpc__ +# define MAIN_EPILOGUE(SLOTS) \ + mr 3, REG0; \ + FUNCTION_EPILOGUE(main,SLOTS) #endif //#if defined __i386__ @@ -642,9 +652,10 @@ # define SYSCALL int $0x80 #elif defined __x86_64__ # define SYSCALL syscall +#elif defined __powerpc64__ +# define SYSCALL sc #elif defined __powerpc__ # define SYSCALL sc -//#elif defined __powerpc64__ #else # warning "No sys-call instruction sequence defined" #endif @@ -697,7 +708,7 @@ #elif defined __powerpc__ #define FRAMELESS_FUNCTION_BEGIN(FUNC) \ FUNC: \ - + .cfi_startproc; #else # warning "No frameless function beginning instructions defined" #endif @@ -720,9 +731,9 @@ #elif defined __x86_64__ #define FRAMELESS_FUNCTION_END(FUNC) \ .cfi_endproc -#elif defined __powerpc__ +#elif defined __powerpc64__ #define FRAMELESS_FUNCTION_END(FUNC) \ - blr + .cfi_endproc; #else # warning "No frameless function ending instructions defined" #endif hooks/post-receive -- frysk system monitor/debugger