- Timestamp:
- May 22, 2019, 10:03:37 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/plugin/HRPSVCPlugin.rb
-
Property svn:mime-type
changed from
text/x-ruby
totext/x-ruby;charset=UTF-8
r388 r389 6 6 # Copyright (C) 2008-2018 by TOPPERS Project 7 7 #-- 8 # ä¸è¨èä½æ¨©è 9 ã¯ï¼ä»¥ä¸ã®(1)ï½(4)ã®æ¡ä»¶ãæºããå ´åã«éãï¼æ¬ã½ããã¦ã§ 10 # ã¢ï¼æ¬ã½ããã¦ã§ã¢ãæ¹å¤ãããã®ãå«ãï¼ä»¥ä¸åãï¼ã使ç¨ã»è¤è£½ã»æ¹ 11 # å¤ã»åé 12 å¸ï¼ä»¥ä¸ï¼å©ç¨ã¨å¼ã¶ï¼ãããã¨ãç¡åã§è¨±è«¾ããï¼ 13 # (1) æ¬ã½ããã¦ã§ã¢ãã½ã¼ã¹ã³ã¼ãã®å½¢ã§å©ç¨ããå ´åã«ã¯ï¼ä¸è¨ã®èä½ 14 # 権表示ï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãï¼ãã®ã¾ã¾ã®å½¢ã§ã½ã¼ 15 # ã¹ã³ã¼ãä¸ã«å«ã¾ãã¦ãããã¨ï¼ 16 # (2) æ¬ã½ããã¦ã§ã¢ãï¼ã©ã¤ãã©ãªå½¢å¼ãªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 17 # ç¨ã§ããå½¢ã§åé 18 å¸ããå ´åã«ã¯ï¼åé 19 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨ 20 # è 21 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®èä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ 22 # ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 23 # (3) æ¬ã½ããã¦ã§ã¢ãï¼æ©å¨ã«çµã¿è¾¼ããªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 24 # ç¨ã§ããªãå½¢ã§åé 25 å¸ããå ´åã«ã¯ï¼æ¬¡ã®ããããã®æ¡ä»¶ãæºããã 26 # ã¨ï¼ 27 # (a) åé 28 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨è 29 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®è 30 # ä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 31 # (b) åé 32 å¸ã®å½¢æ 33 ãï¼å¥ã«å®ããæ¹æ³ã«ãã£ã¦ï¼TOPPERSããã¸ã§ã¯ãã« 34 # å ±åãããã¨ï¼ 35 # (4) æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ 36 # 害ãããï¼ä¸è¨èä½æ¨©è 37 ããã³TOPPERSããã¸ã§ã¯ããå 38 責ãããã¨ï¼ 39 # ã¾ãï¼æ¬ã½ããã¦ã§ã¢ã®ã¦ã¼ã¶ã¾ãã¯ã¨ã³ãã¦ã¼ã¶ããã®ãããªãç 40 # ç±ã«åºã¥ãè«æ±ãããï¼ä¸è¨èä½æ¨©è 41 ããã³TOPPERSããã¸ã§ã¯ãã 42 # å 43 責ãããã¨ï¼ 8 # 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ 9 # ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 10 # 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 11 # (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 12 # 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 13 # スコード中に含まれていること. 14 # (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 15 # 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 16 # 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 17 # の無保証規定を掲載すること. 18 # (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 19 # 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 20 # と. 21 # (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 22 # 作権表示,この利用条件および下記の無保証規定を掲載すること. 23 # (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 24 # 報告すること. 25 # (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 26 # 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 27 # また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 28 # 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 29 # 免責すること. 44 30 # 45 # æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨èä½æ¨©è 46 ã 47 # ãã³TOPPERSããã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ç¹å®ã®ä½¿ç¨ç®ç 48 # ã«å¯¾ããé©åæ§ãå«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§ 49 # ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ害ã«é¢ãã¦ãï¼ã 50 # ã®è²¬ä»»ãè² ããªãï¼ 31 # 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 32 # よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 33 # に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 34 # アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 35 # の責任を負わない. 51 36 # 52 37 # $Id$ 53 38 #++ 54 39 55 # mikan through plugin: namespace ãèæ 56 ®ããã¦ããªã 57 # ãããå©ç¨ããå ´åã以ä¸ã®ããã« toppers_jsp.cdl sChannel.cdl ãæå®ããå¿ 58 è¦ããã 40 # mikan through plugin: namespace が考慮されていない 41 # これを利用する場合、以下のように toppers_jsp.cdl sChannel.cdl を指定する必要がある 59 42 # tecsgen toppers_jsp.cdl sChannel.cdl your_description.cdl 60 43 61 # 以ä¸ãä»®å®ï¼å¶éäºé 62 ï¼ 63 # å¼ã³å 64 ãå¼ã³å 65 ã®ã¨ã³ãã£ã¢ã³ãchar, short, int_t, long_t, intptr_t ã®ãµã¤ãºãåã 66 # æ符å·ãç¡ç¬¦å·ã§ãµã¤ãºãåã 44 # 以下を仮定(制限事項) 45 # 呼び元、呼び先のエンディアン、char, short, int_t, long_t, intptr_t のサイズが同じ 46 # 有符号、無符号でサイズが同じ 67 47 68 48 class SVCManage 69 49 # 70 # @@id: TECS ã®ãã©ã°ã¤ã³ã§çæããæ¡å¼µãµã¼ãã¹ã³ã¼ã«ã«å²ãå½ã¦ãid71 # å®éã®æ¡å¼µãµã¼ãã¹ã³ã¼ã«IDã¯ï¼TFN_TECSGEN_ORIGINã§ä¸é§ã72 # å±¥ãããå¤ã¨ãªã73 # TFN_TECSGEN_ORIGIN ã¯ï¼hrp3/include/extsvc_fncode.h ã§å®ç¾©74 # ããã75 # @@func_ids: æ¡å¼µãµã¼ãã¹ã³ã¼ã«ã®é¢æ°åã¨æ¡å¼µãµã¼ãã¹ã³ã¼ã«IDã76 # ããã対å¿ã¥ããããã·ã¥50 # @@id: TECSのプラグインで生成した拡張サービスコールに割り当てるid 51 # 実際の拡張サービスコールIDは,TFN_TECSGEN_ORIGINで下駄を 52 # 履かせた値となる 53 # TFN_TECSGEN_ORIGINは,hrp3/include/extsvc_fncode.h で定義 54 # される 55 # @@func_ids: 拡張サービスコールの関数名と拡張サービスコールIDを 56 # 対応づけるハッシュ 77 57 # 78 58 @@id = 0 … … 80 60 def initialize() 81 61 # 82 # æ¬ã¯ã©ã¹ã¯ã¤ã³ã¹ã¿ã³ã¹ãæããªãä»®æ³çãªã¯ã©ã¹ã§ãã62 # 本クラスはインスタンスを持たない仮想的なクラスである 83 63 # 84 64 raise "class #{self.class.name} shall not have instances" … … 105 85 106 86 # 107 # æ¡å¼µãµã¼ãã¹ã³ã¼ã«ãç¨ãããã¡ã¤ã³ééä¿¡ã® 108 # throughãã©ã°ã¤ã³ 109 # HRPãã¡ã¤ã³ãã©ã°ã¤ã³ã«ãã£ã¦æ¿å 110 ¥ããã 111 # åææ¡ä»¶: å¼åºãå 112 ãã«ã¼ãã«ãªãã¸ã§ã¯ããã©ããã®å¤å®ã¯HRPãã¡ã¤ã³ãã©ã°ã¤ã³ 113 # ãããããã§å®æ½ãããããï¼ããã§ã¯å¤å®ããªããã¨ã¨ãã 87 # 拡張サービスコールを用いたドメイン間通信の 88 # throughプラグイン 89 # HRPドメインプラグインによって挿入される 90 # 前提条件: 呼出し先がカーネルオブジェクトかどうかの判定はHRPドメインプラグイン 91 # で実施されるため,ここでは判定しないこととした 114 92 # 115 93 class HRPSVCPlugin < ThroughPlugin 116 94 117 NUM_SVC_ARG_MAX = 5 # HRP3 ã®æ¡å¼µãµã¼ãã¹ã³ã¼ã«ã§æ±ããã¨ã®ã§ããå¼æ°ã®æ大åæ°118 119 @@generated_celltype ={} # ã»ã«ã¿ã¤ãã®éè¤æé¤ç¨120 @@generated_cell = {} # ã»ã«ã®éè¤æé¤ç¨95 NUM_SVC_ARG_MAX = 5 # HRP3 の拡張サービスコールで扱うことのできる引数の最大個数 96 97 @@generated_celltype ={} # セルタイプの重複排除用 98 @@generated_cell = {} # セルの重複排除用 121 99 122 100 def initialize( cell_name, plugin_arg, next_cell, next_cell_port_name, next_cell_port_subscript, signature, celltype, caller_cell ) 123 101 super 124 102 125 # åãå£é 126 åã®å ´åãé 127 åæ·»æ°ãã¨ã«å¥ã®ã»ã«ã¿ã¤ãã¨ãã 128 # ã»ã«ã¿ã¤ããã·ã³ã°ã«ãã³åãããããã 129 # ãããªãã¨ãã»ã«ãèå¥ããå¼æ°ã渡ãå¿ 130 è¦ããããNUM_SVC_ARG_MAX(5) ã¤ãã渡ããªãå¼æ°ã®ä¸ã¤ãæ¶è²»ãããã¨ã«ãªãããã 103 # 受け口配列の場合、配列添数ごとに別のセルタイプとする 104 # セルタイプをシングルトン化したいため。 105 # さもないと、セルを識別する引数を渡す必要があり、NUM_SVC_ARG_MAX(5) つしか渡せない引数の一つを消費することになるため。 131 106 if @next_cell_port_subscript then 132 107 subscript = "__" + @next_cell_port_subscript.to_s … … 145 120 end 146 121 147 #=== NamespacePath ãå¾ã148 # çæããã»ã«ã® namespace path ãçæãã122 #=== NamespacePath を得る 123 # 生成するセルの namespace path を生成する 149 124 def get_cell_namespace_path 150 125 # nsp = @region.get_namespace.get_namespace_path … … 155 130 def gen_plugin_decl_code( file ) 156 131 157 # ãã®ã»ã«ã¿ã¤ãï¼åãã·ã°ããã£ï¼ã¯æ¢ã«çæããã¦ãããï¼132 # このセルタイプ(同じシグニチャ)は既に生成されているか? 158 133 if @@generated_celltype[ @ct_name_body ] == nil then 159 134 @@generated_celltype[ @ct_name_body ] = [ self ] … … 177 152 file.print "import( \"#{$gen}/#{@ct_name_body}.cdl\" );\n" 178 153 179 # ãã®ã»ã«ã¿ã¤ãï¼åãã·ã°ããã£ï¼ã¯æ¢ã«çæããã¦ãããï¼154 # このセルタイプ(同じシグニチャ)は既に生成されているか? 180 155 if @@generated_celltype[ @ct_name ] == nil then 181 156 @@generated_celltype[ @ct_name ] = [ self ] … … 197 172 198 173 =begin 199 # TODO: send. receive 対å¿174 # TODO: send. receive 対応 200 175 send_receive = [] 201 176 if @signature != nil then … … 229 204 end 230 205 231 #=== through cell ã³ã¼ããçæ206 #=== through cell コードを生成 232 207 # 233 208 # … … 236 211 # gen_plugin_decl_code( file ) this is called from super. 237 212 238 # ã»ã«ãæ¢ã213 # セルを探す 239 214 # path =["::",@next_cell.get_name] # mikan namespace 240 215 # cell = Namespace.find( path ) 241 216 # cell = Namespace.find( @next_cell.get_namespace_path ) 242 217 243 ##### ã¯ã©ã¤ã¢ã³ãå´ã®ã»ã«ã®çæ#####218 ##### クライアント側のセルの生成 ##### 244 219 # file.print "[domain(HRP, \"kernel\")]" 245 220 nest = @start_region.gen_region_str_pre file 246 221 nest_str = " " * nest 247 222 248 # ã¯ã©ã¤ã¢ã³ãå´ãã£ã³ãã«ã®çæ249 # æ¡å¼µãµã¼ãã¹ã³ã¼ã«å¼åºã223 # クライアント側チャンネルの生成 224 # 拡張サービスコール呼出し 250 225 file.print <<EOT 251 226 /* HRPSVC0003 */ … … 259 234 file.print "\n\n" 260 235 261 ##### ãµã¼ãã¼å´ã®ã»ã«ã®çæ#####236 ##### サーバー側のセルの生成 ##### 262 237 # print "###### #{@cell_name_body} ... #{@ct_name_body} #{@@generated_cell[ @ct_name_body ].class} #####\n" 263 238 … … 274 249 end 275 250 276 # ãµã¼ãã¼å´ãã£ã³ãã«ã®çæ277 # æ¡å¼µãµã¼ãã¹ã³ã¼ã«æ¬ä½251 # サーバー側チャンネルの生成 252 # 拡張サービスコール本体 278 253 file.print <<EOT 279 254 … … 295 270 file2.close 296 271 297 # callee_cell ã®get_restricted_regions ãå¼ã³åºãã¦ãã 298 # restrict ãåç 299 §ãããå°ãã¤ãããã 272 # callee_cell のget_restricted_regions を呼び出しておく 273 # restrict が参照された印をつけるため 300 274 @callee_cell.get_restricted_regions( :dummy_entry_name, :dummy_func_name ) 301 275 end 302 276 end 303 277 304 #=== åãå£é¢æ°ã®æ¬ä½(Cè¨èª)ãçæãã 305 # é常ã§ããã°ãã¸ã§ãã¬ã¼ã¿ã¯åãå£é¢æ°ã®ãã³ãã¬ã¼ããçæãã 306 # ãã©ã°ã¤ã³ã®å ´åãå¤æ´ããå¿ 307 è¦ã®ãªãã»ã«ã¿ã¤ãã³ã¼ããçæãã 308 #file:: FILE åºåå 309 ãã¡ã¤ã« 278 #=== 受け口関数の本体(C言語)を生成する 279 # 通常であれば、ジェネレータは受け口関数のテンプレートを生成する 280 # プラグインの場合、変更する必要のないセルタイプコードを生成する 281 #file:: FILE 出力先ファイル 310 282 #b_singleton:: bool true if singleton 311 283 #ct_name:: Symbol … … 320 292 321 293 # 322 # æ¡å¼µãµã¼ãã¹ã³ã¼ã«å¼åºãå´ã®é¢æ°çæ294 # 拡張サービスコール呼出し側の関数生成 323 295 # 324 # å®æå½¢ã®ã¤ã¡ã¼ã¸296 # 完成形のイメージ 325 297 # 326 298 # ER_UINT … … 332 304 # p_cellcb = tHRPSVCPlugin_<Sig>SVCBody_<Cell>_<Entry>_GET_CELLCB(idx); 333 305 # }else{ 334 # /* ã¨ã©ã¼å¦çã³ã¼ããããã«è¨è¿°*/306 # /* エラー処理コードをここに記述 */ 335 307 # } 336 308 # … … 389 361 390 362 # 391 # æ¡å¼µãµã¼ãã¹ã³ã¼ã«æ¬ä½å´ã®é¢æ°çæ363 # 拡張サービスコール本体側の関数生成 392 364 # 393 # å®æå½¢ã®ã¤ã¡ã¼ã¸365 # 完成形のイメージ 394 366 # 395 367 # ER_UINT … … 401 373 # p_cellcb = tHRPSVCPlugin_<Sig>SVCBody_<Cell>_<Entry>_GET_CELLCB(idx); 402 374 # }else{ 403 # /* ã¨ã©ã¼å¦çã³ã¼ããããã«è¨è¿°*/375 # /* エラー処理コードをここに記述 */ 404 376 # } 405 377 # … … 436 408 437 409 # 438 # ã¨ã©ã¼ãã§ãã¯å¦çã®çæ410 # エラーチェック処理の生成 439 411 # 440 412 441 413 # 442 # å¼åºãå 443 ãã¡ã¤ã³ã®ãã§ã㯠444 # * private method: gen_caller_check_codeåç 445 § 414 # 呼出し元ドメインのチェック 415 # * private method: gen_caller_check_code参照 446 416 # 447 417 generated_check_code = gen_caller_check_code(func_name) … … 450 420 451 421 # 452 # ãã©ã¡ã¼ã¿ã«ãã¤ã³ã¿ãåå¨ããå ´åï¼å¼åºãå 453 ã¿ã¹ã¯ã«å¯¾ãã 454 # ã¢ã¯ã»ã¹æ¨©ã®ãã§ãã¯å¦çãåºåãã 455 # â» cdmidãã«ã¼ãã«ãã¡ã¤ã³(æ¡å¼µãµã¼ãã¹ã³ã¼ã«å¼åºãä¸ã®ã¦ã¼ã¶ 456 # ãã¡ã¤ã³ãå«ã)ã§ããã°prb_memã®å¦çãã¹ããããï¼å段㮠457 # æ¡å¼µãµã¼ãã¹ã³ã¼ã«ã®ã¿prb_memãå¼åºãå 458 ã¿ã¹ã¯ã«çºè¡ãã 422 # パラメータにポインタが存在する場合,呼出し元タスクに対する 423 # アクセス権のチェック処理を出力する 424 # ※ cdmidがカーネルドメイン(拡張サービスコール呼出し中のユーザ 425 # ドメインを含む)であればprb_memの処理をスキップし,初段の 426 # 拡張サービスコールのみprb_memを呼出し元タスクに発行する 459 427 # 460 428 num = 0 … … 465 433 if param.get_type.get_referto.kind_of?(IntType) then 466 434 case param.get_type.get_referto.get_bit_size 467 when -11, -1, 8 # char, char_t, int8_t ( ç¡ç¬¦å·å«ã)435 when -11, -1, 8 # char, char_t, int8_t (無符号含む) 468 436 # 469 # charãã¼ã¿ã®å ´åï¼ALIGN_TYPEã¯å¿ 470 ãTRUE 471 # ã¨ãªãã®ã§ï¼ã¨ã©ã¼ãã§ãã¯ãçç¥ 472 # charåã®@bit_sizeã¯-11 473 # tecsgen/tecslib/core/types.rbãåç 474 § 437 # charデータの場合,ALIGN_TYPEは必ずTRUE 438 # となるので,エラーチェックを省略 439 # char型の@bit_sizeは-11 440 # tecsgen/tecslib/core/types.rbを参照 475 441 # 476 442 align_check_str = "" … … 479 445 if param.get_direction == :IN then 480 446 # 481 # å 482 ¥å([in])ã®ãã¤ã³ã¿ãã©ã¡ã¼ã¿ã¯ï¼å¼åºãå 483 ã¿ã¹ã¯ã« 484 # TPM_READ(èªåºãå¯è½)ã®ã¢ã¯ã»ã¹æ¨©ãå¿ 485 è¦ 447 # 入力([in])のポインタパラメータは,呼出し元タスクに 448 # TPM_READ(読出し可能)のアクセス権が必要 486 449 # 487 # äºéãã¤ã³ã¿ãä¸å¯ã®ãããsize_is 㨠string ãåæã«è¨å®ããããã¨ã¯ãªã450 # 二重ポインタが不可のため、size_is と string が同時に設定されることはない 488 451 prb_func = "prb_mem" 489 452 if param.get_size then … … 507 470 elsif param.get_direction == :OUT || param.get_direction == :INOUT then 508 471 # 509 # åºå([out])ã®ãã¤ã³ã¿ãã©ã¡ã¼ã¿ã¯ï¼å¼åºãå 510 ã¿ã¹ã¯ã« 511 # TPM_WRITE(æ¸è¾¼ã¿å¯è½)ã®ã¢ã¯ã»ã¹æ¨©ãå¿ 512 è¦ 472 # 出力([out])のポインタパラメータは,呼出し元タスクに 473 # TPM_WRITE(書込み可能)のアクセス権が必要 513 474 # 514 475 prb_func = "prb_mem" 515 476 if param.get_size then 516 477 size_str = param.get_size.to_s 517 elsif param.get_string then # å¼æ°ãªãã® string ã¯ãªã478 elsif param.get_string then # 引数なしの string はない 518 479 size_str = param.get_string.to_s 519 # prb_func = "prb_str" # out, inout ã®å ´åãå¿ 520 ãé åã確ä¿ãã. prb_mem ãç¨ãã 480 # prb_func = "prb_str" # out, inout の場合、必ず領域を確保する. prb_mem を用いる 521 481 else 522 482 size_str = "1" … … 535 495 536 496 # 537 # å¼åºãå 538 ãã«ã¼ãã«ãã¡ã¤ã³ã®ã¿è¨±å¯ããã¦ããå ´åï¼ 539 # ãã¹ã¦ã®ã¦ã¼ã¶ãã¡ã¤ã³ããã®å¼åºãã«å¯¾ãï¼E_OACVãè¿ã 497 # 呼出し元がカーネルドメインのみ許可されている場合, 498 # すべてのユーザドメインからの呼出しに対し,E_OACVを返す 540 499 # 541 500 if user_cannot_callable … … 545 504 if check_code != "" 546 505 # 547 # å¼åºãå 548 ãã«ã¼ãã«ãã¡ã¤ã³ã®å ´åï¼ã¢ã¯ã»ã¹æ¨©ã®ãã§ã㯠549 # å¦çãã¹ãããããã 506 # 呼出し元がカーネルドメインの場合,アクセス権のチェック 507 # 処理をスキップさせる 550 508 # 551 509 file2.print <<eot … … 557 515 558 516 # 559 # æ¡å¼µãµã¼ãã¹ã³ã¼ã«æ¬ä½(æ¬æ¥ã®åãå£é¢æ°)ãå¼ã³åºã517 # 拡張サービスコール本体(本来の受け口関数)を呼び出す 560 518 # 561 519 file2.print" #{retval_assign}#{@call_port_name}_#{func_name}(" … … 580 538 581 539 # 582 # æ¡å¼µãµã¼ãã¹ã³ã¼ã«ã®ç»é²540 # 拡張サービスコールの登録 583 541 # 584 542 file2 = AppFile.open( "#{$gen}/tecsgen.cfg" ) … … 593 551 594 552 # 595 # æ¡å¼µãµã¼ãã¹ã³ã¼ã«ç»é²ã«å¿ 596 è¦ãªæ 597 å ±ããããã«åºå 598 # - æ¡å¼µãµã¼ãã¹ã³ã¼ã«å¼åºãæã®ãã§ãã¯ã§ä½¿ç¨ããã¹ã¿ãã¯ãµã¤ãºãåºå 599 # - æ¡å¼µãµã¼ãã¹ã³ã¼ã«ã¨ãã¦ç»é²ããé¢æ°åã®extern宣è¨ãåºå 553 # 拡張サービスコール登録に必要な情報をヘッダに出力 554 # - 拡張サービスコール呼出し時のチェックで使用するスタックサイズを出力 555 # - 拡張サービスコールとして登録する関数名のextern宣言を出力 600 556 # 601 557 file2 = AppFile.open( "#{$gen}/#{@ct_name_body}_factory.h" ) … … 627 583 private 628 584 # 629 # æ¡å¼µãµã¼ãã¹ã³ã¼ã«æ¬ä½ã«ãããï¼å¼åºãå 630 ãã§ãã¯ã®ã³ã¼ãã 631 # åºåãã 632 # gen_ep_func_body ããã®ã¿å¼ã³åºããã 633 # å¼æ°: 対象ã®é¢æ°å 634 # è¿ãå¤: ä¸è¨ã®ããã·ã¥ 635 # {"check_code"=>åºåããã¨ã©ã¼ãã§ãã¯ã³ã¼ã, 636 # "user_cannot_callable"=>ã¦ã¼ã¶ãã¡ã¤ã³ãå¼åºãä¸å¯è½ãã©ããã®ãã©ã°} 585 # 拡張サービスコール本体における,呼出し元チェックのコードを 586 # 出力する 587 # gen_ep_func_body からのみ呼び出される 588 # 引数: 対象の関数名 589 # 返り値: 下記のハッシュ 590 # {"check_code"=>出力するエラーチェックコード, 591 # "user_cannot_callable"=>ユーザドメインが呼出し不可能かどうかのフラグ} 637 592 # 638 593 def gen_caller_check_code(func_name) 639 594 dbgPrint "gen_caller_check_code(func_name): #{@callee_cell.get_name}\n" 640 595 # 641 # ã¨ã©ã¼ãã§ãã¯å¦ç596 # エラーチェック処理 642 597 # 643 598 check_code = "" … … 647 602 648 603 # 649 # å¼åºãå 650 ãã¡ã¤ã³ã®ãã§ãã¯å¦ç 651 # callable_domains: æ¡å¼µãµã¼ãã¹ã³ã¼ã«ãå¼åºãå¯è½ãªãã¡ã¤ã³ã®ãªã¹ã 652 # - ç¡æå±ã®ã»ã«ããçµåããã¦ããå ´åï¼ãã¹ã¦ã®ã»ã«ã«å¯¾ãã¦ï¼ 653 # ãcallable?ããã§ãã¯ãï¼å¼åºãå¯è½ãªãã¹ã¦ã®ãã¡ã¤ã³ãè¿ã 654 # - ç¡æå±ä»¥å¤ã®ã»ã«ããçµåããã¦ããå ´åï¼ãã®ã»ã«ã«å¯¾ã㦠655 # callable?ããã§ãã¯ãï¼å¼åºãå¯è½ã§ããã°ï¼ãã®ãã¡ã¤ã³ãè¿ã 604 # 呼出し元ドメインのチェック処理 605 # callable_domains: 拡張サービスコールを呼出し可能なドメインのリスト 606 # - 無所属のセルから結合されている場合,すべてのセルに対して, 607 # callable?をチェックし,呼出し可能なすべてのドメインを返す 608 # - 無所属以外のセルから結合されている場合,そのセルに対して 609 # callable?をチェックし,呼出し可能であれば,そのドメインを返す 656 610 # 657 611 callable_domains = [] 658 612 @@generated_celltype[ @ct_name_body ].each { |svcplugin| 659 613 if svcplugin.get_caller_cell.get_region.get_domain_root.get_domain_type.get_option == "OutOfDomain" 660 # ç¡æå±ã㤠active ãªå ´åããrestrict ã«å¾ã614 # 無所属かつ active な場合も、restrict に従う 661 615 # if svcplugin.get_caller_cell.get_celltype.is_active? 662 616 # # 663 # # ç¡æå±ãã¤activeãªã»ã«ã¯ãTECSããåå¨ãèªèããã¦ããªãã®ã664 # # å«ãä»»æã®ãã¡ã¤ã³ããå¼ã³åºãããå¯è½æ§ãåå¨ãã617 # # 無所属かつactiveなセルは、TECSから存在が認識されていないのを 618 # # 含む任意のドメインから呼び出される可能性も存在する 665 619 # # 666 620 # caller_unrestricted = true 667 621 # else 668 622 # # 669 # # ç¡æå±ããæ¥ç¶ããã¦ããå ´åã¯ï¼ãã¹ã¦ã®ã»ã«ã®670 # # restrict ããã§ãã¯623 # # 無所属から接続されている場合は,すべてのセルの 624 # # restrictをチェック 671 625 # # 672 626 # Cell.get_cell_list2.each { |cell| … … 680 634 # end 681 635 682 # restrict æå®ãããå ´åã«ã¯ãããã«å¾ãããããªããã°ããã§ãã¯ããªã636 # restrict 指定がある場合には、それに従う。さもなければ、チェックしない 683 637 callable_domains = @callee_cell.get_restricted_regions( get_callee_ep_name, func_name ) 684 638 if callable_domains == nil then … … 695 649 elsif svcplugin.get_caller_cell.callable?( svcplugin.get_callee_cell, svcplugin.get_callee_ep_name, func_name ) 696 650 # 697 # ç¹å®ã®ãã¡ã¤ã³ããæ¥ç¶ããã¦ããå ´åã¯ï¼å¼åºãå 698 ã»ã«ã® 699 # restrictããã§ã㯠651 # 特定のドメインから接続されている場合は,呼出し元セルの 652 # restrictをチェック 700 653 # 701 654 callable_domains << svcplugin.get_caller_cell.get_region.get_domain_root 702 655 else 703 656 # 704 # ç¡æå±ããçµåããã¦ãããï¼ç¹å®ã®å¼åºãå 705 ãã¡ã¤ã³ã«ã¢ã¯ã»ã¹æ¨© 706 # ããªãå ´åï¼callable_domainsã¯ç©ºã¨ãªã 657 # 無所属から結合されておらず,特定の呼出し元ドメインにアクセス権 658 # がない場合,callable_domainsは空となる 707 659 # 708 660 # pp "#{svcplugin.get_caller_cell.get_name} cannot call #{svcplugin.get_callee_cell.get_name}_#{svcplugin.get_callee_ep_name}_#{func_name}" … … 716 668 717 669 # 718 # éè¤ãåé¤670 # 重複を削除 719 671 # 720 672 callable_domains.uniq! 721 673 # 722 # ç¡æå±ã«å¯¾ãããã¡ã¤ã³ãã§ãã¯ã¯å®æ½ããªã723 # ã«ã¼ãã«ãã¡ã¤ã³ã«å¯¾ãããã¡ã¤ã³ãã§ãã¯ã¯å®æ½ããªã674 # 無所属に対するドメインチェックは実施しない 675 # カーネルドメインに対するドメインチェックは実施しない 724 676 # 725 677 callable_domains = callable_domains.select { |domain| … … 730 682 # pp callable_domains.map{|domain| domain.get_name } 731 683 # 732 # ãã¹ã¦ã®ã¦ã¼ã¶ãã¡ã¤ã³ããå¼åºãå¯è½ãªå ´åï¼ãã¡ã¤ã³ãã§ãã¯ã¯733 # å®æ½ããªã684 # すべてのユーザドメインから呼出し可能な場合,ドメインチェックは 685 # 実施しない 734 686 # 735 687 all_domain_regions = DomainType.get_domain_regions[:HRP].select { |reg| … … 745 697 746 698 # 747 # å¼åºãå 748 ãã¡ã¤ã³ã®ãã§ãã¯å¦çæ¬ä½ã®çæ 699 # 呼出し元ドメインのチェック処理本体の生成 749 700 # 750 701 if callable_domains.length == 0 751 702 dbgPrint "callable_domain.length = 0\n" 752 703 # 753 # ã¦ã¼ã¶ãã¡ã¤ã³ããå¼åºãä¸å¯è½ãªå ´åã¯754 # åå¥ã®ã¨ã©ã¼ãã§ãã¯ã¯ããï¼åçç¡ç¨ã§E_OACVãè¿ã704 # ユーザドメインから呼出し不可能な場合は 705 # 個別のエラーチェックはせず,問答無用でE_OACVを返す 755 706 # 756 707 user_cannot_callable = true … … 758 709 dbgPrint "callable_domain.length = 1\n" 759 710 # 760 # å¼åºãå¯è½ãªã¦ã¼ã¶ãã¡ã¤ã³ãåä¸ã®å ´åã¯761 # cdmid != <domain å> ã®å½¢å¼ã§ãã§ãã¯ãã711 # 呼出し可能なユーザドメインが単一の場合は 712 # cdmid != <domain名> の形式でチェックする 762 713 # 763 714 check_code += "\t/* HRPSVC0012.1 */\n" … … 766 717 dbgPrint "callable_domain.length > 1 && not all_domains \n" 767 718 # 768 # å¼åºãå¯è½ãªã¦ã¼ã¶ãã¡ã¤ã³ãè¤æ°ã®å ´åã¯769 # TACP(cdmid) & (TACP(<domain å>) | ...) != 0U770 # ã®å½¢å¼ã§ãã§ãã¯ãã719 # 呼出し可能なユーザドメインが複数の場合は 720 # TACP(cdmid) & (TACP(<domain名>) | ...) != 0U 721 # の形式でチェックする 771 722 # 772 723 check_code += "\t/* HRPSVC0012.2 */\n" … … 779 730 if check_code != "" 780 731 # 781 # å¼åºãå¯è½ãªã¦ã¼ã¶ãã¡ã¤ã³ã®ãã§ãã¯ãããå ´åã¯782 # ã¨ã©ã¼ã³ã¼ããè¿ãããã®ã³ã¼ããåºåãã732 # 呼出し可能なユーザドメインのチェックがある場合は 733 # エラーコードを返すためのコードを出力する 783 734 # 784 735 check_code += <<EOS … … 793 744 794 745 #---------------------------------------------------------# 795 #=== ã·ã°ããã£ã®ãã§ãã¯746 #=== シグニチャのチェック 796 747 def check_signature signature 797 748 signature.get_function_head_array.each{ |fh| … … 806 757 } 807 758 end 808 #=== æ»ãå¤ã®åã®ãã§ãã¯809 # ER, ER_UINT ã¯æ¨å¥¨ãããå810 # æ´æ°ããã¼ã«ãvoid ã¯å¯è½ãä»ã¯ä¸å¯759 #=== 戻り値の型のチェック 760 # ER, ER_UINT は推奨される型 761 # 整数、ブール、void は可能、他は不可 811 762 def check_return_type signature, fh, type 812 763 ot = type.get_original_type … … 820 771 end 821 772 end 822 #=== å¼æ°ã®åã®ãã§ãã¯773 #=== 引数の型のチェック 823 774 def check_param signature, fh, param 824 775 type = param.get_type -
Property svn:mime-type
changed from
Note:
See TracChangeset
for help on using the changeset viewer.