annotate spe/SpeSentry.cc @ 0:68a98d68d62a

commit
author yutaka@localhost.localdomain
date Sun, 28 Mar 2010 19:47:00 +0900
parents
children dcd83cefb980
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
yutaka@localhost.localdomain
parents:
diff changeset
1 #include <stdio.h>
yutaka@localhost.localdomain
parents:
diff changeset
2 #include <malloc.h>
yutaka@localhost.localdomain
parents:
diff changeset
3 #include <spu_intrinsics.h>
yutaka@localhost.localdomain
parents:
diff changeset
4 #include <spu_mfcio.h>
yutaka@localhost.localdomain
parents:
diff changeset
5 #include "SpeSentry.h"
yutaka@localhost.localdomain
parents:
diff changeset
6 #include "MailCommand.h"
yutaka@localhost.localdomain
parents:
diff changeset
7 #include "Dma.h"
yutaka@localhost.localdomain
parents:
diff changeset
8 #include "Run.h"
yutaka@localhost.localdomain
parents:
diff changeset
9
yutaka@localhost.localdomain
parents:
diff changeset
10 void*
yutaka@localhost.localdomain
parents:
diff changeset
11 fix_type(send_params_t *send_params, void* buff)
yutaka@localhost.localdomain
parents:
diff changeset
12 {
yutaka@localhost.localdomain
parents:
diff changeset
13
yutaka@localhost.localdomain
parents:
diff changeset
14 char *p;
yutaka@localhost.localdomain
parents:
diff changeset
15 p = (char*)buff;
yutaka@localhost.localdomain
parents:
diff changeset
16 p = p + sizeof(send_params_head_t);
yutaka@localhost.localdomain
parents:
diff changeset
17
yutaka@localhost.localdomain
parents:
diff changeset
18 send_params->head = (send_params_head_t*)buff;
yutaka@localhost.localdomain
parents:
diff changeset
19 send_params->buff = p;
yutaka@localhost.localdomain
parents:
diff changeset
20
yutaka@localhost.localdomain
parents:
diff changeset
21 }
yutaka@localhost.localdomain
parents:
diff changeset
22
yutaka@localhost.localdomain
parents:
diff changeset
23 void*
yutaka@localhost.localdomain
parents:
diff changeset
24 allocate(int size)
yutaka@localhost.localdomain
parents:
diff changeset
25 {
yutaka@localhost.localdomain
parents:
diff changeset
26
yutaka@localhost.localdomain
parents:
diff changeset
27 int alignment = 16;
yutaka@localhost.localdomain
parents:
diff changeset
28 return memalign(alignment, size);
yutaka@localhost.localdomain
parents:
diff changeset
29
yutaka@localhost.localdomain
parents:
diff changeset
30 }
yutaka@localhost.localdomain
parents:
diff changeset
31
yutaka@localhost.localdomain
parents:
diff changeset
32 send_params_t
yutaka@localhost.localdomain
parents:
diff changeset
33 task_allocate(int size)
yutaka@localhost.localdomain
parents:
diff changeset
34 {
yutaka@localhost.localdomain
parents:
diff changeset
35
yutaka@localhost.localdomain
parents:
diff changeset
36 if (size % 16) {
yutaka@localhost.localdomain
parents:
diff changeset
37 //printf("allocate size is not multiple of 16\n");
yutaka@localhost.localdomain
parents:
diff changeset
38 }
yutaka@localhost.localdomain
parents:
diff changeset
39
yutaka@localhost.localdomain
parents:
diff changeset
40 char *buff;
yutaka@localhost.localdomain
parents:
diff changeset
41 send_params_t send_params;
yutaka@localhost.localdomain
parents:
diff changeset
42
yutaka@localhost.localdomain
parents:
diff changeset
43 void *head;
yutaka@localhost.localdomain
parents:
diff changeset
44 head = memalign(16, size);
yutaka@localhost.localdomain
parents:
diff changeset
45
yutaka@localhost.localdomain
parents:
diff changeset
46 buff = (char*)head;
yutaka@localhost.localdomain
parents:
diff changeset
47 buff = buff + sizeof(send_params_head_t);
yutaka@localhost.localdomain
parents:
diff changeset
48
yutaka@localhost.localdomain
parents:
diff changeset
49 send_params.head = (send_params_head_t*)head;
yutaka@localhost.localdomain
parents:
diff changeset
50 send_params.buff = buff;
yutaka@localhost.localdomain
parents:
diff changeset
51
yutaka@localhost.localdomain
parents:
diff changeset
52 return send_params;
yutaka@localhost.localdomain
parents:
diff changeset
53
yutaka@localhost.localdomain
parents:
diff changeset
54 }
yutaka@localhost.localdomain
parents:
diff changeset
55
yutaka@localhost.localdomain
parents:
diff changeset
56 int
yutaka@localhost.localdomain
parents:
diff changeset
57 main(unsigned long long spe, unsigned long long argp, unsigned long long envp)
yutaka@localhost.localdomain
parents:
diff changeset
58 {
yutaka@localhost.localdomain
parents:
diff changeset
59
yutaka@localhost.localdomain
parents:
diff changeset
60 uint32_t data;
yutaka@localhost.localdomain
parents:
diff changeset
61 int buff_num = 2;
yutaka@localhost.localdomain
parents:
diff changeset
62 int dma_wait_time = 0;
yutaka@localhost.localdomain
parents:
diff changeset
63
yutaka@localhost.localdomain
parents:
diff changeset
64 int in_tag[buff_num];
yutaka@localhost.localdomain
parents:
diff changeset
65 int out_tag[buff_num];
yutaka@localhost.localdomain
parents:
diff changeset
66
yutaka@localhost.localdomain
parents:
diff changeset
67 in_tag[0] = 0;
yutaka@localhost.localdomain
parents:
diff changeset
68 in_tag[1] = 1;
yutaka@localhost.localdomain
parents:
diff changeset
69
yutaka@localhost.localdomain
parents:
diff changeset
70 out_tag[0] = 2;
yutaka@localhost.localdomain
parents:
diff changeset
71 out_tag[1] = 3;
yutaka@localhost.localdomain
parents:
diff changeset
72
yutaka@localhost.localdomain
parents:
diff changeset
73 int head_tag = 4;
yutaka@localhost.localdomain
parents:
diff changeset
74
yutaka@localhost.localdomain
parents:
diff changeset
75 send_params_head_t *head = (send_params_head_t*)allocate(sizeof(send_params_head_t));
yutaka@localhost.localdomain
parents:
diff changeset
76 send_params_t *send_params = (send_params_t*)allocate(sizeof(send_params_t));
yutaka@localhost.localdomain
parents:
diff changeset
77 void *input_buff[buff_num];
yutaka@localhost.localdomain
parents:
diff changeset
78 void *output_buff[buff_num];
yutaka@localhost.localdomain
parents:
diff changeset
79
yutaka@localhost.localdomain
parents:
diff changeset
80 int cur;
yutaka@localhost.localdomain
parents:
diff changeset
81
yutaka@localhost.localdomain
parents:
diff changeset
82 spu_write_out_mbox(WANT_DATA);
yutaka@localhost.localdomain
parents:
diff changeset
83
yutaka@localhost.localdomain
parents:
diff changeset
84 while(1) {
yutaka@localhost.localdomain
parents:
diff changeset
85
yutaka@localhost.localdomain
parents:
diff changeset
86 //mail check start
yutaka@localhost.localdomain
parents:
diff changeset
87 if(spu_stat_in_mbox()) {
yutaka@localhost.localdomain
parents:
diff changeset
88
yutaka@localhost.localdomain
parents:
diff changeset
89 data = spu_read_in_mbox();
yutaka@localhost.localdomain
parents:
diff changeset
90
yutaka@localhost.localdomain
parents:
diff changeset
91 if (data == SPE_RUN_END) {
yutaka@localhost.localdomain
parents:
diff changeset
92
yutaka@localhost.localdomain
parents:
diff changeset
93 break;
yutaka@localhost.localdomain
parents:
diff changeset
94
yutaka@localhost.localdomain
parents:
diff changeset
95 } else {
yutaka@localhost.localdomain
parents:
diff changeset
96
yutaka@localhost.localdomain
parents:
diff changeset
97 //printf("[SPE] data %p\n",data);
yutaka@localhost.localdomain
parents:
diff changeset
98
yutaka@localhost.localdomain
parents:
diff changeset
99 dma_get(head, data, sizeof(send_params_head_t), head_tag);
yutaka@localhost.localdomain
parents:
diff changeset
100 dma_wait(head_tag);
yutaka@localhost.localdomain
parents:
diff changeset
101
yutaka@localhost.localdomain
parents:
diff changeset
102 input_buff[0] = allocate(head->next_task_size);
yutaka@localhost.localdomain
parents:
diff changeset
103
yutaka@localhost.localdomain
parents:
diff changeset
104 dma_get(input_buff[0], head->next_task, head->next_task_size, in_tag[0]);
yutaka@localhost.localdomain
parents:
diff changeset
105 dma_wait(in_tag[0]);
yutaka@localhost.localdomain
parents:
diff changeset
106
yutaka@localhost.localdomain
parents:
diff changeset
107 fix_type(send_params,input_buff[0]);
yutaka@localhost.localdomain
parents:
diff changeset
108
yutaka@localhost.localdomain
parents:
diff changeset
109 cur = 0;
yutaka@localhost.localdomain
parents:
diff changeset
110
yutaka@localhost.localdomain
parents:
diff changeset
111 while(1) {
yutaka@localhost.localdomain
parents:
diff changeset
112
yutaka@localhost.localdomain
parents:
diff changeset
113 input_buff[cur^1] = allocate(send_params->head->next_task_size);
yutaka@localhost.localdomain
parents:
diff changeset
114 dma_get(input_buff[cur^1], send_params->head->next_task, send_params->head->next_task_size, in_tag[cur^1]);
yutaka@localhost.localdomain
parents:
diff changeset
115
yutaka@localhost.localdomain
parents:
diff changeset
116 void *in = send_params->buff;
yutaka@localhost.localdomain
parents:
diff changeset
117
yutaka@localhost.localdomain
parents:
diff changeset
118 //printf("hoge");
yutaka@localhost.localdomain
parents:
diff changeset
119 output_buff[cur] = allocate(send_params->head->size_out);
yutaka@localhost.localdomain
parents:
diff changeset
120 int data_length = send_params->head->size_out;
yutaka@localhost.localdomain
parents:
diff changeset
121
yutaka@localhost.localdomain
parents:
diff changeset
122
yutaka@localhost.localdomain
parents:
diff changeset
123 //task********************************************
yutaka@localhost.localdomain
parents:
diff changeset
124
yutaka@localhost.localdomain
parents:
diff changeset
125 run(in,output_buff[cur],data_length);
yutaka@localhost.localdomain
parents:
diff changeset
126
yutaka@localhost.localdomain
parents:
diff changeset
127 //end*********************************************
yutaka@localhost.localdomain
parents:
diff changeset
128
yutaka@localhost.localdomain
parents:
diff changeset
129 dma_put(output_buff[cur], send_params->head->ea_out, send_params->head->size_out, out_tag[cur]);
yutaka@localhost.localdomain
parents:
diff changeset
130
yutaka@localhost.localdomain
parents:
diff changeset
131 free(input_buff[cur]);
yutaka@localhost.localdomain
parents:
diff changeset
132
yutaka@localhost.localdomain
parents:
diff changeset
133 dma_wait(in_tag[cur^1]);
yutaka@localhost.localdomain
parents:
diff changeset
134 dma_wait(out_tag[cur^1]);
yutaka@localhost.localdomain
parents:
diff changeset
135 //printf("hoge");
yutaka@localhost.localdomain
parents:
diff changeset
136
yutaka@localhost.localdomain
parents:
diff changeset
137 free(output_buff[cur^1]);
yutaka@localhost.localdomain
parents:
diff changeset
138
yutaka@localhost.localdomain
parents:
diff changeset
139 cur ^= 1;
yutaka@localhost.localdomain
parents:
diff changeset
140
yutaka@localhost.localdomain
parents:
diff changeset
141 fix_type(send_params,input_buff[cur]);
yutaka@localhost.localdomain
parents:
diff changeset
142
yutaka@localhost.localdomain
parents:
diff changeset
143 if ((unsigned long)send_params->head->next_task == 0) {
yutaka@localhost.localdomain
parents:
diff changeset
144 break;
yutaka@localhost.localdomain
parents:
diff changeset
145 }
yutaka@localhost.localdomain
parents:
diff changeset
146
yutaka@localhost.localdomain
parents:
diff changeset
147 }//while
yutaka@localhost.localdomain
parents:
diff changeset
148
yutaka@localhost.localdomain
parents:
diff changeset
149
yutaka@localhost.localdomain
parents:
diff changeset
150
yutaka@localhost.localdomain
parents:
diff changeset
151
yutaka@localhost.localdomain
parents:
diff changeset
152 void *in = send_params->buff;
yutaka@localhost.localdomain
parents:
diff changeset
153
yutaka@localhost.localdomain
parents:
diff changeset
154 //printf("hoge");
yutaka@localhost.localdomain
parents:
diff changeset
155 output_buff[cur] = allocate(send_params->head->size_out);
yutaka@localhost.localdomain
parents:
diff changeset
156 int data_length = send_params->head->size_out;
yutaka@localhost.localdomain
parents:
diff changeset
157
yutaka@localhost.localdomain
parents:
diff changeset
158
yutaka@localhost.localdomain
parents:
diff changeset
159 //task********************************************
yutaka@localhost.localdomain
parents:
diff changeset
160
yutaka@localhost.localdomain
parents:
diff changeset
161 run(in,output_buff[cur],data_length);
yutaka@localhost.localdomain
parents:
diff changeset
162
yutaka@localhost.localdomain
parents:
diff changeset
163 //end*********************************************
yutaka@localhost.localdomain
parents:
diff changeset
164
yutaka@localhost.localdomain
parents:
diff changeset
165 dma_put(output_buff[cur], send_params->head->ea_out, send_params->head->size_out, out_tag[cur]);
yutaka@localhost.localdomain
parents:
diff changeset
166
yutaka@localhost.localdomain
parents:
diff changeset
167 free(input_buff[cur]);
yutaka@localhost.localdomain
parents:
diff changeset
168
yutaka@localhost.localdomain
parents:
diff changeset
169 dma_wait(out_tag[cur] | out_tag[cur^1] );
yutaka@localhost.localdomain
parents:
diff changeset
170 free(output_buff[cur]);
yutaka@localhost.localdomain
parents:
diff changeset
171 free(output_buff[cur^1]);
yutaka@localhost.localdomain
parents:
diff changeset
172
yutaka@localhost.localdomain
parents:
diff changeset
173
yutaka@localhost.localdomain
parents:
diff changeset
174
yutaka@localhost.localdomain
parents:
diff changeset
175 spu_write_out_mbox(WANT_DATA);
yutaka@localhost.localdomain
parents:
diff changeset
176 //printf("[SPE] send mail\n");
yutaka@localhost.localdomain
parents:
diff changeset
177
yutaka@localhost.localdomain
parents:
diff changeset
178 }//if
yutaka@localhost.localdomain
parents:
diff changeset
179 }//if
yutaka@localhost.localdomain
parents:
diff changeset
180 //mail check end
yutaka@localhost.localdomain
parents:
diff changeset
181
yutaka@localhost.localdomain
parents:
diff changeset
182
yutaka@localhost.localdomain
parents:
diff changeset
183 }//while
yutaka@localhost.localdomain
parents:
diff changeset
184
yutaka@localhost.localdomain
parents:
diff changeset
185
yutaka@localhost.localdomain
parents:
diff changeset
186 return 0;
yutaka@localhost.localdomain
parents:
diff changeset
187
yutaka@localhost.localdomain
parents:
diff changeset
188 }
yutaka@localhost.localdomain
parents:
diff changeset
189
yutaka@localhost.localdomain
parents:
diff changeset
190
yutaka@localhost.localdomain
parents:
diff changeset
191 /*end*/