mirror of
https://github.com/drasko/codezero.git
synced 2026-02-19 13:23:16 +01:00
Kernel updates since December 2009
This commit is contained in:
60
conts/libc/src/memcpy.S
Normal file
60
conts/libc/src/memcpy.S
Normal file
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* Copyright 2010 B Labs.Ltd.
|
||||
*
|
||||
* Author: Prem Mallappa <prem.mallappa@b-labs.co.uk>
|
||||
*
|
||||
* Description: Optimized memcpy for ARM
|
||||
*
|
||||
*/
|
||||
|
||||
#include INC_ARCH(asm.h)
|
||||
/*
|
||||
void*
|
||||
memcpy(void *dst, const void *src, register uint len)
|
||||
*/
|
||||
BEGIN_PROC(memcpy)
|
||||
push {r0, r4-r11, lr}
|
||||
loop32:
|
||||
cmp r2, #32
|
||||
blt loop16
|
||||
ldmia r1!, {r4 - r11}
|
||||
stmia r0!, {r4 - r11}
|
||||
sub r2, r2, #32
|
||||
b loop32
|
||||
|
||||
loop16:
|
||||
cmp r2, #16
|
||||
blt loop8
|
||||
ldmia r1!, {r4 - r7}
|
||||
stmia r0!, {r4 - r7}
|
||||
sub r2, r2, #16
|
||||
b loop16
|
||||
|
||||
loop8:
|
||||
cmp r2, #8
|
||||
blt loop4
|
||||
ldmia r1!, {r4, r5}
|
||||
stmia r0!, {r4, r5}
|
||||
sub r2, r2, #8
|
||||
b loop8
|
||||
|
||||
loop4:
|
||||
cmp r2, #4
|
||||
blt end
|
||||
ldmia r1!, {r4}
|
||||
stmia r0!, {r4}
|
||||
sub r2, r2, #4
|
||||
b loop4
|
||||
end:
|
||||
last:
|
||||
teq r2, #0
|
||||
ldrgtb r4, [r1]
|
||||
strneb r4, [r0] // V7 supports strneb <rt>, [<rb>, +/-<index>] !, with write back
|
||||
lsrne r4, r4, #8
|
||||
subne r2, r2, #1 // Can be reduced to 1 LDR, but has a catch if it is end of memory
|
||||
addne r0, r0, #1 // we dont want to fetch 1 byte extra to end up in abort
|
||||
addne r1, r1, #1 // so, playing safe, worst case 3 LDRs
|
||||
bne last
|
||||
1:
|
||||
pop {r0, r4 - r11, pc}
|
||||
END_PROC(_memcpy)
|
||||
68
conts/libc/src/memset.S
Normal file
68
conts/libc/src/memset.S
Normal file
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
* Copyright 2010 (C) B Labs.
|
||||
* Author: Prem Mallappa <prem.mallappa@b-labs.co.uk>
|
||||
* Description: Optimized memset for ARM
|
||||
*/
|
||||
|
||||
#include INC_ARCH(asm.h)
|
||||
|
||||
/*
|
||||
void *
|
||||
memset(void *dst, int c, int len)
|
||||
*/
|
||||
BEGIN_PROC(memset)
|
||||
stmfd sp!, {r4 - r11, lr}
|
||||
|
||||
and r1, r1, #255 /* c &= 0xff */
|
||||
orr r1, r1, lsl #8 /* c |= c<<8 */
|
||||
orr r1, r1, lsl #16 /* c |= c<<16 */
|
||||
mov r4, r1
|
||||
cmp r2, #8
|
||||
blt 4f
|
||||
movge r5, r4
|
||||
cmpge r2, #16
|
||||
blt 8f
|
||||
movge r6, r4
|
||||
movge r7, r4
|
||||
cmpge r2, #32
|
||||
blt 16f
|
||||
movge r8, r4
|
||||
movge r9, r4
|
||||
movge r10, r4
|
||||
movge r11, r4
|
||||
32:
|
||||
cmp r2, #32
|
||||
blt 16f
|
||||
stmia r0!, {r4 - r11}
|
||||
sub r2, r2, #32
|
||||
b 32b
|
||||
|
||||
16:
|
||||
cmp r2, #16
|
||||
blt 8f
|
||||
stmia r0!, {r4 - r7}
|
||||
sub r2, r2, #16
|
||||
b 16b
|
||||
|
||||
8:
|
||||
cmp r2, #8
|
||||
blt 4f
|
||||
stmia r0!, {r4, r5}
|
||||
sub r2, r2, #8
|
||||
b 8b
|
||||
|
||||
4:
|
||||
cmp r2, #4
|
||||
blt end
|
||||
stmia r0!, {r4}
|
||||
sub r2, r2, #4
|
||||
b 4b
|
||||
end:
|
||||
teq r2, #0
|
||||
strneb r4, [r0, #0]
|
||||
subne r2, r2, #1
|
||||
addne r0, r0, #1
|
||||
bne end
|
||||
|
||||
ldmfd sp!, {r4 - r11, pc}
|
||||
END_PROC(_memset)
|
||||
@@ -2,19 +2,12 @@
|
||||
* Ties up platform's uart driver functions with printf
|
||||
*
|
||||
* Copyright (C) 2009 B Labs Ltd.
|
||||
*
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <pl011_uart.h>
|
||||
|
||||
extern struct pl011_uart uart;
|
||||
#include <libdev/uart.h>
|
||||
|
||||
int __fputc(int c, FILE *stream)
|
||||
{
|
||||
int res;
|
||||
do {
|
||||
res = pl011_tx_char(uart.base, c);
|
||||
} while( res < 0);
|
||||
|
||||
return(0);
|
||||
uart_tx_char(uart_print_base, c);
|
||||
return 0;
|
||||
}
|
||||
|
||||
31
conts/libc/src/sys-userspace/arch-arm/sys_getc.c
Normal file
31
conts/libc/src/sys-userspace/arch-arm/sys_getc.c
Normal file
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Library calls for uart rx.
|
||||
*
|
||||
* Copyright (C) 2009 B Labs Ltd.
|
||||
*
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <libdev/uart.h>
|
||||
|
||||
char fgetc(FILE * file)
|
||||
{
|
||||
return uart_rx_char(uart_print_base);
|
||||
}
|
||||
|
||||
#define MAX_LINE_LEN 256
|
||||
char data[MAX_LINE_LEN];
|
||||
|
||||
char *fgetline(FILE * file)
|
||||
{
|
||||
int index = 0;
|
||||
|
||||
/*
|
||||
* Line will end if,
|
||||
* 1. We have recieved 256 chars or
|
||||
* 2. we recieved EOL: '\n' followed by '\r'
|
||||
*/
|
||||
while((data[index] != '\n' && ((data[index++] = fgetc(file)) != '\r')) ||
|
||||
index != MAX_LINE_LEN);
|
||||
|
||||
return data;
|
||||
}
|
||||
Reference in New Issue
Block a user