annotate kernel/kernel.c @ 0:42f240cc4bc6

From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 08 Sep 2009 13:44:18 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 /**
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 * kernel.c
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 * SPE 軽量カーネル 本体
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 */
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 #include <spu_mfcio.h>
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 #include "../include/spe_process.h"
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 #define FLOOR_TO_BOUNDARY_BYTE(n,b) ( (n) & ~((b)-1) ) // b バイト境界への切り捨て
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 #define CEIL_TO_BOUNDARY_BYTE(n,b) ( ((n)+(b)-1) & ~((b)-1) ) // b バイト境界への切り上げ
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 // SPE プロセスコンテキストの読み書き領域
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 volatile spe_process_context_t this_process __attribute__((aligned(16)));
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 // SPE プロセスコンテキストの実効アドレス
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 extern volatile unsigned long long __process_context_ea__;
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 // SPE プロセスのプログラム転送開始地点
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 extern volatile unsigned int __spe_program_start__;
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 void start(void)
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 {
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 //----- SPE プロセスコンテキストの読み込み ------------------------------
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 mfc_get (
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 &this_process,
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 __process_context_ea__,
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 CEIL_TO_BOUNDARY_BYTE(sizeof(this_process), 16),
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 0, // tag
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 0, // tid
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 0 // rid
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 );
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 spu_writech(MFC_WrTagMask, 1<<0);
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 spu_mfcstat(MFC_TAG_UPDATE_ALL);
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 asm volatile ("dsync"); // プロセスコンテキストの読み込み完了を保証
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 //----- SPE プロセスとなるプログラムの読み込み ------------------------------
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 mfc_get (
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 &__spe_program_start__,
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 this_process.write.pgm_start,
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 CEIL_TO_BOUNDARY_BYTE(this_process.write.pgm_size, 16),
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 0, // tag
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 0, // tid
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 0 // rid
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 );
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 spu_writech(MFC_WrTagMask, 1<<0);
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 spu_mfcstat(MFC_TAG_UPDATE_ALL);
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 asm volatile ("sync"); // プログラムの読み込み完了とその後のプリフェッチを保証
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 //----- プログラム実行 ------------------------------
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 this_process.read.ret = ((unsigned long long (*)(unsigned long long))&__spe_program_start__)(this_process.write.arg);
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 //----- SPE プロセスコンテキストの書き出し ------------------------------
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 this_process.read.status = SPE_PROCESS_CONTEXT_STATUS_FINISHED;
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 asm volatile ("dsync"); // LS 内のデータ書き込み完了を保証
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 // Note: SPE プロセスのプログラム内で同一タグ ID の DMA 転送を行っている場合を考慮して、
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 // コンテキストの書き出しではフェンス修飾を付けておく。
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 mfc_putf (
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 &this_process,
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 __process_context_ea__,
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 CEIL_TO_BOUNDARY_BYTE(sizeof(this_process), 16),
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 0, // tag
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 0, // tid
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 0 // rid
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 );
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 spu_writech(MFC_WrTagMask, 1<<0);
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 spu_mfcstat(MFC_TAG_UPDATE_ALL);
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 mfc_sync(0 /*tag*/); // プロセスコンテキストの書き出し完了を保証
42f240cc4bc6 From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 }