44 lines
1.4 KiB
PHP
44 lines
1.4 KiB
PHP
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
|
;; ;;
|
||
|
;; Copyright (C) KolibriOS team 2013-2015. All rights reserved. ;;
|
||
|
;; Distributed under terms of the GNU General Public License ;;
|
||
|
;; ;;
|
||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
|
|
||
|
$Revision$
|
||
|
|
||
|
; Memory management for USB structures.
|
||
|
; Protocol layer uses the common kernel heap malloc/free.
|
||
|
; Hardware layer has special requirements:
|
||
|
; * memory blocks should be properly aligned
|
||
|
; * memory blocks should not cross page boundary
|
||
|
; Hardware layer allocates fixed-size blocks.
|
||
|
; Thus, hardware layer uses the system slab allocator.
|
||
|
|
||
|
; Helper procedure: translate physical address in ecx
|
||
|
; of some transfer descriptor to linear address.
|
||
|
; in: eax = address of first page
|
||
|
proc usb_td_to_virt
|
||
|
; Traverse all pages used for transfer descriptors, looking for the one
|
||
|
; with physical address as in ecx.
|
||
|
@@:
|
||
|
test eax, eax
|
||
|
jz .zero
|
||
|
push eax
|
||
|
call get_pg_addr
|
||
|
sub eax, ecx
|
||
|
jz .found
|
||
|
cmp eax, -0x1000
|
||
|
ja .found
|
||
|
pop eax
|
||
|
mov eax, [eax+0x1000-4]
|
||
|
jmp @b
|
||
|
.found:
|
||
|
; When found, combine page address from eax with page offset from ecx.
|
||
|
pop eax
|
||
|
and ecx, 0xFFF
|
||
|
add eax, ecx
|
||
|
.zero:
|
||
|
ret
|
||
|
endp
|