📄 ep931xide.cod
字号:
000d4 e5823000 str r3, [r2]
; 298 : *IDE_UDMAOP = 0;
000d8 e59f3024 ldr r3, [pc, #0x24]
000dc e3a02062 mov r2, #0x62
000e0 e381180a orr r1, r1, #0xA, 16
000e4 e5812000 str r2, [r1]
000e8 e5806000 str r6, [r0]
000ec e5836000 str r6, [r3]
000f0 e3a04001 mov r4, #1
000f4 |$L32983|
; 299 : }
; 300 :
; 301 : return bResult;
000f4 e1a00004 mov r0, r4
; 302 : }
000f8 e28dd004 add sp, sp, #4
000fc e8bd4070 ldmia sp!, {r4 - r6, lr}
00100 e12fff1e bx lr
00104 |$L33814|
00104 b00a000c DCD 0xb00a000c
00108 b00a0008 DCD 0xb00a0008
0010c b00a0004 DCD 0xb00a0004
00110 00000000 DCD |??_C@_1HC@FCKPCMNB@?$AAC?$AAE?$AAP?$AA9?$AA3?$AA1?$AAx?$AAD?$AAi?$AAs?$AAk?$AA?3?$AA?3?$AAI?$AAn?$AAi?$AAt?$AA?5?$AAF?$AAa@|
00114 00000000 DCD |??_C@_1GM@ENNICEOF@?$AAC?$AAE?$AAP?$AA9?$AA3?$AA1?$AAx?$AAD?$AAi?$AAs?$AAk?$AA?3?$AA?3?$AAI?$AAn?$AAi?$AAt?$AA?5?$AAF?$AAa@|
00118 |$M33810|
ENDP ; |?Init@CEP931xPort@@QAAHXZ|, CEP931xPort::Init
EXPORT |??1CEP931xPort@@QAA@XZ| ; CEP931xPort::~CEP931xPort
IMPORT |CloseHandle|
00000 AREA |.text| { |??1CEP931xPort@@QAA@XZ| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$??1CEP931xPort@@QAA@XZ|, PDATA, SELECTION=5, ASSOC=|.text| { |??1CEP931xPort@@QAA@XZ| } ; comdat associative
|$T33821| DCD |$L33820|
DCD 0x40000a01
; Function compile flags: /Ogsy
00000 AREA |.text| { |??1CEP931xPort@@QAA@XZ| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 |??1CEP931xPort@@QAA@XZ| PROC ; CEP931xPort::~CEP931xPort
; 311 : {
00000 |$L33820|
00000 e92d4010 stmdb sp!, {r4, lr}
00004 |$M33818|
00004 e1a04000 mov r4, r0
; 312 : BOOL bResult = TRUE;
; 313 :
; 314 : if(m_hIdeIntEvent)
00008 e5943000 ldr r3, [r4]
0000c e3530000 cmp r3, #0
; 315 : {
; 316 : CloseHandle(m_hIdeIntEvent);
00010 11a00003 movne r0, r3
00014 1b000000 blne CloseHandle
; 317 : }
; 318 :
; 319 : DeleteCriticalSection( &m_CriticalSection);
00018 e2840010 add r0, r4, #0x10
0001c eb000000 bl DeleteCriticalSection
; 320 : }
00020 e8bd4010 ldmia sp!, {r4, lr}
00024 e12fff1e bx lr
00028 |$M33819|
ENDP ; |??1CEP931xPort@@QAA@XZ|, CEP931xPort::~CEP931xPort
EXPORT |?SetupDMAInit@CEP931xPort@@QAAHXZ| ; CEP931xPort::SetupDMAInit
00000 AREA |.text| { |?SetupDMAInit@CEP931xPort@@QAAHXZ| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$?SetupDMAInit@CEP931xPort@@QAAHXZ|, PDATA, SELECTION=5, ASSOC=|.text| { |?SetupDMAInit@CEP931xPort@@QAAHXZ| } ; comdat associative
|$T33830| DCD |$L33829|
DCD 0x40000200
; Function compile flags: /Ogsy
00000 AREA |.text| { |?SetupDMAInit@CEP931xPort@@QAAHXZ| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 |?SetupDMAInit@CEP931xPort@@QAAHXZ| PROC ; CEP931xPort::SetupDMAInit
; 329 : {
00000 |$L33829|
00000 |$M33827|
; 330 :
; 331 : return TRUE;
00000 e3a00001 mov r0, #1
; 332 : }
00004 e12fff1e bx lr
00008 |$M33828|
ENDP ; |?SetupDMAInit@CEP931xPort@@QAAHXZ|, CEP931xPort::SetupDMAInit
EXPORT |?SetupDMA@CEP931xPort@@QAAHPAU_SG_BUF@@KHK@Z| ; CEP931xPort::SetupDMA
IMPORT |memcpy|
IMPORT |LockPages|
IMPORT |UnlockPages|
IMPORT |MapPtrToProcess|
IMPORT |GetCallerProcess|
00000 AREA |.text| { |?SetupDMA@CEP931xPort@@QAAHPAU_SG_BUF@@KHK@Z| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$?SetupDMA@CEP931xPort@@QAAHPAU_SG_BUF@@KHK@Z|, PDATA, SELECTION=5, ASSOC=|.text| { |?SetupDMA@CEP931xPort@@QAAHPAU_SG_BUF@@KHK@Z| } ; comdat associative
|$T33867| DCD |$L33866|
DCD 0x4000d802
; Function compile flags: /Ogsy
00000 AREA |.text| { |?SetupDMA@CEP931xPort@@QAAHPAU_SG_BUF@@KHK@Z| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 |?SetupDMA@CEP931xPort@@QAAHPAU_SG_BUF@@KHK@Z| PROC ; CEP931xPort::SetupDMA
; 347 : {
00000 |$L33866|
00000 e92d4ff0 stmdb sp!, {r4 - r11, lr}
00004 e24dd048 sub sp, sp, #0x48
00008 |$M33864|
00008 e1a08003 mov r8, r3
0000c e1a07002 mov r7, r2
00010 e1a06001 mov r6, r1
00014 e1a05000 mov r5, r0
; 348 : BOOL fLockRet;
; 349 : ULONG ulDmaCount;
; 350 : ULONG ulIDESource, ulIDEDest;
; 351 : ULONG ulBuffer;
; 352 : LPBYTE pBuffer;
; 353 : BOOL fPagesLocked;
; 354 : DWORD PFNs[16];
; 355 : ULONG ulPage, ulNumPages;
; 356 : ULONG ulPageSize = UserKInfo[KINX_PAGESIZE];
; 357 : DWORD dwAlignMask = 3; //* * * CAMSDB Added this 05/05/05. The original
; 358 : //* * * value for alignment was 0x3.
; 359 : volatile register int DumbCntrlRead;
; 360 :
; 361 :
; 362 : DEBUGMSG
; 363 : (
; 364 : ZONE_DMA,
; 365 : (
; 366 : TEXT("ATAPI:SetupDMA Request = %s SgCount=%ld\r\n"),
; 367 : fRead ? TEXT("Read") : TEXT("Write"),
; 368 : dwSgCount
; 369 : )
; 370 : );
; 371 :
; 372 :
; 373 : //* * * NOTE: Bootup default value is:0x04030000. Which says
; 374 : //* * * the following channels are on:
; 375 : // PWRCNT_DMAM2MCH0 0x04000000
; 376 : // PWRCNT_DMAM2MCH1 0x08000000 (Not applicable here)
; 377 : // PWRCNT_DMAM2PCH1 0x00010000
; 378 : // PWRCNT_DMAM2PCH0 0x00020000
; 379 :
; 380 : //
; 381 : // Stop any DMA that is occuring.
; 382 : //
; 383 :
; 384 : // * * * CAMSDB - Took this out because it's very stpuid. = m_pulDmaBase[M2M_CTRL>>2] &= ~M2M_CTRL_START;
; 385 :
; 386 : //* * * CAMSDB - Clear out control so it's very null.
; 387 : m_pulDmaBase[M2M_CTRL>>2] = 0;
00018 e595400c ldr r4, [r5, #0xC]
0001c e3a0e004 mov lr, #4
00020 e24eec35 sub lr, lr, #0x35, 24
00024 e59e9000 ldr r9, [lr]
00028 e3a0a000 mov r10, #0
0002c e584a000 str r10, [r4]
; 388 :
; 389 : //* * * Read back the control register to allow hardware state
; 390 : //* * * machines to transition.
; 391 : DumbCntrlRead = m_pulDmaBase[M2M_CTRL>>2];
00030 e595e00c ldr lr, [r5, #0xC]
; 392 :
; 393 : //
; 394 : // Lets save off the DMA information. What?
; 395 : //
; 396 :
; 397 : m_fAligned = TRUE;
00034 e3a0b001 mov r11, #1
; 398 : ulDmaCount = 0;
; 399 :
; 400 : //
; 401 : // Check if either the buffer or the buffer length is unaligned. If the buffers are not
; 402 : //
; 403 :
; 404 : //* * * CAMSDB - Original line. Changed 05/08/04 (START)
; 405 : //if(dwSgCount ==1 && !((ULONG)pSgBuf[0].sb_buf & 0x3) && !(pSgBuf[0].sb_len & 0x3))
; 406 : //* * * CAMSDB - Original line. Changed 05/08/04 (END)
; 407 :
; 408 : if(dwSgCount ==1 && !((ULONG)pSgBuf[0].sb_buf & dwAlignMask) && !(pSgBuf[0].sb_len & dwAlignMask))
00038 e3570001 cmp r7, #1
0003c e59ee000 ldr lr, [lr]
00040 e585b04c str r11, [r5, #0x4C]
00044 e58de000 str lr, [sp]
00048 1a000034 bne |$L33020|
0004c e596e000 ldr lr, [r6]
00050 e31e0003 tst lr, #3
00054 1a000031 bne |$L33020|
00058 e596e004 ldr lr, [r6, #4]
0005c e31e0003 tst lr, #3
00060 1a00002e bne |$L33020|
; 409 : {
; 410 : //
; 411 : // Map the pointer to the process so that we have a valid pointer in our process.
; 412 : //
; 413 : m_pucDmaBuffer = (LPBYTE)MapPtrToProcess(pSgBuf[0].sb_buf, GetCallerProcess());
00064 eb000000 bl GetCallerProcess
00068 e1a01000 mov r1, r0
0006c e5960000 ldr r0, [r6]
00070 eb000000 bl MapPtrToProcess
00074 e5850030 str r0, [r5, #0x30]
; 414 :
; 415 : //
; 416 : // Lock the pages for reading or writing.
; 417 : //
; 418 : fPagesLocked = LockPages
; 419 : (
; 420 : m_pucDmaBuffer,
; 421 : pSgBuf[0].sb_len,
; 422 : PFNs,
; 423 : fRead ? LOCKFLAG_WRITE : LOCKFLAG_READ
; 424 : );
00078 e5961004 ldr r1, [r6, #4]
0007c e3580000 cmp r8, #0
00080 13a03001 movne r3, #1
00084 03a03004 moveq r3, #4
00088 e28d2008 add r2, sp, #8
0008c eb000000 bl LockPages
00090 e3500000 cmp r0, #0
; 425 :
; 426 :
; 427 : //
; 428 : // If the function succeds, Check to make sure that the pages are physically contiguous.
; 429 : // If they are not then do the unaligned buffer case.
; 430 : //
; 431 : if(fPagesLocked)
00094 0a000022 beq |$L33031|
; 432 : {
; 433 : ulNumPages = 1 + ( (ULONG(m_pucDmaBuffer) + pSgBuf[0].sb_len) >> m_ulPageShift) -
; 434 : ( ULONG(m_pucDmaBuffer) >> m_ulPageShift);
00098 e5950030 ldr r0, [r5, #0x30]
0009c e5963004 ldr r3, [r6, #4]
000a0 e5952050 ldr r2, [r5, #0x50]
; 435 :
; 436 : for(ulPage = 0; ulPage< (ulNumPages - 1); ulPage++)
000a4 e3a0e000 mov lr, #0
000a8 e0833000 add r3, r3, r0
000ac e1a03233 mov r3, r3, lsr r2
000b0 e0433230 sub r3, r3, r0, lsr r2
000b4 e2833001 add r3, r3, #1
000b8 e2534001 subs r4, r3, #1
000bc 0a00000a beq |$L33025|
; 432 : {
; 433 : ulNumPages = 1 + ( (ULONG(m_pucDmaBuffer) + pSgBuf[0].sb_len) >> m_ulPageShift) -
; 434 : ( ULONG(m_pucDmaBuffer) >> m_ulPageShift);
000c0 e28d1008 add r1, sp, #8
000c4 |$L33023|
; 437 : {
; 438 : if(PFNs[ulPage] !=PFNs[ulPage + 1])
000c4 e5912000 ldr r2, [r1]
000c8 e5913004 ldr r3, [r1, #4]
000cc e1520003 cmp r2, r3
000d0 1a000004 bne |$L33843|
000d4 e28ee001 add lr, lr, #1
000d8 e15e0004 cmp lr, r4
000dc e2811004 add r1, r1, #4
000e0 3afffff7 bcc |$L33023|
000e4 ea000000 b |$L33025|
000e8 |$L33843|
; 439 : {
; 440 : m_fAligned = FALSE;
000e8 e585a04c str r10, [r5, #0x4C]
000ec |$L33025|
; 441 : break;
; 442 : }
; 443 : }
; 444 :
; 445 : //
; 446 : // If it is aligned then calculate the current physical address.
; 447 : //
; 448 : if(m_fAligned )
000ec e595304c ldr r3, [r5, #0x4C]
000f0 e3530000 cmp r3, #0
; 449 : {
; 450 : //* * * UserKInfo[KINX_PFN_SHIFT].
; 451 :
; 452 : m_ulDmaPhysBuff = PFNs[0] + ((ULONG)m_pucDmaBuffer & (ulPageSize -1));
000f4 159d2008 ldrne r2, [sp, #8]
000f8 12493001 subne r3, r9, #1
000fc 10033000 andne r3, r3, r0
00100 10833002 addne r3, r3, r2
00104 15853034 strne r3, [r5, #0x34]
; 453 : m_ulDmaCount = pSgBuf[0].sb_len;
00108 15963004 ldrne r3, [r6, #4]
0010c 15853038 strne r3, [r5, #0x38]
00110 1a000003 bne |$L33031|
; 454 : }
; 455 : else
; 456 : {
; 457 : //
; 458 : // Unlock the pages and free the Mapped pointer.
; 459 : //
; 460 : fLockRet = UnlockPages
; 461 : (
; 462 : m_pucDmaBuffer,
; 463 : pSgBuf[0].sb_len
; 464 : );
00114 e5961004 ldr r1, [r6, #4]
00118 eb000000 bl UnlockPages
; 465 : ASSERT(fLockRet);
; 466 : }
; 467 : }
; 468 : }
; 469 : else
0011c ea000000 b |$L33031|
00120 |$L33020|
; 470 : {
; 471 : m_fAligned = FALSE;
00120 e585a04c str r10, [r5, #0x4C]
00124 |$L33031|
; 472 : }
; 473 :
; 474 : //
; 475 : // If the pSgBuf are unaligned copy the entire buffer to our buffer.
; 476 : //
; 477 : if(!m_fAligned )
00124 e595304c ldr r3, [r5, #0x4C]
00128 e3530000 cmp r3, #0
0012c 1a000017 bne |$L33032|
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -