Annotation of embedaddon/smartmontools/os_solaris_ata.s, revision 1.1.1.2
1.1 misho 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
1.1.1.2 ! misho 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.
1.1 misho 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:
1.1.1.2 ! misho 100: .asciz "$Id: os_solaris_ata.s 3728 2012-12-13 17:57:50Z chrfranke $"
1.1 misho 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"
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>