added sg_memcpy to copy data into a scatter-gather table (inspired by IDE device manager)

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22351 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Marcus Overhagen
2007-09-28 21:19:14 +00:00
parent 51e5c73eca
commit 91f867e016
3 changed files with 32 additions and 1 deletions
@@ -1,5 +1,8 @@
SubDir HAIKU_TOP src add-ons kernel busses scsi ahci ;
UsePrivateHeaders drivers kernel ;
UsePrivateHeaders [ FDirName kernel arch $(TARGET_ARCH) ] ;
KernelAddon ahci :
ahci.c
ahci_controller.cpp
@@ -6,6 +6,7 @@
#include <KernelExport.h>
#include <OS.h>
#include <vm.h>
#include <string.h>
@@ -74,3 +75,28 @@ map_mem(void **virt, void *phy, size_t size, uint32 protection, const char *name
return area;
}
status_t
sg_memcpy(const physical_entry *sgTable, int sgCount, const void *data, size_t dataSize)
{
int i;
for (i = 0; i < sgCount && dataSize > 0; i++) {
size_t size = min_c(dataSize, sgTable[i].size);
addr_t address;
if (vm_get_physical_page((addr_t)sgTable[i].address, &address, PHYSICAL_PAGE_CAN_WAIT) < B_OK)
return B_ERROR;
TRACE("sg_memcpy phyAddr %p, addr %p, size %lu\n", sgTable[i].address, (void *)address, size);
memcpy((void *)address, data, size);
vm_put_physical_page(address);
data = (char *)data + size;
dataSize -= size;
}
if (dataSize != 0)
return B_ERROR;
return B_OK;
}
+3 -1
View File
@@ -5,7 +5,7 @@
#ifndef __UTIL_H
#define __UTIL_H
#include <OS.h>
#include <KernelExport.h>
#ifdef __cplusplus
extern "C" {
@@ -14,6 +14,8 @@ extern "C" {
area_id alloc_mem(void **virt, void **phy, size_t size, uint32 protection, const char *name);
area_id map_mem(void **virt, void *phy, size_t size, uint32 protection, const char *name);
status_t sg_memcpy(const physical_entry *sgTable, int sgCount, const void *data, size_t dataSize);
#ifdef __cplusplus
}
#endif