forked from KolibriOS/kolibrios
bdef8f9596
git-svn-id: svn://kolibrios.org@9191 a494cfbc-eb01-0410-851d-a64ba20cac60
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
|