Partial implementation of memory functions in kstd
This commit is contained in:
		
							parent
							
								
									4919b802b9
								
							
						
					
					
						commit
						3ad5e67e66
					
				
					 3 changed files with 96 additions and 26 deletions
				
			
		| 
						 | 
				
			
			@ -20,7 +20,8 @@ files = [
 | 
			
		|||
    'cxa.cc',
 | 
			
		||||
    'isr.S',
 | 
			
		||||
 | 
			
		||||
    'kstd/CString.cc'
 | 
			
		||||
    'kstd/CString.cc',
 | 
			
		||||
    'kstd/Memory.cc',
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
toolchain_bin = Dir(os.environ['POLKA_TOOLCHAIN']).Dir('bin')
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,34 +6,101 @@
 | 
			
		|||
 * Basic, low-level memory utilities.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "Memory.hh"
 | 
			
		||||
 | 
			
		||||
namespace kstd {
 | 
			
		||||
namespace Memory {
 | 
			
		||||
 | 
			
		||||
void *
 | 
			
		||||
copy(void *to,
 | 
			
		||||
void*
 | 
			
		||||
copy(void* to,
 | 
			
		||||
     const void* from,
 | 
			
		||||
     usize length)
 | 
			
		||||
{
 | 
			
		||||
    if (to == from) {
 | 
			
		||||
        return to;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    auto toBytes = reinterpret_cast<u8*>(to);
 | 
			
		||||
    auto fromBytes = reinterpret_cast<const u8*>(from);
 | 
			
		||||
    auto toBytesEnd = toBytes + length;
 | 
			
		||||
    auto fromBytesEnd = fromBytes + length;
 | 
			
		||||
 | 
			
		||||
    if ((toBytes <= fromBytes && toBytesEnd > fromBytes) || (fromBytes <= toBytes && fromBytesEnd > toBytes)) {
 | 
			
		||||
        // Memory regions cannot overlap. Do nothing...silently. >_<
 | 
			
		||||
        return to;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // TODO: Copy.
 | 
			
		||||
 | 
			
		||||
    return to;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void*
 | 
			
		||||
move(void* to,
 | 
			
		||||
     const void *from,
 | 
			
		||||
     size_t length)
 | 
			
		||||
{ }
 | 
			
		||||
     usize length)
 | 
			
		||||
{
 | 
			
		||||
    if (to == from) {
 | 
			
		||||
        return to;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    auto toBytes = reinterpret_cast<u8*>(to);
 | 
			
		||||
    auto fromBytes = reinterpret_cast<const u8*>(from);
 | 
			
		||||
    auto toBytesEnd = toBytes + length;
 | 
			
		||||
    auto fromBytesEnd = fromBytes + length;
 | 
			
		||||
 | 
			
		||||
    if ((toBytes <= fromBytes && toBytesEnd > fromBytes) || (fromBytes <= toBytes && fromBytesEnd > toBytes)) {
 | 
			
		||||
        // We have to work backwards here to avoid copying over stuff that we still need to copy.
 | 
			
		||||
    } else {
 | 
			
		||||
        // Straight forward move.
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return to;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void *
 | 
			
		||||
move(void *to,
 | 
			
		||||
     const void *from,
 | 
			
		||||
     size_t length)
 | 
			
		||||
{ }
 | 
			
		||||
void*
 | 
			
		||||
zero(void* ptr,
 | 
			
		||||
     usize length)
 | 
			
		||||
{
 | 
			
		||||
    auto p = reinterpret_cast<u8*>(ptr);
 | 
			
		||||
 | 
			
		||||
    while (length > 8) {
 | 
			
		||||
        *reinterpret_cast<u64*>(p) = u64(0);
 | 
			
		||||
        p += 8;
 | 
			
		||||
        length -= 8;
 | 
			
		||||
    }
 | 
			
		||||
    while (length > 4) {
 | 
			
		||||
        *reinterpret_cast<u32*>(p) = u32(0);
 | 
			
		||||
        p += 4;
 | 
			
		||||
        length -= 4;
 | 
			
		||||
    }
 | 
			
		||||
    while (length > 2) {
 | 
			
		||||
        *reinterpret_cast<u16*>(p) = u16(0);
 | 
			
		||||
        p += 2;
 | 
			
		||||
        length -= 2;
 | 
			
		||||
    }
 | 
			
		||||
    while (length > 0) {
 | 
			
		||||
        *p++ = u8(0);
 | 
			
		||||
        length--;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return ptr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void *
 | 
			
		||||
zero(void *s,
 | 
			
		||||
     size_t length)
 | 
			
		||||
{ }
 | 
			
		||||
void*
 | 
			
		||||
set(void* ptr,
 | 
			
		||||
    u8 value,
 | 
			
		||||
    usize length)
 | 
			
		||||
{
 | 
			
		||||
    auto bytes = reinterpret_cast<u8*>(ptr);
 | 
			
		||||
    for (usize i = 0; i < length; i++) {
 | 
			
		||||
        bytes[i] = value;
 | 
			
		||||
    }
 | 
			
		||||
    return ptr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void *
 | 
			
		||||
set(void *s,
 | 
			
		||||
    uint8_t value,
 | 
			
		||||
    size_t length)
 | 
			
		||||
{ }
 | 
			
		||||
    
 | 
			
		||||
} /* namespace Memory */
 | 
			
		||||
} /* namespace kstd */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,21 +9,23 @@
 | 
			
		|||
#ifndef __MEMORY_HH__
 | 
			
		||||
#define __MEMORY_HH__
 | 
			
		||||
 | 
			
		||||
#include "Types.hh"
 | 
			
		||||
 | 
			
		||||
namespace kstd {
 | 
			
		||||
namespace Memory {
 | 
			
		||||
 | 
			
		||||
/** Copy `length` bytes from `from` to `to`. */
 | 
			
		||||
void *copy(void *to, const void *from, size_t length);
 | 
			
		||||
void* copy(void* to, const void* from, usize length);
 | 
			
		||||
 | 
			
		||||
/** Move `length` bytes from `from` to `to`. */
 | 
			
		||||
void *move(void *to, const void *from, size_t length);
 | 
			
		||||
void* move(void* to, const void* from, usize length);
 | 
			
		||||
 | 
			
		||||
/** Set `length` bytes starting at `s` to zero. */
 | 
			
		||||
void *zero(void *s, size_t length);
 | 
			
		||||
void* zero(void* s, usize length);
 | 
			
		||||
 | 
			
		||||
/** Set `length` bytes starting at `s` to `value`. */
 | 
			
		||||
void *set(void *s, uint8_t value, size_t length); 
 | 
			
		||||
    
 | 
			
		||||
void* set(void* s, u8 value, usize length);
 | 
			
		||||
 | 
			
		||||
} /* namespace Memory */
 | 
			
		||||
} /* namespace kstd */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue