]> git.proxmox.com Git - mirror_smartmontools-debian.git/blame - os_solaris_ata.s
Imported Upstream version 6.1+svn3812
[mirror_smartmontools-debian.git] / os_solaris_ata.s
CommitLineData
832b75ed
GG
1!
2! os_solaris_ata.s
3!
4! Home page of code is: http://smartmontools.sourceforge.net
5!
34ad0c5f 6! Copyright (C) 2003-8 SAWADA Keiji <smartmontools-support@lists.sourceforge.net>
832b75ed
GG
7!
8! This program is free software; you can redistribute it and/or modify
9! it under the terms of the GNU General Public License as published by
10! the Free Software Foundation; either version 2 of the License, or
11! (at your option) any later version.
12!
13! This program is distributed in the hope that it will be useful, but
14! WITHOUT ANY WARRANTY; without even the implied warranty of
15! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16! General Public License for more details.
17!
18! You should have received a copy of the GNU General Public License
ee38a438
GI
19! along with this program; if not, write to the Free Software Foundation,
20! Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
832b75ed
GG
21!
22!
23! --------------------------------------------------------
24! direct access routines to ATA device under Solaris/SPARC
25! --------------------------------------------------------
26!
27! Information
28! -----------
29!
30! In Solaris, programmer can pass SCSI command to target device directly
31! by using USCSI ioctl or using "scg" generic SCSI driver. But, such
32! method does not exist for ATA devices.
33!
34! However, I can access Solaris kernel source because I am subscriber of
35! Source Foundation Program of Solaris. So, I can find method of
36! accessing ATA device directly. The method is to pack command in
37! undocumented structure and issue ioctl that appears only in kernel
38! source. Yes, that is the same way in using USCSI interface.
39!
40! But, I met difficulty in disclosing this technique. I have signed NDA
41! with Sun that inhibits me not to violate their intellectual property.
42!
43! Fortunately, Sun allows licensees to publish "Interfaces" if:
44!
45! (1) he/she treats Solaris code as confidential
46!
47! (2) and he/she doesn't incorporate Sun's code into his/her code
48!
49! (3) and disclose enough information to use "Interface" to everyone.
50!
51! So, I publish that technique in assembly code or object code because:
52!
53! (1) I believe Sun's intellectural property is not invaded because I
54! didn't reveal any struct member and ioctl to non-licensee.
55!
56! (2) no piece of kernel source is included in this code.
57!
58! (3) And finally, I publish enough information below in order to use
59! this code.
60!
61! For last reason, please don't remove "Calling Interface" section from
62! distribution.
63!
64!
65! Calling Interface
66! -----------------
67!
68! Name of function/macro presents corresponding S.M.A.R.T. command.
69!
70! Parameters are described below.
71!
72! int fd
73!
74! File descriptor of ATA device. Device would be
75! /dev/rdsk/cXtXdXsX.
76!
77! Device should be raw device serviced by "dada" driver. ATAPI
78! CD-ROM/R/RW, DVD-ROM, and so on are not allowed because they are
79! serviced by "sd" driver. On x86 Solaris, "cmdk" driver services
80! them, this routines doesn't work.
81!
82! int s
83! Select sector for service. For example, this indicates log sector
84! number for smart_read_log() function. Probably you need to read
85! ATA specification for this parameter.
86!
87! void *data
88! Data going to be read/written. It don't have to be word aligned,
89! But data shall points valid user memory space.
90!
91! This is very tiny routines, but if you feel this insufficient, please
92! let me know.
93!
94! ksw / SAWADA Keiji
95! <card_captor@users.sourceforge.net>
96 .file "solaris-ata-in.c"
97 .section ".rodata"
98 .align 8
99.LLC0:
ee38a438 100 .asciz "$Id: os_solaris_ata.s 3728 2012-12-13 17:57:50Z chrfranke $"
832b75ed
GG
101 .global os_solaris_ata_s_cvsid
102 .section ".data"
103 .align 4
104 .type os_solaris_ata_s_cvsid, #object
105 .size os_solaris_ata_s_cvsid, 4
106os_solaris_ata_s_cvsid:
107 .long .LLC0
108 .section ".text"
109 .align 4
110 .type ata_cmd, #function
111 .proc 04
112ata_cmd:
113 !#PROLOGUE# 0
114 save %sp, -184, %sp
115 !#PROLOGUE# 1
116 st %i0, [%fp+68]
117 st %i1, [%fp+72]
118 st %i2, [%fp+76]
119 st %i3, [%fp+80]
120 st %i4, [%fp+84]
121 st %i5, [%fp+88]
122 ld [%fp+92], %g1
123 st %g1, [%fp-76]
124 ld [%fp-76], %g1
125 and %g1, 3, %g1
126 cmp %g1, 0
127 be .LL2
128 nop
129 mov -2, %g1
130 st %g1, [%fp-80]
131 b .LL1
132 nop
133.LL2:
134 add %fp, -56, %g1
135 mov %g1, %o0
136 mov 0, %o1
137 mov 36, %o2
138 call memset, 0
139 nop
140 add %fp, -72, %g1
141 mov %g1, %o0
142 mov 0, %o1
143 mov 16, %o2
144 call memset, 0
145 nop
146 ld [%fp+72], %g1
147 stb %g1, [%fp-72]
148 mov 1, %g1
149 stb %g1, [%fp-71]
150 mov 1, %g1
151 stb %g1, [%fp-70]
152 ld [%fp+76], %g1
153 stb %g1, [%fp-69]
154 ld [%fp+84], %g1
155 sll %g1, 9, %g1
156 st %g1, [%fp-68]
157 ld [%fp+80], %g1
158 st %g1, [%fp-60]
159 mov 10, %g1
160 sth %g1, [%fp-52]
161 ld [%fp+88], %g1
162 cmp %g1, 0
163 be .LL3
164 nop
165 mov 14, %g1
166 st %g1, [%fp-84]
167 b .LL4
168 nop
169.LL3:
170 mov 6, %g1
171 st %g1, [%fp-84]
172.LL4:
173 ld [%fp-84], %g1
174 st %g1, [%fp-48]
175 ld [%fp+88], %g1
176 sll %g1, 9, %g1
177 st %g1, [%fp-44]
178 ld [%fp+88], %g1
179 sll %g1, 9, %g1
180 st %g1, [%fp-40]
181 ld [%fp+88], %g1
182 cmp %g1, 0
183 be .LL5
184 nop
185 ld [%fp+92], %g1
186 st %g1, [%fp-88]
187 b .LL6
188 nop
189.LL5:
190 st %g0, [%fp-88]
191.LL6:
192 ld [%fp-88], %g1
193 st %g1, [%fp-36]
194 add %fp, -72, %g1
195 st %g1, [%fp-32]
196 add %fp, -56, %g1
197 ld [%fp+68], %o0
198 mov 1481, %o1
199 mov %g1, %o2
200 call ioctl, 0
201 nop
202 mov %o0, %g1
203 st %g1, [%fp-80]
204.LL1:
205 ld [%fp-80], %i0
206 ret
207 restore
208 .size ata_cmd, .-ata_cmd
209 .align 4
210 .global ata_identify
211 .type ata_identify, #function
212 .proc 04
213ata_identify:
214 !#PROLOGUE# 0
215 save %sp, -648, %sp
216 !#PROLOGUE# 1
217 st %i0, [%fp+68]
218 st %i1, [%fp+72]
219 add %fp, -536, %g1
220 st %g1, [%sp+92]
221 ld [%fp+68], %o0
222 mov 236, %o1
223 mov 0, %o2
224 mov 0, %o3
225 mov 1, %o4
226 mov 1, %o5
227 call ata_cmd, 0
228 nop
229 mov %o0, %g1
230 st %g1, [%fp-20]
231 add %fp, -536, %g1
232 ld [%fp+72], %o0
233 mov %g1, %o1
234 mov 512, %o2
235 call memcpy, 0
236 nop
237 ld [%fp-20], %g1
238 cmp %g1, 0
239 be .LL8
240 nop
241 mov -1, %g1
242 st %g1, [%fp-540]
243 b .LL9
244 nop
245.LL8:
246 st %g0, [%fp-540]
247.LL9:
248 ld [%fp-540], %g1
249 mov %g1, %i0
250 ret
251 restore
252 .size ata_identify, .-ata_identify
253 .align 4
254 .global ata_pidentify
255 .type ata_pidentify, #function
256 .proc 04
257ata_pidentify:
258 !#PROLOGUE# 0
259 save %sp, -648, %sp
260 !#PROLOGUE# 1
261 st %i0, [%fp+68]
262 st %i1, [%fp+72]
263 add %fp, -536, %g1
264 st %g1, [%sp+92]
265 ld [%fp+68], %o0
266 mov 161, %o1
267 mov 0, %o2
268 mov 0, %o3
269 mov 1, %o4
270 mov 1, %o5
271 call ata_cmd, 0
272 nop
273 mov %o0, %g1
274 st %g1, [%fp-20]
275 add %fp, -536, %g1
276 ld [%fp+72], %o0
277 mov %g1, %o1
278 mov 512, %o2
279 call memcpy, 0
280 nop
281 ld [%fp-20], %g1
282 cmp %g1, 0
283 be .LL11
284 nop
285 mov -1, %g1
286 st %g1, [%fp-540]
287 b .LL12
288 nop
289.LL11:
290 st %g0, [%fp-540]
291.LL12:
292 ld [%fp-540], %g1
293 mov %g1, %i0
294 ret
295 restore
296 .size ata_pidentify, .-ata_pidentify
297 .align 4
298 .global smart_read_data
299 .type smart_read_data, #function
300 .proc 04
301smart_read_data:
302 !#PROLOGUE# 0
303 save %sp, -648, %sp
304 !#PROLOGUE# 1
305 st %i0, [%fp+68]
306 st %i1, [%fp+72]
307 add %fp, -536, %g1
308 st %g1, [%sp+92]
309 ld [%fp+68], %o0
310 mov 176, %o1
311 mov 208, %o2
312 sethi %hi(12733440), %g1
313 or %g1, 768, %o3
314 mov 0, %o4
315 mov 1, %o5
316 call ata_cmd, 0
317 nop
318 mov %o0, %g1
319 st %g1, [%fp-20]
320 add %fp, -536, %g1
321 ld [%fp+72], %o0
322 mov %g1, %o1
323 mov 512, %o2
324 call memcpy, 0
325 nop
326 ld [%fp-20], %g1
327 cmp %g1, 0
328 be .LL14
329 nop
330 mov -1, %g1
331 st %g1, [%fp-540]
332 b .LL15
333 nop
334.LL14:
335 st %g0, [%fp-540]
336.LL15:
337 ld [%fp-540], %g1
338 mov %g1, %i0
339 ret
340 restore
341 .size smart_read_data, .-smart_read_data
342 .align 4
343 .global smart_read_thresholds
344 .type smart_read_thresholds, #function
345 .proc 04
346smart_read_thresholds:
347 !#PROLOGUE# 0
348 save %sp, -648, %sp
349 !#PROLOGUE# 1
350 st %i0, [%fp+68]
351 st %i1, [%fp+72]
352 add %fp, -536, %g1
353 st %g1, [%sp+92]
354 ld [%fp+68], %o0
355 mov 176, %o1
356 mov 209, %o2
357 sethi %hi(12733440), %g1
358 or %g1, 769, %o3
359 mov 1, %o4
360 mov 1, %o5
361 call ata_cmd, 0
362 nop
363 mov %o0, %g1
364 st %g1, [%fp-20]
365 add %fp, -536, %g1
366 ld [%fp+72], %o0
367 mov %g1, %o1
368 mov 512, %o2
369 call memcpy, 0
370 nop
371 ld [%fp-20], %g1
372 cmp %g1, 0
373 be .LL17
374 nop
375 mov -1, %g1
376 st %g1, [%fp-540]
377 b .LL18
378 nop
379.LL17:
380 st %g0, [%fp-540]
381.LL18:
382 ld [%fp-540], %g1
383 mov %g1, %i0
384 ret
385 restore
386 .size smart_read_thresholds, .-smart_read_thresholds
387 .align 4
388 .global smart_auto_save
389 .type smart_auto_save, #function
390 .proc 04
391smart_auto_save:
392 !#PROLOGUE# 0
393 save %sp, -128, %sp
394 !#PROLOGUE# 1
395 st %i0, [%fp+68]
396 st %i1, [%fp+72]
397 st %g0, [%sp+92]
398 ld [%fp+68], %o0
399 mov 176, %o1
400 mov 210, %o2
401 sethi %hi(12733440), %g1
402 or %g1, 768, %o3
403 ld [%fp+72], %o4
404 mov 0, %o5
405 call ata_cmd, 0
406 nop
407 mov %o0, %g1
408 st %g1, [%fp-20]
409 ld [%fp-20], %g1
410 cmp %g1, 0
411 be .LL20
412 nop
413 mov -1, %g1
414 st %g1, [%fp-24]
415 b .LL21
416 nop
417.LL20:
418 st %g0, [%fp-24]
419.LL21:
420 ld [%fp-24], %g1
421 mov %g1, %i0
422 ret
423 restore
424 .size smart_auto_save, .-smart_auto_save
425 .align 4
426 .global smart_immediate_offline
427 .type smart_immediate_offline, #function
428 .proc 04
429smart_immediate_offline:
430 !#PROLOGUE# 0
431 save %sp, -128, %sp
432 !#PROLOGUE# 1
433 st %i0, [%fp+68]
434 st %i1, [%fp+72]
435 ld [%fp+72], %g1
436 and %g1, 255, %o5
437 sethi %hi(12733440), %g1
438 or %g1, 768, %g1
439 or %o5, %g1, %g1
440 st %g0, [%sp+92]
441 ld [%fp+68], %o0
442 mov 176, %o1
443 mov 212, %o2
444 mov %g1, %o3
445 mov 0, %o4
446 mov 0, %o5
447 call ata_cmd, 0
448 nop
449 mov %o0, %g1
450 st %g1, [%fp-20]
451 ld [%fp-20], %g1
452 cmp %g1, 0
453 be .LL23
454 nop
455 mov -1, %g1
456 st %g1, [%fp-24]
457 b .LL24
458 nop
459.LL23:
460 st %g0, [%fp-24]
461.LL24:
462 ld [%fp-24], %g1
463 mov %g1, %i0
464 ret
465 restore
466 .size smart_immediate_offline, .-smart_immediate_offline
467 .align 4
468 .global smart_read_log
469 .type smart_read_log, #function
470 .proc 04
471smart_read_log:
472 !#PROLOGUE# 0
473 save %sp, -128, %sp
474 !#PROLOGUE# 1
475 st %i0, [%fp+68]
476 st %i1, [%fp+72]
477 st %i2, [%fp+76]
478 st %i3, [%fp+80]
479 ld [%fp+72], %g1
480 and %g1, 255, %o5
481 sethi %hi(12733440), %g1
482 or %g1, 768, %g1
483 or %o5, %g1, %o5
484 ld [%fp+80], %g1
485 st %g1, [%sp+92]
486 ld [%fp+68], %o0
487 mov 176, %o1
488 mov 213, %o2
489 mov %o5, %o3
490 ld [%fp+76], %o4
491 ld [%fp+76], %o5
492 call ata_cmd, 0
493 nop
494 mov %o0, %g1
495 st %g1, [%fp-20]
496 ld [%fp-20], %g1
497 cmp %g1, 0
498 be .LL26
499 nop
500 mov -1, %g1
501 st %g1, [%fp-24]
502 b .LL27
503 nop
504.LL26:
505 st %g0, [%fp-24]
506.LL27:
507 ld [%fp-24], %g1
508 mov %g1, %i0
509 ret
510 restore
511 .size smart_read_log, .-smart_read_log
512 .align 4
513 .global smart_enable
514 .type smart_enable, #function
515 .proc 04
516smart_enable:
517 !#PROLOGUE# 0
518 save %sp, -128, %sp
519 !#PROLOGUE# 1
520 st %i0, [%fp+68]
521 st %g0, [%sp+92]
522 ld [%fp+68], %o0
523 mov 176, %o1
524 mov 216, %o2
525 sethi %hi(12733440), %g1
526 or %g1, 768, %o3
527 mov 0, %o4
528 mov 0, %o5
529 call ata_cmd, 0
530 nop
531 mov %o0, %g1
532 st %g1, [%fp-20]
533 ld [%fp-20], %g1
534 cmp %g1, 0
535 be .LL29
536 nop
537 mov -1, %g1
538 st %g1, [%fp-24]
539 b .LL30
540 nop
541.LL29:
542 st %g0, [%fp-24]
543.LL30:
544 ld [%fp-24], %g1
545 mov %g1, %i0
546 ret
547 restore
548 .size smart_enable, .-smart_enable
549 .align 4
550 .global smart_disable
551 .type smart_disable, #function
552 .proc 04
553smart_disable:
554 !#PROLOGUE# 0
555 save %sp, -128, %sp
556 !#PROLOGUE# 1
557 st %i0, [%fp+68]
558 st %g0, [%sp+92]
559 ld [%fp+68], %o0
560 mov 176, %o1
561 mov 217, %o2
562 sethi %hi(12733440), %g1
563 or %g1, 768, %o3
564 mov 0, %o4
565 mov 0, %o5
566 call ata_cmd, 0
567 nop
568 mov %o0, %g1
569 st %g1, [%fp-20]
570 ld [%fp-20], %g1
571 cmp %g1, 0
572 be .LL32
573 nop
574 mov -1, %g1
575 st %g1, [%fp-24]
576 b .LL33
577 nop
578.LL32:
579 st %g0, [%fp-24]
580.LL33:
581 ld [%fp-24], %g1
582 mov %g1, %i0
583 ret
584 restore
585 .size smart_disable, .-smart_disable
586 .align 4
587 .global smart_status
588 .type smart_status, #function
589 .proc 04
590smart_status:
591 !#PROLOGUE# 0
592 save %sp, -128, %sp
593 !#PROLOGUE# 1
594 st %i0, [%fp+68]
595 st %g0, [%sp+92]
596 ld [%fp+68], %o0
597 mov 176, %o1
598 mov 218, %o2
599 sethi %hi(12733440), %g1
600 or %g1, 768, %o3
601 mov 0, %o4
602 mov 0, %o5
603 call ata_cmd, 0
604 nop
605 mov %o0, %g1
606 st %g1, [%fp-20]
607 ld [%fp-20], %g1
608 cmp %g1, 0
609 be .LL35
610 nop
611 mov -1, %g1
612 st %g1, [%fp-24]
613 b .LL36
614 nop
615.LL35:
616 st %g0, [%fp-24]
617.LL36:
618 ld [%fp-24], %g1
619 mov %g1, %i0
620 ret
621 restore
622 .size smart_status, .-smart_status
623 .align 4
624 .global smart_status_check
625 .type smart_status_check, #function
626 .proc 04
627smart_status_check:
628 !#PROLOGUE# 0
629 save %sp, -128, %sp
630 !#PROLOGUE# 1
631 st %i0, [%fp+68]
632 st %g0, [%sp+92]
633 ld [%fp+68], %o0
634 mov 176, %o1
635 mov 218, %o2
636 sethi %hi(12733440), %g1
637 or %g1, 768, %o3
638 mov 0, %o4
639 mov 0, %o5
640 call ata_cmd, 0
641 nop
642 mov %o0, %g1
643 st %g1, [%fp-20]
644 ld [%fp-20], %g1
645 cmp %g1, 0
646 be .LL38
647 nop
648 mov -1, %g1
649 st %g1, [%fp-24]
650 b .LL37
651 nop
652.LL38:
653 st %g0, [%fp-24]
654.LL37:
655 ld [%fp-24], %i0
656 ret
657 restore
658 .size smart_status_check, .-smart_status_check
659 .align 4
660 .global smart_auto_offline
661 .type smart_auto_offline, #function
662 .proc 04
663smart_auto_offline:
664 !#PROLOGUE# 0
665 save %sp, -128, %sp
666 !#PROLOGUE# 1
667 st %i0, [%fp+68]
668 st %i1, [%fp+72]
669 st %g0, [%sp+92]
670 ld [%fp+68], %o0
671 mov 176, %o1
672 mov 219, %o2
673 sethi %hi(12733440), %g1
674 or %g1, 768, %o3
675 ld [%fp+72], %o4
676 mov 0, %o5
677 call ata_cmd, 0
678 nop
679 mov %o0, %g1
680 st %g1, [%fp-20]
681 ld [%fp-20], %g1
682 cmp %g1, 0
683 be .LL40
684 nop
685 mov -1, %g1
686 st %g1, [%fp-24]
687 b .LL41
688 nop
689.LL40:
690 st %g0, [%fp-24]
691.LL41:
692 ld [%fp-24], %g1
693 mov %g1, %i0
694 ret
695 restore
696 .size smart_auto_offline, .-smart_auto_offline
697 .ident "GCC: (GNU) 3.4.2"