📄 os_solaris_ata.s
字号:
! ! os_solaris_ata.s! ! Home page of code is: http://smartmontools.sourceforge.net! ! Copyright (C) 2003-8 SAWADA Keiji <smartmontools-support@lists.sourceforge.net>! ! This program is free software; you can redistribute it and/or modify! it under the terms of the GNU General Public License as published by! the Free Software Foundation; either version 2 of the License, or! (at your option) any later version.! ! This program is distributed in the hope that it will be useful, but! WITHOUT ANY WARRANTY; without even the implied warranty of! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU! General Public License for more details.! ! You should have received a copy of the GNU General Public License! along with this program; if not, write to the Free Software! Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.! ! ! --------------------------------------------------------! direct access routines to ATA device under Solaris/SPARC! --------------------------------------------------------! ! Information! -----------! ! In Solaris, programmer can pass SCSI command to target device directly! by using USCSI ioctl or using "scg" generic SCSI driver. But, such! method does not exist for ATA devices.! ! However, I can access Solaris kernel source because I am subscriber of! Source Foundation Program of Solaris. So, I can find method of! accessing ATA device directly. The method is to pack command in! undocumented structure and issue ioctl that appears only in kernel! source. Yes, that is the same way in using USCSI interface.! ! But, I met difficulty in disclosing this technique. I have signed NDA! with Sun that inhibits me not to violate their intellectual property.! ! Fortunately, Sun allows licensees to publish "Interfaces" if:! ! (1) he/she treats Solaris code as confidential! ! (2) and he/she doesn't incorporate Sun's code into his/her code! ! (3) and disclose enough information to use "Interface" to everyone.! ! So, I publish that technique in assembly code or object code because:! ! (1) I believe Sun's intellectural property is not invaded because I! didn't reveal any struct member and ioctl to non-licensee.! ! (2) no piece of kernel source is included in this code.! ! (3) And finally, I publish enough information below in order to use! this code.! ! For last reason, please don't remove "Calling Interface" section from! distribution.! ! ! Calling Interface! -----------------! ! Name of function/macro presents corresponding S.M.A.R.T. command.! ! Parameters are described below.! ! int fd! ! File descriptor of ATA device. Device would be! /dev/rdsk/cXtXdXsX.! ! Device should be raw device serviced by "dada" driver. ATAPI! CD-ROM/R/RW, DVD-ROM, and so on are not allowed because they are! serviced by "sd" driver. On x86 Solaris, "cmdk" driver services! them, this routines doesn't work.! ! int s! Select sector for service. For example, this indicates log sector! number for smart_read_log() function. Probably you need to read! ATA specification for this parameter.! ! void *data! Data going to be read/written. It don't have to be word aligned,! But data shall points valid user memory space.! ! This is very tiny routines, but if you feel this insufficient, please! let me know.! ! ksw / SAWADA Keiji! <card_captor@users.sourceforge.net> .file "solaris-ata-in.c" .section ".rodata" .align 8.LLC0: .asciz "$Id: os_solaris_ata.s,v 1.6 2008/03/04 22:09:47 ballen4705 Exp $" .global os_solaris_ata_s_cvsid .section ".data" .align 4 .type os_solaris_ata_s_cvsid, #object .size os_solaris_ata_s_cvsid, 4os_solaris_ata_s_cvsid: .long .LLC0 .section ".text" .align 4 .type ata_cmd, #function .proc 04ata_cmd: !#PROLOGUE# 0 save %sp, -184, %sp !#PROLOGUE# 1 st %i0, [%fp+68] st %i1, [%fp+72] st %i2, [%fp+76] st %i3, [%fp+80] st %i4, [%fp+84] st %i5, [%fp+88] ld [%fp+92], %g1 st %g1, [%fp-76] ld [%fp-76], %g1 and %g1, 3, %g1 cmp %g1, 0 be .LL2 nop mov -2, %g1 st %g1, [%fp-80] b .LL1 nop.LL2: add %fp, -56, %g1 mov %g1, %o0 mov 0, %o1 mov 36, %o2 call memset, 0 nop add %fp, -72, %g1 mov %g1, %o0 mov 0, %o1 mov 16, %o2 call memset, 0 nop ld [%fp+72], %g1 stb %g1, [%fp-72] mov 1, %g1 stb %g1, [%fp-71] mov 1, %g1 stb %g1, [%fp-70] ld [%fp+76], %g1 stb %g1, [%fp-69] ld [%fp+84], %g1 sll %g1, 9, %g1 st %g1, [%fp-68] ld [%fp+80], %g1 st %g1, [%fp-60] mov 10, %g1 sth %g1, [%fp-52] ld [%fp+88], %g1 cmp %g1, 0 be .LL3 nop mov 14, %g1 st %g1, [%fp-84] b .LL4 nop.LL3: mov 6, %g1 st %g1, [%fp-84].LL4: ld [%fp-84], %g1 st %g1, [%fp-48] ld [%fp+88], %g1 sll %g1, 9, %g1 st %g1, [%fp-44] ld [%fp+88], %g1 sll %g1, 9, %g1 st %g1, [%fp-40] ld [%fp+88], %g1 cmp %g1, 0 be .LL5 nop ld [%fp+92], %g1 st %g1, [%fp-88] b .LL6 nop.LL5: st %g0, [%fp-88].LL6: ld [%fp-88], %g1 st %g1, [%fp-36] add %fp, -72, %g1 st %g1, [%fp-32] add %fp, -56, %g1 ld [%fp+68], %o0 mov 1481, %o1 mov %g1, %o2 call ioctl, 0 nop mov %o0, %g1 st %g1, [%fp-80].LL1: ld [%fp-80], %i0 ret restore .size ata_cmd, .-ata_cmd .align 4 .global ata_identify .type ata_identify, #function .proc 04ata_identify: !#PROLOGUE# 0 save %sp, -648, %sp !#PROLOGUE# 1 st %i0, [%fp+68] st %i1, [%fp+72] add %fp, -536, %g1 st %g1, [%sp+92] ld [%fp+68], %o0 mov 236, %o1 mov 0, %o2 mov 0, %o3 mov 1, %o4 mov 1, %o5 call ata_cmd, 0 nop mov %o0, %g1 st %g1, [%fp-20] add %fp, -536, %g1 ld [%fp+72], %o0 mov %g1, %o1 mov 512, %o2 call memcpy, 0 nop ld [%fp-20], %g1 cmp %g1, 0 be .LL8 nop mov -1, %g1 st %g1, [%fp-540] b .LL9 nop.LL8: st %g0, [%fp-540].LL9: ld [%fp-540], %g1 mov %g1, %i0 ret restore .size ata_identify, .-ata_identify .align 4 .global ata_pidentify .type ata_pidentify, #function .proc 04ata_pidentify: !#PROLOGUE# 0 save %sp, -648, %sp !#PROLOGUE# 1 st %i0, [%fp+68] st %i1, [%fp+72] add %fp, -536, %g1 st %g1, [%sp+92] ld [%fp+68], %o0 mov 161, %o1 mov 0, %o2 mov 0, %o3 mov 1, %o4 mov 1, %o5 call ata_cmd, 0 nop mov %o0, %g1 st %g1, [%fp-20] add %fp, -536, %g1 ld [%fp+72], %o0 mov %g1, %o1 mov 512, %o2 call memcpy, 0 nop ld [%fp-20], %g1 cmp %g1, 0 be .LL11 nop mov -1, %g1 st %g1, [%fp-540] b .LL12 nop.LL11: st %g0, [%fp-540].LL12: ld [%fp-540], %g1 mov %g1, %i0 ret restore .size ata_pidentify, .-ata_pidentify .align 4 .global smart_read_data .type smart_read_data, #function .proc 04smart_read_data: !#PROLOGUE# 0 save %sp, -648, %sp !#PROLOGUE# 1 st %i0, [%fp+68] st %i1, [%fp+72] add %fp, -536, %g1 st %g1, [%sp+92] ld [%fp+68], %o0 mov 176, %o1 mov 208, %o2 sethi %hi(12733440), %g1 or %g1, 768, %o3 mov 0, %o4 mov 1, %o5 call ata_cmd, 0 nop mov %o0, %g1 st %g1, [%fp-20] add %fp, -536, %g1 ld [%fp+72], %o0 mov %g1, %o1 mov 512, %o2 call memcpy, 0 nop ld [%fp-20], %g1 cmp %g1, 0 be .LL14 nop mov -1, %g1 st %g1, [%fp-540] b .LL15 nop.LL14: st %g0, [%fp-540].LL15: ld [%fp-540], %g1 mov %g1, %i0 ret restore .size smart_read_data, .-smart_read_data .align 4 .global smart_read_thresholds .type smart_read_thresholds, #function .proc 04smart_read_thresholds: !#PROLOGUE# 0 save %sp, -648, %sp !#PROLOGUE# 1 st %i0, [%fp+68] st %i1, [%fp+72] add %fp, -536, %g1 st %g1, [%sp+92] ld [%fp+68], %o0 mov 176, %o1 mov 209, %o2 sethi %hi(12733440), %g1 or %g1, 769, %o3 mov 1, %o4 mov 1, %o5 call ata_cmd, 0 nop mov %o0, %g1 st %g1, [%fp-20] add %fp, -536, %g1 ld [%fp+72], %o0 mov %g1, %o1 mov 512, %o2 call memcpy, 0 nop ld [%fp-20], %g1 cmp %g1, 0 be .LL17 nop mov -1, %g1 st %g1, [%fp-540] b .LL18 nop.LL17: st %g0, [%fp-540].LL18: ld [%fp-540], %g1 mov %g1, %i0 ret restore .size smart_read_thresholds, .-smart_read_thresholds .align 4 .global smart_auto_save .type smart_auto_save, #function .proc 04smart_auto_save: !#PROLOGUE# 0 save %sp, -128, %sp !#PROLOGUE# 1 st %i0, [%fp+68] st %i1, [%fp+72] st %g0, [%sp+92] ld [%fp+68], %o0 mov 176, %o1 mov 210, %o2 sethi %hi(12733440), %g1 or %g1, 768, %o3 ld [%fp+72], %o4 mov 0, %o5 call ata_cmd, 0 nop mov %o0, %g1 st %g1, [%fp-20] ld [%fp-20], %g1 cmp %g1, 0 be .LL20 nop mov -1, %g1 st %g1, [%fp-24] b .LL21 nop.LL20: st %g0, [%fp-24].LL21: ld [%fp-24], %g1 mov %g1, %i0 ret restore .size smart_auto_save, .-smart_auto_save .align 4 .global smart_immediate_offline .type smart_immediate_offline, #function .proc 04smart_immediate_offline: !#PROLOGUE# 0 save %sp, -128, %sp !#PROLOGUE# 1 st %i0, [%fp+68] st %i1, [%fp+72] ld [%fp+72], %g1 and %g1, 255, %o5 sethi %hi(12733440), %g1 or %g1, 768, %g1 or %o5, %g1, %g1 st %g0, [%sp+92] ld [%fp+68], %o0 mov 176, %o1 mov 212, %o2 mov %g1, %o3 mov 0, %o4 mov 0, %o5 call ata_cmd, 0 nop mov %o0, %g1 st %g1, [%fp-20] ld [%fp-20], %g1 cmp %g1, 0 be .LL23 nop mov -1, %g1 st %g1, [%fp-24] b .LL24 nop.LL23: st %g0, [%fp-24].LL24: ld [%fp-24], %g1 mov %g1, %i0 ret restore .size smart_immediate_offline, .-smart_immediate_offline .align 4 .global smart_read_log .type smart_read_log, #function .proc 04smart_read_log: !#PROLOGUE# 0 save %sp, -128, %sp !#PROLOGUE# 1 st %i0, [%fp+68] st %i1, [%fp+72] st %i2, [%fp+76] st %i3, [%fp+80] ld [%fp+72], %g1 and %g1, 255, %o5 sethi %hi(12733440), %g1 or %g1, 768, %g1 or %o5, %g1, %o5 ld [%fp+80], %g1 st %g1, [%sp+92] ld [%fp+68], %o0 mov 176, %o1 mov 213, %o2 mov %o5, %o3 ld [%fp+76], %o4 ld [%fp+76], %o5 call ata_cmd, 0 nop mov %o0, %g1 st %g1, [%fp-20] ld [%fp-20], %g1 cmp %g1, 0 be .LL26 nop mov -1, %g1 st %g1, [%fp-24] b .LL27 nop.LL26: st %g0, [%fp-24].LL27: ld [%fp-24], %g1 mov %g1, %i0 ret restore .size smart_read_log, .-smart_read_log .align 4 .global smart_enable .type smart_enable, #function .proc 04smart_enable: !#PROLOGUE# 0 save %sp, -128, %sp !#PROLOGUE# 1 st %i0, [%fp+68] st %g0, [%sp+92] ld [%fp+68], %o0 mov 176, %o1 mov 216, %o2 sethi %hi(12733440), %g1 or %g1, 768, %o3 mov 0, %o4 mov 0, %o5 call ata_cmd, 0 nop mov %o0, %g1 st %g1, [%fp-20] ld [%fp-20], %g1 cmp %g1, 0 be .LL29 nop mov -1, %g1 st %g1, [%fp-24] b .LL30 nop.LL29: st %g0, [%fp-24].LL30: ld [%fp-24], %g1 mov %g1, %i0 ret restore .size smart_enable, .-smart_enable .align 4 .global smart_disable .type smart_disable, #function .proc 04smart_disable: !#PROLOGUE# 0 save %sp, -128, %sp !#PROLOGUE# 1 st %i0, [%fp+68] st %g0, [%sp+92] ld [%fp+68], %o0 mov 176, %o1 mov 217, %o2 sethi %hi(12733440), %g1 or %g1, 768, %o3 mov 0, %o4 mov 0, %o5 call ata_cmd, 0 nop mov %o0, %g1 st %g1, [%fp-20] ld [%fp-20], %g1 cmp %g1, 0 be .LL32 nop mov -1, %g1 st %g1, [%fp-24] b .LL33 nop.LL32: st %g0, [%fp-24].LL33: ld [%fp-24], %g1 mov %g1, %i0 ret restore .size smart_disable, .-smart_disable .align 4 .global smart_status .type smart_status, #function .proc 04smart_status: !#PROLOGUE# 0 save %sp, -128, %sp !#PROLOGUE# 1 st %i0, [%fp+68] st %g0, [%sp+92] ld [%fp+68], %o0 mov 176, %o1 mov 218, %o2 sethi %hi(12733440), %g1 or %g1, 768, %o3 mov 0, %o4 mov 0, %o5 call ata_cmd, 0 nop mov %o0, %g1 st %g1, [%fp-20] ld [%fp-20], %g1 cmp %g1, 0 be .LL35 nop mov -1, %g1 st %g1, [%fp-24] b .LL36 nop.LL35: st %g0, [%fp-24].LL36: ld [%fp-24], %g1 mov %g1, %i0 ret restore .size smart_status, .-smart_status .align 4 .global smart_status_check .type smart_status_check, #function .proc 04smart_status_check: !#PROLOGUE# 0 save %sp, -128, %sp !#PROLOGUE# 1 st %i0, [%fp+68] st %g0, [%sp+92] ld [%fp+68], %o0 mov 176, %o1 mov 218, %o2 sethi %hi(12733440), %g1 or %g1, 768, %o3 mov 0, %o4 mov 0, %o5 call ata_cmd, 0 nop mov %o0, %g1 st %g1, [%fp-20] ld [%fp-20], %g1 cmp %g1, 0 be .LL38 nop mov -1, %g1 st %g1, [%fp-24] b .LL37 nop.LL38: st %g0, [%fp-24].LL37: ld [%fp-24], %i0 ret restore .size smart_status_check, .-smart_status_check .align 4 .global smart_auto_offline .type smart_auto_offline, #function .proc 04smart_auto_offline: !#PROLOGUE# 0 save %sp, -128, %sp !#PROLOGUE# 1 st %i0, [%fp+68] st %i1, [%fp+72] st %g0, [%sp+92] ld [%fp+68], %o0 mov 176, %o1 mov 219, %o2 sethi %hi(12733440), %g1 or %g1, 768, %o3 ld [%fp+72], %o4 mov 0, %o5 call ata_cmd, 0 nop mov %o0, %g1 st %g1, [%fp-20] ld [%fp-20], %g1 cmp %g1, 0 be .LL40 nop mov -1, %g1 st %g1, [%fp-24] b .LL41 nop.LL40: st %g0, [%fp-24].LL41: ld [%fp-24], %g1 mov %g1, %i0 ret restore .size smart_auto_offline, .-smart_auto_offline .ident "GCC: (GNU) 3.4.2"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -