Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page

RX631スタック領域等を保護するには?

IKUZOと申します、お伺いしたいのですが、
RX631でスタック領域を保護したいのですが、
MPUを使用するのでしょうか?
特権命令例外を使用するのでしょうか?
スタック領域というのは保護可能なんでしょうか?
スタック領域というのは簡単に壊すことができるので、
保護することができれば、安全ではないかと

  • In reply to NoMaY:

    NoMaYさん、うまくいかないので、実際動作しているかと'A'を画面に表示させるようにしたものですが

    前のソースに戻すと、これでやりますと、以下のようになりました。

    RX631スタック領域等を保護するには?-2.txt
    int cmd_test(char *str)
    {
    	int t[5];
    	int i;
    	for(i=0; i<20; i++){
    		t[i]=0;
    		(void)t[i];
    	}
    	return CMD_OK;
    }
    
    
    
    
    
    000017DB                         _cmd_test:
                                     		.STACK	_cmd_test=8
                                     		.LINE  "C:\Dev\BASE\RX63N\RX631\csp\csp\com.c",885
    000017DB FBE2CCCCADDE            		MOV.L #0DEADCCCCH, R14
    000017E1 7EAE                    		PUSH.L R14
    000017E3 754E14                  		MOV.L #00000014H, R14
    000017E6                         L1040:	; bb
                                     		.LINE  "C:\Dev\BASE\RX63N\RX631\csp\csp\com.c",889
    000017E6 601E                    		SUB #01H, R14
    000017E8 21rr                    		BNE L1040
    000017EA                         L1041:	; bb19
                                     		.LINE  "C:\Dev\BASE\RX63N\RX631\csp\csp\com.c",894
    000017EA EC0E                    		MOV.L [R0], R14
    000017EC 6601                    		MOV.L #00000000H, R1
    000017EE 740ECCCCADDE            		CMP #0DEADCCCCH, R14
    000017F4 18                   S  		BNE L1043
    000017F5                         L1042:	; bb19
    000017F5 6701                    		RTSD #04H
    000017F7                         L1043:	; bb19
    000017F7 04rrrrrr             A  		BRA ___stack_chk_fail
    000017FB                         _cmd_test2:
                                     		.STACK	_cmd_test2=8
                                     		.LINE  "C:\Dev\BASE\RX63N\RX631\csp\csp\com.c",896
    000017FB FBE2CCCCADDE            		MOV.L #0DEADCCCCH, R14
    00001801 7EAE                    		PUSH.L R14
                                     		.LINE  "C:\Dev\BASE\RX63N\RX631\csp\csp\com.c",899
    00001803 EC0E                    		MOV.L [R0], R14
    00001805 6601                    		MOV.L #00000000H, R1
    00001807 740ECCCCADDE            		CMP #0DEADCCCCH, R14
    0000180D 18                   S  		BNE L1046
    0000180E                         L1045:	; entry
    0000180E 6701                    		RTSD #04H
    00001810                         L1046:	; entry
    00001810 04rrrrrr             A  		BRA ___stack_chk_fail
    00001814                         _cmd_test3:
                                     		.STACK	_cmd_test3=8
                                     		.LINE  "C:\Dev\BASE\RX63N\RX631\csp\csp\com.c",901
    00001814 FBE2CCCCADDE            		MOV.L #0DEADCCCCH, R14
    0000181A 7EAE                    		PUSH.L R14
                                     		.LINE  "C:\Dev\BASE\RX63N\RX631\csp\csp\com.c",904
    0000181C EC0E                    		MOV.L [R0], R14
    0000181E 6601                    		MOV.L #00000000H, R1
    00001820 740ECCCCADDE            		CMP #0DEADCCCCH, R14
    00001826 18                   S  		BNE L1049
    00001827                         L1048:	; entry
    00001827 6701                    		RTSD #04H
    00001829                         L1049:	; entry
    00001829 04rrrrrr             A  		BRA ___stack_chk_fail
    

  • In reply to IKUZO:

    MOV.L #00000014H, R14で20を確かにレジスターセットして
    SUB #01H, R14 でデクリメント
    これを見るとなにもしていないのかな、ループしているだけ?

    コンパイラーの最適化が働いているのでしょうか、テストソースを見直してみます。

  • IKUZOさん、こんにちは。NoMaYです。

    リストファイルどうもです。

    >コンパイラーの最適化が働いているのでしょうか、
    そうです。コンパイラの最適化により t[i ]への書き込みが行われなくなっていますね。

    (1) 2つ前のはコンパイラの最適化によりfor節の内容が以下になっていて、IKUZOさんも気付かれたように、単にループしているだけですので、スタックは壊れないです。

        for(i=0; i<20; i++){
            t[i]=0;
            (void)t[i];
        }
    000017E3 754E14                         MOV.L #00000014H, R14
    000017E6                         L1040: ; bb
    000017E6 601E                           SUB #01H, R14
    000017E8 21rr                           BNE L1040

    (2) 1つ前のはコンパイラの最適化によりfor節の内容が以下になっていて、'A'(0x41)をt[i]に代入したりせず、'A'(0x41)を直接printf()の引数に積んでいますので、やはりスタックは壊れないです。

        for(i=0; i<20; i++){
            t[i]='A';
            printf("%c\r",t[i]);
        }
    000017E5 754614                         MOV.L #00000014H, R6
    000017E8 FB72rrrrrrrr                   MOV.L #_L87, R7
    000017EE                         L1040: ; bb
    000017EE 6080                           SUB #08H, R0
    000017F0 E307                           MOV.L R7, [R0]
    000017F2 3E0141                         MOV.L #00000041H, 04H[R0]
    000017F5 05rrrrrr             A         BSR _printf
    000017F9 6280                           ADD #08H, R0
    000017FB 6016                           SUB #01H, R6
    000017FD 21rr                           BNE L1040

     

  • In reply to NoMaY:

    NoMaYさん、いつもアドバイスありがとうございます、テストソースを見直してみました

    RX631スタック領域等を保護するには?-3.txt
    int cmd_test(char *str)
    {
    	char t[5];
    	int i;
    	for(i=0; i<20; i++){
    		t[i]=(char)'A'+i;
    	}
    	t[i]='\r';
    	t[i+1]=0;
    	printf((char*)&t);
    	return CMD_OK;
    }

    そうしましたら、動作しているようです

  • In reply to IKUZO:

    NoMaYさん、いつもアドバイスありがとうございます、
    「(1) 2つ前のはコンパイラの最適化によりfor節の内容が以下のみになっていますので
    スタックは壊れないです。」
    「(2) 1つ前のはコンパイラの最適化によりfor節の内容が以下になっていて、
    'A'(0x41)をt[i]に代入したりせず、'A'(0x41)を直接printf()の引数に積んでいますので、
    やはりスタックは壊れないです。」
    コンパイラーの最適化おそるべしですね、なるほどリストに出してみれば、わかるのですね、
    本当にいつもお世話になっています、ありがとうございます。
  • IKUZOさん、こんにちは。NoMaYです。

    >コンパイラーの最適化おそるべしですね、なるほどリストに出してみれば、わかるのですね
    これで、浮動小数点例外の件に続いて、またコンパイラーの最適化の落とし穴に落ちてしまいましたね。たぶん、E1を使っている方々は、CS+やe2 studioの表示をソース/逆アセンブルの混合表示にしたり、逆アセンブル表示にしたりして、割とすぐに気付くのではないかと思います。でも、IKUZOさんの今の基板ではE1が使えない状況だということですので、(E1が使えるように基板が改版されるまでの間は、) 何だかCPUの動きが意図したものと違うと感じたら、早々とリストファイルを確認するようにして行った方が良さそうな気がして来ました。

  • In reply to kijo:

    kijoさん、こんにちは。NoMaYです。

    正直に言うと、MPUの使い方が分って来たのが面白くて、すっかりそちらに気を取られていました。せっかく便利なツールがあるのに使わないのはもったいないですよね。

    Rulz(かふぇルネ)検索: Call Walker
    japan.renesasrulz.com/search?q=Call Walker&group=31#serpsort=date%20desc

    Rulz(かふぇルネ)検索: CallWalker
    japan.renesasrulz.com/search?q=CallWalker&group=31#serpsort=date%20desc

    Call Walkerを使って、手元のプロジェクトのスタックの使用量を求めてみました。以下の画面コピーのように、リンクオプションで [スタック使用量情報ファ イルを出力する] を [はい(-STACK)] に設定してビルドしてあれば、Call Walkerを起動するだけで即座に見積もってくれますね。






  • In reply to NoMaY:

    NoMaYさん、いつもアドバイスありがとうございます、
    「早々とリストファイルを確認するようにして行った方が良さそうな気がして来ました。」
    おっしゃるとうりです、
    CS+もHEWでSHを使用していたときよりも、簡単にわかりやすくなっているような気がします、
    今回スタック保護違反が検出できるということで、ありがたい思いです、
    製品に組み込むかは別にしても、プログラム品質をテストするには良い方法と思います
    簡単に組み込めるので(オプション設定を変えるだけ)、
    やってみられることを皆様に是非お勧めしたいと思いました。

    さん、ありがとうございました。

  • In reply to NoMaY:

    NoMaYさん、いつもアドバイスありがとうございます、
    Call Walkerの作成リスト表示はすごいですね
    一目瞭然というか、わかりやすいですね、こういう方法で調整個所を見極めるのですね
    ありがとうございました。

Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page