]> git.proxmox.com Git - mirror_smartmontools-debian.git/blob - os_solaris_ata.s
Imported Upstream version 6.1+svn3812
[mirror_smartmontools-debian.git] / os_solaris_ata.s
1 !
2 ! os_solaris_ata.s
3 !
4 ! Home page of code is: http://smartmontools.sourceforge.net
5 !
6 ! Copyright (C) 2003-8 SAWADA Keiji <smartmontools-support@lists.sourceforge.net>
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
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.
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:
100 .asciz "$Id: os_solaris_ata.s 3728 2012-12-13 17:57:50Z chrfranke $"
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
106 os_solaris_ata_s_cvsid:
107 .long .LLC0
108 .section ".text"
109 .align 4
110 .type ata_cmd, #function
111 .proc 04
112 ata_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
213 ata_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
257 ata_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
301 smart_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
346 smart_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
391 smart_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
429 smart_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
471 smart_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
516 smart_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
553 smart_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
590 smart_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
627 smart_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
663 smart_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"