Merge changes from topic "ld/mtd_framework" into integration
* changes: io: change seek offset to signed long long compiler_rt: Import aeabi_ldivmode.S file and dependencies
This commit is contained in:
commit
45cc606ea7
|
@ -26,9 +26,9 @@ typedef struct {
|
||||||
* valid.
|
* valid.
|
||||||
*/
|
*/
|
||||||
int in_use;
|
int in_use;
|
||||||
uintptr_t base;
|
uintptr_t base;
|
||||||
size_t file_pos;
|
unsigned long long file_pos;
|
||||||
size_t size;
|
unsigned long long size;
|
||||||
} file_state_t;
|
} file_state_t;
|
||||||
|
|
||||||
static file_state_t current_file = {0};
|
static file_state_t current_file = {0};
|
||||||
|
@ -44,7 +44,7 @@ static int memmap_dev_open(const uintptr_t dev_spec, io_dev_info_t **dev_info);
|
||||||
static int memmap_block_open(io_dev_info_t *dev_info, const uintptr_t spec,
|
static int memmap_block_open(io_dev_info_t *dev_info, const uintptr_t spec,
|
||||||
io_entity_t *entity);
|
io_entity_t *entity);
|
||||||
static int memmap_block_seek(io_entity_t *entity, int mode,
|
static int memmap_block_seek(io_entity_t *entity, int mode,
|
||||||
ssize_t offset);
|
signed long long offset);
|
||||||
static int memmap_block_len(io_entity_t *entity, size_t *length);
|
static int memmap_block_len(io_entity_t *entity, size_t *length);
|
||||||
static int memmap_block_read(io_entity_t *entity, uintptr_t buffer,
|
static int memmap_block_read(io_entity_t *entity, uintptr_t buffer,
|
||||||
size_t length, size_t *length_read);
|
size_t length, size_t *length_read);
|
||||||
|
@ -131,7 +131,8 @@ static int memmap_block_open(io_dev_info_t *dev_info, const uintptr_t spec,
|
||||||
|
|
||||||
|
|
||||||
/* Seek to a particular file offset on the memmap device */
|
/* Seek to a particular file offset on the memmap device */
|
||||||
static int memmap_block_seek(io_entity_t *entity, int mode, ssize_t offset)
|
static int memmap_block_seek(io_entity_t *entity, int mode,
|
||||||
|
signed long long offset)
|
||||||
{
|
{
|
||||||
int result = -ENOENT;
|
int result = -ENOENT;
|
||||||
file_state_t *fp;
|
file_state_t *fp;
|
||||||
|
@ -143,7 +144,8 @@ static int memmap_block_seek(io_entity_t *entity, int mode, ssize_t offset)
|
||||||
fp = (file_state_t *) entity->info;
|
fp = (file_state_t *) entity->info;
|
||||||
|
|
||||||
/* Assert that new file position is valid */
|
/* Assert that new file position is valid */
|
||||||
assert((offset >= 0) && (offset < fp->size));
|
assert((offset >= 0) &&
|
||||||
|
((unsigned long long)offset < fp->size));
|
||||||
|
|
||||||
/* Reset file position */
|
/* Reset file position */
|
||||||
fp->file_pos = offset;
|
fp->file_pos = offset;
|
||||||
|
@ -171,7 +173,7 @@ static int memmap_block_read(io_entity_t *entity, uintptr_t buffer,
|
||||||
size_t length, size_t *length_read)
|
size_t length, size_t *length_read)
|
||||||
{
|
{
|
||||||
file_state_t *fp;
|
file_state_t *fp;
|
||||||
size_t pos_after;
|
unsigned long long pos_after;
|
||||||
|
|
||||||
assert(entity != NULL);
|
assert(entity != NULL);
|
||||||
assert(length_read != NULL);
|
assert(length_read != NULL);
|
||||||
|
@ -198,7 +200,7 @@ static int memmap_block_write(io_entity_t *entity, const uintptr_t buffer,
|
||||||
size_t length, size_t *length_written)
|
size_t length, size_t *length_written)
|
||||||
{
|
{
|
||||||
file_state_t *fp;
|
file_state_t *fp;
|
||||||
size_t pos_after;
|
unsigned long long pos_after;
|
||||||
|
|
||||||
assert(entity != NULL);
|
assert(entity != NULL);
|
||||||
assert(length_written != NULL);
|
assert(length_written != NULL);
|
||||||
|
|
|
@ -19,17 +19,17 @@
|
||||||
typedef struct {
|
typedef struct {
|
||||||
io_block_dev_spec_t *dev_spec;
|
io_block_dev_spec_t *dev_spec;
|
||||||
uintptr_t base;
|
uintptr_t base;
|
||||||
size_t file_pos;
|
unsigned long long file_pos;
|
||||||
size_t size;
|
unsigned long long size;
|
||||||
} block_dev_state_t;
|
} block_dev_state_t;
|
||||||
|
|
||||||
#define is_power_of_2(x) ((x != 0) && ((x & (x - 1)) == 0))
|
#define is_power_of_2(x) (((x) != 0U) && (((x) & ((x) - 1U)) == 0U))
|
||||||
|
|
||||||
io_type_t device_type_block(void);
|
io_type_t device_type_block(void);
|
||||||
|
|
||||||
static int block_open(io_dev_info_t *dev_info, const uintptr_t spec,
|
static int block_open(io_dev_info_t *dev_info, const uintptr_t spec,
|
||||||
io_entity_t *entity);
|
io_entity_t *entity);
|
||||||
static int block_seek(io_entity_t *entity, int mode, ssize_t offset);
|
static int block_seek(io_entity_t *entity, int mode, signed long long offset);
|
||||||
static int block_read(io_entity_t *entity, uintptr_t buffer, size_t length,
|
static int block_read(io_entity_t *entity, uintptr_t buffer, size_t length,
|
||||||
size_t *length_read);
|
size_t *length_read);
|
||||||
static int block_write(io_entity_t *entity, const uintptr_t buffer,
|
static int block_write(io_entity_t *entity, const uintptr_t buffer,
|
||||||
|
@ -148,21 +148,21 @@ static int block_open(io_dev_info_t *dev_info, const uintptr_t spec,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* parameter offset is relative address at here */
|
/* parameter offset is relative address at here */
|
||||||
static int block_seek(io_entity_t *entity, int mode, ssize_t offset)
|
static int block_seek(io_entity_t *entity, int mode, signed long long offset)
|
||||||
{
|
{
|
||||||
block_dev_state_t *cur;
|
block_dev_state_t *cur;
|
||||||
|
|
||||||
assert(entity->info != (uintptr_t)NULL);
|
assert(entity->info != (uintptr_t)NULL);
|
||||||
|
|
||||||
cur = (block_dev_state_t *)entity->info;
|
cur = (block_dev_state_t *)entity->info;
|
||||||
assert((offset >= 0) && (offset < cur->size));
|
assert((offset >= 0) && ((unsigned long long)offset < cur->size));
|
||||||
|
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case IO_SEEK_SET:
|
case IO_SEEK_SET:
|
||||||
cur->file_pos = offset;
|
cur->file_pos = (unsigned long long)offset;
|
||||||
break;
|
break;
|
||||||
case IO_SEEK_CUR:
|
case IO_SEEK_CUR:
|
||||||
cur->file_pos += offset;
|
cur->file_pos += (unsigned long long)offset;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -270,7 +270,7 @@ static int block_read(io_entity_t *entity, uintptr_t buffer, size_t length,
|
||||||
buf = &(cur->dev_spec->buffer);
|
buf = &(cur->dev_spec->buffer);
|
||||||
block_size = cur->dev_spec->block_size;
|
block_size = cur->dev_spec->block_size;
|
||||||
assert((length <= cur->size) &&
|
assert((length <= cur->size) &&
|
||||||
(length > 0) &&
|
(length > 0U) &&
|
||||||
(ops->read != 0));
|
(ops->read != 0));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -279,7 +279,7 @@ static int block_read(io_entity_t *entity, uintptr_t buffer, size_t length,
|
||||||
* on the low level driver.
|
* on the low level driver.
|
||||||
*/
|
*/
|
||||||
count = 0;
|
count = 0;
|
||||||
for (left = length; left > 0; left -= nbytes) {
|
for (left = length; left > 0U; left -= nbytes) {
|
||||||
/*
|
/*
|
||||||
* We must only request operations aligned to the block
|
* We must only request operations aligned to the block
|
||||||
* size. Therefore if file_pos is not block-aligned,
|
* size. Therefore if file_pos is not block-aligned,
|
||||||
|
@ -288,7 +288,7 @@ static int block_read(io_entity_t *entity, uintptr_t buffer, size_t length,
|
||||||
* similarly, the number of bytes requested must be a
|
* similarly, the number of bytes requested must be a
|
||||||
* block size multiple
|
* block size multiple
|
||||||
*/
|
*/
|
||||||
skip = cur->file_pos & (block_size - 1);
|
skip = cur->file_pos & (block_size - 1U);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Calculate the block number containing file_pos
|
* Calculate the block number containing file_pos
|
||||||
|
@ -296,7 +296,7 @@ static int block_read(io_entity_t *entity, uintptr_t buffer, size_t length,
|
||||||
*/
|
*/
|
||||||
lba = (cur->file_pos + cur->base) / block_size;
|
lba = (cur->file_pos + cur->base) / block_size;
|
||||||
|
|
||||||
if (skip + left > buf->length) {
|
if ((skip + left) > buf->length) {
|
||||||
/*
|
/*
|
||||||
* The underlying read buffer is too small to
|
* The underlying read buffer is too small to
|
||||||
* read all the required data - limit to just
|
* read all the required data - limit to just
|
||||||
|
@ -311,7 +311,8 @@ static int block_read(io_entity_t *entity, uintptr_t buffer, size_t length,
|
||||||
* block size.
|
* block size.
|
||||||
*/
|
*/
|
||||||
request = skip + left;
|
request = skip + left;
|
||||||
request = (request + (block_size - 1)) & ~(block_size - 1);
|
request = (request + (block_size - 1U)) &
|
||||||
|
~(block_size - 1U);
|
||||||
}
|
}
|
||||||
request = ops->read(lba, buf->offset, request);
|
request = ops->read(lba, buf->offset, request);
|
||||||
|
|
||||||
|
@ -330,7 +331,7 @@ static int block_read(io_entity_t *entity, uintptr_t buffer, size_t length,
|
||||||
* the read data when copying to the user buffer.
|
* the read data when copying to the user buffer.
|
||||||
*/
|
*/
|
||||||
nbytes = request - skip;
|
nbytes = request - skip;
|
||||||
padding = (nbytes > left) ? nbytes - left : 0;
|
padding = (nbytes > left) ? nbytes - left : 0U;
|
||||||
nbytes -= padding;
|
nbytes -= padding;
|
||||||
|
|
||||||
memcpy((void *)(buffer + count),
|
memcpy((void *)(buffer + count),
|
||||||
|
@ -381,7 +382,7 @@ static int block_write(io_entity_t *entity, const uintptr_t buffer,
|
||||||
buf = &(cur->dev_spec->buffer);
|
buf = &(cur->dev_spec->buffer);
|
||||||
block_size = cur->dev_spec->block_size;
|
block_size = cur->dev_spec->block_size;
|
||||||
assert((length <= cur->size) &&
|
assert((length <= cur->size) &&
|
||||||
(length > 0) &&
|
(length > 0U) &&
|
||||||
(ops->read != 0) &&
|
(ops->read != 0) &&
|
||||||
(ops->write != 0));
|
(ops->write != 0));
|
||||||
|
|
||||||
|
@ -391,7 +392,7 @@ static int block_write(io_entity_t *entity, const uintptr_t buffer,
|
||||||
* on the low level driver.
|
* on the low level driver.
|
||||||
*/
|
*/
|
||||||
count = 0;
|
count = 0;
|
||||||
for (left = length; left > 0; left -= nbytes) {
|
for (left = length; left > 0U; left -= nbytes) {
|
||||||
/*
|
/*
|
||||||
* We must only request operations aligned to the block
|
* We must only request operations aligned to the block
|
||||||
* size. Therefore if file_pos is not block-aligned,
|
* size. Therefore if file_pos is not block-aligned,
|
||||||
|
@ -400,7 +401,7 @@ static int block_write(io_entity_t *entity, const uintptr_t buffer,
|
||||||
* similarly, the number of bytes requested must be a
|
* similarly, the number of bytes requested must be a
|
||||||
* block size multiple
|
* block size multiple
|
||||||
*/
|
*/
|
||||||
skip = cur->file_pos & (block_size - 1);
|
skip = cur->file_pos & (block_size - 1U);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Calculate the block number containing file_pos
|
* Calculate the block number containing file_pos
|
||||||
|
@ -408,7 +409,7 @@ static int block_write(io_entity_t *entity, const uintptr_t buffer,
|
||||||
*/
|
*/
|
||||||
lba = (cur->file_pos + cur->base) / block_size;
|
lba = (cur->file_pos + cur->base) / block_size;
|
||||||
|
|
||||||
if (skip + left > buf->length) {
|
if ((skip + left) > buf->length) {
|
||||||
/*
|
/*
|
||||||
* The underlying read buffer is too small to
|
* The underlying read buffer is too small to
|
||||||
* read all the required data - limit to just
|
* read all the required data - limit to just
|
||||||
|
@ -423,7 +424,8 @@ static int block_write(io_entity_t *entity, const uintptr_t buffer,
|
||||||
* block size.
|
* block size.
|
||||||
*/
|
*/
|
||||||
request = skip + left;
|
request = skip + left;
|
||||||
request = (request + (block_size - 1)) & ~(block_size - 1);
|
request = (request + (block_size - 1U)) &
|
||||||
|
~(block_size - 1U);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -432,7 +434,7 @@ static int block_write(io_entity_t *entity, const uintptr_t buffer,
|
||||||
* of the current request.
|
* of the current request.
|
||||||
*/
|
*/
|
||||||
nbytes = request - skip;
|
nbytes = request - skip;
|
||||||
padding = (nbytes > left) ? nbytes - left : 0;
|
padding = (nbytes > left) ? nbytes - left : 0U;
|
||||||
nbytes -= padding;
|
nbytes -= padding;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -440,14 +442,14 @@ static int block_write(io_entity_t *entity, const uintptr_t buffer,
|
||||||
* some content and it means that we have to read before
|
* some content and it means that we have to read before
|
||||||
* writing
|
* writing
|
||||||
*/
|
*/
|
||||||
if (skip > 0 || padding > 0) {
|
if ((skip > 0U) || (padding > 0U)) {
|
||||||
request = ops->read(lba, buf->offset, request);
|
request = ops->read(lba, buf->offset, request);
|
||||||
/*
|
/*
|
||||||
* The read may return size less than
|
* The read may return size less than
|
||||||
* requested. Round down to the nearest block
|
* requested. Round down to the nearest block
|
||||||
* boundary
|
* boundary
|
||||||
*/
|
*/
|
||||||
request &= ~(block_size-1);
|
request &= ~(block_size - 1U);
|
||||||
if (request <= skip) {
|
if (request <= skip) {
|
||||||
/*
|
/*
|
||||||
* We couldn't read enough bytes to jump over
|
* We couldn't read enough bytes to jump over
|
||||||
|
@ -458,7 +460,7 @@ static int block_write(io_entity_t *entity, const uintptr_t buffer,
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
nbytes = request - skip;
|
nbytes = request - skip;
|
||||||
padding = (nbytes > left) ? nbytes - left : 0;
|
padding = (nbytes > left) ? nbytes - left : 0U;
|
||||||
nbytes -= padding;
|
nbytes -= padding;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -477,7 +479,7 @@ static int block_write(io_entity_t *entity, const uintptr_t buffer,
|
||||||
* buffer
|
* buffer
|
||||||
*/
|
*/
|
||||||
nbytes = request - skip;
|
nbytes = request - skip;
|
||||||
padding = (nbytes > left) ? nbytes - left : 0;
|
padding = (nbytes > left) ? nbytes - left : 0U;
|
||||||
nbytes -= padding;
|
nbytes -= padding;
|
||||||
|
|
||||||
cur->file_pos += nbytes;
|
cur->file_pos += nbytes;
|
||||||
|
@ -505,7 +507,7 @@ static int block_dev_open(const uintptr_t dev_spec, io_dev_info_t **dev_info)
|
||||||
|
|
||||||
assert(dev_info != NULL);
|
assert(dev_info != NULL);
|
||||||
result = allocate_dev_info(&info);
|
result = allocate_dev_info(&info);
|
||||||
if (result)
|
if (result != 0)
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
|
|
||||||
cur = (block_dev_state_t *)info->info;
|
cur = (block_dev_state_t *)info->info;
|
||||||
|
@ -513,10 +515,10 @@ static int block_dev_open(const uintptr_t dev_spec, io_dev_info_t **dev_info)
|
||||||
cur->dev_spec = (io_block_dev_spec_t *)dev_spec;
|
cur->dev_spec = (io_block_dev_spec_t *)dev_spec;
|
||||||
buffer = &(cur->dev_spec->buffer);
|
buffer = &(cur->dev_spec->buffer);
|
||||||
block_size = cur->dev_spec->block_size;
|
block_size = cur->dev_spec->block_size;
|
||||||
assert((block_size > 0) &&
|
assert((block_size > 0U) &&
|
||||||
(is_power_of_2(block_size) != 0) &&
|
(is_power_of_2(block_size) != 0U) &&
|
||||||
((buffer->offset % block_size) == 0) &&
|
((buffer->offset % block_size) == 0U) &&
|
||||||
((buffer->length % block_size) == 0));
|
((buffer->length % block_size) == 0U));
|
||||||
|
|
||||||
*dev_info = info; /* cast away const */
|
*dev_info = info; /* cast away const */
|
||||||
(void)block_size;
|
(void)block_size;
|
||||||
|
|
|
@ -304,7 +304,8 @@ static int fip_file_open(io_dev_info_t *dev_info, const uintptr_t spec,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Seek past the FIP header into the Table of Contents */
|
/* Seek past the FIP header into the Table of Contents */
|
||||||
result = io_seek(backend_handle, IO_SEEK_SET, sizeof(fip_toc_header_t));
|
result = io_seek(backend_handle, IO_SEEK_SET,
|
||||||
|
(signed long long)sizeof(fip_toc_header_t));
|
||||||
if (result != 0) {
|
if (result != 0) {
|
||||||
WARN("fip_file_open: failed to seek\n");
|
WARN("fip_file_open: failed to seek\n");
|
||||||
result = -ENOENT;
|
result = -ENOENT;
|
||||||
|
@ -389,7 +390,8 @@ static int fip_file_read(io_entity_t *entity, uintptr_t buffer, size_t length,
|
||||||
|
|
||||||
/* Seek to the position in the FIP where the payload lives */
|
/* Seek to the position in the FIP where the payload lives */
|
||||||
file_offset = fp->entry.offset_address + fp->file_pos;
|
file_offset = fp->entry.offset_address + fp->file_pos;
|
||||||
result = io_seek(backend_handle, IO_SEEK_SET, file_offset);
|
result = io_seek(backend_handle, IO_SEEK_SET,
|
||||||
|
(signed long long)file_offset);
|
||||||
if (result != 0) {
|
if (result != 0) {
|
||||||
WARN("fip_file_read: failed to seek\n");
|
WARN("fip_file_read: failed to seek\n");
|
||||||
result = -ENOENT;
|
result = -ENOENT;
|
||||||
|
|
|
@ -23,10 +23,10 @@ typedef struct {
|
||||||
/* Use the 'in_use' flag as any value for base and file_pos could be
|
/* Use the 'in_use' flag as any value for base and file_pos could be
|
||||||
* valid.
|
* valid.
|
||||||
*/
|
*/
|
||||||
int in_use;
|
int in_use;
|
||||||
uintptr_t base;
|
uintptr_t base;
|
||||||
size_t file_pos;
|
unsigned long long file_pos;
|
||||||
size_t size;
|
unsigned long long size;
|
||||||
} file_state_t;
|
} file_state_t;
|
||||||
|
|
||||||
static file_state_t current_file = {0};
|
static file_state_t current_file = {0};
|
||||||
|
@ -42,7 +42,7 @@ static int memmap_dev_open(const uintptr_t dev_spec, io_dev_info_t **dev_info);
|
||||||
static int memmap_block_open(io_dev_info_t *dev_info, const uintptr_t spec,
|
static int memmap_block_open(io_dev_info_t *dev_info, const uintptr_t spec,
|
||||||
io_entity_t *entity);
|
io_entity_t *entity);
|
||||||
static int memmap_block_seek(io_entity_t *entity, int mode,
|
static int memmap_block_seek(io_entity_t *entity, int mode,
|
||||||
ssize_t offset);
|
signed long long offset);
|
||||||
static int memmap_block_len(io_entity_t *entity, size_t *length);
|
static int memmap_block_len(io_entity_t *entity, size_t *length);
|
||||||
static int memmap_block_read(io_entity_t *entity, uintptr_t buffer,
|
static int memmap_block_read(io_entity_t *entity, uintptr_t buffer,
|
||||||
size_t length, size_t *length_read);
|
size_t length, size_t *length_read);
|
||||||
|
@ -129,7 +129,8 @@ static int memmap_block_open(io_dev_info_t *dev_info, const uintptr_t spec,
|
||||||
|
|
||||||
|
|
||||||
/* Seek to a particular file offset on the memmap device */
|
/* Seek to a particular file offset on the memmap device */
|
||||||
static int memmap_block_seek(io_entity_t *entity, int mode, ssize_t offset)
|
static int memmap_block_seek(io_entity_t *entity, int mode,
|
||||||
|
signed long long offset)
|
||||||
{
|
{
|
||||||
int result = -ENOENT;
|
int result = -ENOENT;
|
||||||
file_state_t *fp;
|
file_state_t *fp;
|
||||||
|
@ -141,10 +142,11 @@ static int memmap_block_seek(io_entity_t *entity, int mode, ssize_t offset)
|
||||||
fp = (file_state_t *) entity->info;
|
fp = (file_state_t *) entity->info;
|
||||||
|
|
||||||
/* Assert that new file position is valid */
|
/* Assert that new file position is valid */
|
||||||
assert((offset >= 0) && (offset < fp->size));
|
assert((offset >= 0) &&
|
||||||
|
((unsigned long long)offset < fp->size));
|
||||||
|
|
||||||
/* Reset file position */
|
/* Reset file position */
|
||||||
fp->file_pos = offset;
|
fp->file_pos = (unsigned long long)offset;
|
||||||
result = 0;
|
result = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -158,7 +160,7 @@ static int memmap_block_len(io_entity_t *entity, size_t *length)
|
||||||
assert(entity != NULL);
|
assert(entity != NULL);
|
||||||
assert(length != NULL);
|
assert(length != NULL);
|
||||||
|
|
||||||
*length = ((file_state_t *)entity->info)->size;
|
*length = (size_t)((file_state_t *)entity->info)->size;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -169,7 +171,7 @@ static int memmap_block_read(io_entity_t *entity, uintptr_t buffer,
|
||||||
size_t length, size_t *length_read)
|
size_t length, size_t *length_read)
|
||||||
{
|
{
|
||||||
file_state_t *fp;
|
file_state_t *fp;
|
||||||
size_t pos_after;
|
unsigned long long pos_after;
|
||||||
|
|
||||||
assert(entity != NULL);
|
assert(entity != NULL);
|
||||||
assert(length_read != NULL);
|
assert(length_read != NULL);
|
||||||
|
@ -180,7 +182,8 @@ static int memmap_block_read(io_entity_t *entity, uintptr_t buffer,
|
||||||
pos_after = fp->file_pos + length;
|
pos_after = fp->file_pos + length;
|
||||||
assert((pos_after >= fp->file_pos) && (pos_after <= fp->size));
|
assert((pos_after >= fp->file_pos) && (pos_after <= fp->size));
|
||||||
|
|
||||||
memcpy((void *)buffer, (void *)(fp->base + fp->file_pos), length);
|
memcpy((void *)buffer,
|
||||||
|
(void *)((uintptr_t)(fp->base + fp->file_pos)), length);
|
||||||
|
|
||||||
*length_read = length;
|
*length_read = length;
|
||||||
|
|
||||||
|
@ -196,7 +199,7 @@ static int memmap_block_write(io_entity_t *entity, const uintptr_t buffer,
|
||||||
size_t length, size_t *length_written)
|
size_t length, size_t *length_written)
|
||||||
{
|
{
|
||||||
file_state_t *fp;
|
file_state_t *fp;
|
||||||
size_t pos_after;
|
unsigned long long pos_after;
|
||||||
|
|
||||||
assert(entity != NULL);
|
assert(entity != NULL);
|
||||||
assert(length_written != NULL);
|
assert(length_written != NULL);
|
||||||
|
@ -207,7 +210,8 @@ static int memmap_block_write(io_entity_t *entity, const uintptr_t buffer,
|
||||||
pos_after = fp->file_pos + length;
|
pos_after = fp->file_pos + length;
|
||||||
assert((pos_after >= fp->file_pos) && (pos_after <= fp->size));
|
assert((pos_after >= fp->file_pos) && (pos_after <= fp->size));
|
||||||
|
|
||||||
memcpy((void *)(fp->base + fp->file_pos), (void *)buffer, length);
|
memcpy((void *)((uintptr_t)(fp->base + fp->file_pos)),
|
||||||
|
(void *)buffer, length);
|
||||||
|
|
||||||
*length_written = length;
|
*length_written = length;
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ static io_type_t device_type_sh(void)
|
||||||
static int sh_dev_open(const uintptr_t dev_spec, io_dev_info_t **dev_info);
|
static int sh_dev_open(const uintptr_t dev_spec, io_dev_info_t **dev_info);
|
||||||
static int sh_file_open(io_dev_info_t *dev_info, const uintptr_t spec,
|
static int sh_file_open(io_dev_info_t *dev_info, const uintptr_t spec,
|
||||||
io_entity_t *entity);
|
io_entity_t *entity);
|
||||||
static int sh_file_seek(io_entity_t *entity, int mode, ssize_t offset);
|
static int sh_file_seek(io_entity_t *entity, int mode, signed long long offset);
|
||||||
static int sh_file_len(io_entity_t *entity, size_t *length);
|
static int sh_file_len(io_entity_t *entity, size_t *length);
|
||||||
static int sh_file_read(io_entity_t *entity, uintptr_t buffer, size_t length,
|
static int sh_file_read(io_entity_t *entity, uintptr_t buffer, size_t length,
|
||||||
size_t *length_read);
|
size_t *length_read);
|
||||||
|
@ -90,7 +90,7 @@ static int sh_file_open(io_dev_info_t *dev_info __unused,
|
||||||
|
|
||||||
|
|
||||||
/* Seek to a particular file offset on the semi-hosting device */
|
/* Seek to a particular file offset on the semi-hosting device */
|
||||||
static int sh_file_seek(io_entity_t *entity, int mode, ssize_t offset)
|
static int sh_file_seek(io_entity_t *entity, int mode, signed long long offset)
|
||||||
{
|
{
|
||||||
long file_handle, sh_result;
|
long file_handle, sh_result;
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@ static int sh_file_seek(io_entity_t *entity, int mode, ssize_t offset)
|
||||||
|
|
||||||
file_handle = (long)entity->info;
|
file_handle = (long)entity->info;
|
||||||
|
|
||||||
sh_result = semihosting_file_seek(file_handle, offset);
|
sh_result = semihosting_file_seek(file_handle, (ssize_t)offset);
|
||||||
|
|
||||||
return (sh_result == 0) ? 0 : -ENOENT;
|
return (sh_result == 0) ? 0 : -ENOENT;
|
||||||
}
|
}
|
||||||
|
|
|
@ -237,7 +237,7 @@ int io_open(uintptr_t dev_handle, const uintptr_t spec, uintptr_t *handle)
|
||||||
|
|
||||||
|
|
||||||
/* Seek to a specific position in an IO entity */
|
/* Seek to a specific position in an IO entity */
|
||||||
int io_seek(uintptr_t handle, io_seek_mode_t mode, ssize_t offset)
|
int io_seek(uintptr_t handle, io_seek_mode_t mode, signed long long offset)
|
||||||
{
|
{
|
||||||
int result = -ENODEV;
|
int result = -ENODEV;
|
||||||
assert(is_valid_entity(handle) && is_valid_seek_mode(mode));
|
assert(is_valid_entity(handle) && is_valid_seek_mode(mode));
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2015-2017, Renesas Electronics Corporation. All rights reserved.
|
* Copyright (c) 2015-2019, Renesas Electronics Corporation. All rights reserved.
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
*/
|
*/
|
||||||
|
@ -25,7 +25,7 @@ static int32_t emmcdrv_dev_close(io_dev_info_t *dev_info);
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint32_t in_use;
|
uint32_t in_use;
|
||||||
uintptr_t base;
|
uintptr_t base;
|
||||||
ssize_t file_pos;
|
signed long long file_pos;
|
||||||
EMMC_PARTITION_ID partition;
|
EMMC_PARTITION_ID partition;
|
||||||
} file_state_t;
|
} file_state_t;
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ static io_type_t device_type_emmcdrv(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t emmcdrv_block_seek(io_entity_t *entity, int32_t mode,
|
static int32_t emmcdrv_block_seek(io_entity_t *entity, int32_t mode,
|
||||||
ssize_t offset)
|
signed long long offset)
|
||||||
{
|
{
|
||||||
if (mode != IO_SEEK_SET)
|
if (mode != IO_SEEK_SET)
|
||||||
return IO_FAIL;
|
return IO_FAIL;
|
||||||
|
@ -59,12 +59,12 @@ static int32_t emmcdrv_block_read(io_entity_t *entity, uintptr_t buffer,
|
||||||
sector_add = current_file.file_pos >> EMMC_SECTOR_SIZE_SHIFT;
|
sector_add = current_file.file_pos >> EMMC_SECTOR_SIZE_SHIFT;
|
||||||
sector_num = (length + EMMC_SECTOR_SIZE - 1U) >> EMMC_SECTOR_SIZE_SHIFT;
|
sector_num = (length + EMMC_SECTOR_SIZE - 1U) >> EMMC_SECTOR_SIZE_SHIFT;
|
||||||
|
|
||||||
NOTICE("BL2: Load dst=0x%lx src=(p:%d)0x%lx(%d) len=0x%lx(%d)\n",
|
NOTICE("BL2: Load dst=0x%lx src=(p:%d)0x%llx(%d) len=0x%lx(%d)\n",
|
||||||
buffer,
|
buffer,
|
||||||
current_file.partition, current_file.file_pos,
|
current_file.partition, current_file.file_pos,
|
||||||
sector_add, length, sector_num);
|
sector_add, length, sector_num);
|
||||||
|
|
||||||
if (buffer + length - 1 <= UINT32_MAX)
|
if ((buffer + length - 1U) <= (uintptr_t)UINT32_MAX)
|
||||||
emmc_dma = LOADIMAGE_FLAGS_DMA_ENABLE;
|
emmc_dma = LOADIMAGE_FLAGS_DMA_ENABLE;
|
||||||
|
|
||||||
if (emmc_read_sector((uint32_t *) buffer, sector_add, sector_num,
|
if (emmc_read_sector((uint32_t *) buffer, sector_add, sector_num,
|
||||||
|
@ -72,7 +72,7 @@ static int32_t emmcdrv_block_read(io_entity_t *entity, uintptr_t buffer,
|
||||||
result = IO_FAIL;
|
result = IO_FAIL;
|
||||||
|
|
||||||
*length_read = length;
|
*length_read = length;
|
||||||
fp->file_pos += length;
|
fp->file_pos += (signed long long)length;
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -82,7 +82,7 @@ static int32_t emmcdrv_block_open(io_dev_info_t *dev_info,
|
||||||
{
|
{
|
||||||
const io_drv_spec_t *block_spec = (io_drv_spec_t *) spec;
|
const io_drv_spec_t *block_spec = (io_drv_spec_t *) spec;
|
||||||
|
|
||||||
if (current_file.in_use) {
|
if (current_file.in_use != 0U) {
|
||||||
WARN("mmc_block: Only one open spec at a time\n");
|
WARN("mmc_block: Only one open spec at a time\n");
|
||||||
return IO_RESOURCES_EXHAUSTED;
|
return IO_RESOURCES_EXHAUSTED;
|
||||||
}
|
}
|
||||||
|
@ -103,9 +103,9 @@ static int32_t emmcdrv_block_open(io_dev_info_t *dev_info,
|
||||||
return IO_FAIL;
|
return IO_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PARTITION_ID_USER == block_spec->partition ||
|
if ((PARTITION_ID_USER == block_spec->partition) ||
|
||||||
PARTITION_ID_BOOT_1 == block_spec->partition ||
|
(PARTITION_ID_BOOT_1 == block_spec->partition) ||
|
||||||
PARTITION_ID_BOOT_2 == block_spec->partition)
|
(PARTITION_ID_BOOT_2 == block_spec->partition))
|
||||||
current_file.partition = block_spec->partition;
|
current_file.partition = block_spec->partition;
|
||||||
else
|
else
|
||||||
current_file.partition = emmcdrv_bootpartition;
|
current_file.partition = emmcdrv_bootpartition;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2015-2018, Renesas Electronics Corporation. All rights reserved.
|
* Copyright (c) 2015-2019, Renesas Electronics Corporation. All rights reserved.
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
*/
|
*/
|
||||||
|
@ -28,7 +28,7 @@ static int32_t memdrv_dev_close(io_dev_info_t *dev_info);
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint32_t in_use;
|
uint32_t in_use;
|
||||||
uintptr_t base;
|
uintptr_t base;
|
||||||
ssize_t file_pos;
|
signed long long file_pos;
|
||||||
} file_state_t;
|
} file_state_t;
|
||||||
|
|
||||||
static file_state_t current_file = { 0 };
|
static file_state_t current_file = { 0 };
|
||||||
|
@ -47,7 +47,7 @@ static int32_t memdrv_block_open(io_dev_info_t *dev_info, const uintptr_t spec,
|
||||||
* spec at a time. When we have dynamic memory we can malloc and set
|
* spec at a time. When we have dynamic memory we can malloc and set
|
||||||
* entity->info.
|
* entity->info.
|
||||||
*/
|
*/
|
||||||
if (current_file.in_use)
|
if (current_file.in_use != 0U)
|
||||||
return IO_RESOURCES_EXHAUSTED;
|
return IO_RESOURCES_EXHAUSTED;
|
||||||
|
|
||||||
/* File cursor offset for seek and incremental reads etc. */
|
/* File cursor offset for seek and incremental reads etc. */
|
||||||
|
@ -61,7 +61,7 @@ static int32_t memdrv_block_open(io_dev_info_t *dev_info, const uintptr_t spec,
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t memdrv_block_seek(io_entity_t *entity, int32_t mode,
|
static int32_t memdrv_block_seek(io_entity_t *entity, int32_t mode,
|
||||||
ssize_t offset)
|
signed long long offset)
|
||||||
{
|
{
|
||||||
if (mode != IO_SEEK_SET)
|
if (mode != IO_SEEK_SET)
|
||||||
return IO_FAIL;
|
return IO_FAIL;
|
||||||
|
@ -78,16 +78,17 @@ static int32_t memdrv_block_read(io_entity_t *entity, uintptr_t buffer,
|
||||||
|
|
||||||
fp = (file_state_t *) entity->info;
|
fp = (file_state_t *) entity->info;
|
||||||
|
|
||||||
NOTICE("BL2: dst=0x%lx src=0x%lx len=%ld(0x%lx)\n",
|
NOTICE("BL2: dst=0x%lx src=0x%llx len=%ld(0x%lx)\n",
|
||||||
buffer, fp->base + fp->file_pos, length, length);
|
buffer, (unsigned long long)fp->base +
|
||||||
|
(unsigned long long)fp->file_pos, length, length);
|
||||||
|
|
||||||
if (FLASH_MEMORY_SIZE < fp->file_pos + length) {
|
if (FLASH_MEMORY_SIZE < (fp->file_pos + (signed long long)length)) {
|
||||||
ERROR("BL2: check load image (source address)\n");
|
ERROR("BL2: check load image (source address)\n");
|
||||||
return IO_FAIL;
|
return IO_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
rcar_dma_exec(buffer, fp->base + fp->file_pos, length);
|
rcar_dma_exec(buffer, fp->base + (uintptr_t)fp->file_pos, length);
|
||||||
fp->file_pos += length;
|
fp->file_pos += (signed long long)length;
|
||||||
*cnt = length;
|
*cnt = length;
|
||||||
|
|
||||||
return IO_SUCCESS;
|
return IO_SUCCESS;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
|
* Copyright (c) 2018-2019, ARM Limited and Contributors. All rights reserved.
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
*/
|
*/
|
||||||
|
@ -20,14 +20,15 @@ static int mmc_dev_open(const uintptr_t init_params, io_dev_info_t **dev_info);
|
||||||
static int mmc_block_open(io_dev_info_t *dev_info, const uintptr_t spec,
|
static int mmc_block_open(io_dev_info_t *dev_info, const uintptr_t spec,
|
||||||
io_entity_t *entity);
|
io_entity_t *entity);
|
||||||
static int mmc_dev_init(io_dev_info_t *dev_info, const uintptr_t init_params);
|
static int mmc_dev_init(io_dev_info_t *dev_info, const uintptr_t init_params);
|
||||||
static int mmc_block_seek(io_entity_t *entity, int mode, ssize_t offset);
|
static int mmc_block_seek(io_entity_t *entity, int mode,
|
||||||
|
signed long long offset);
|
||||||
static int mmc_block_read(io_entity_t *entity, uintptr_t buffer, size_t length,
|
static int mmc_block_read(io_entity_t *entity, uintptr_t buffer, size_t length,
|
||||||
size_t *length_read);
|
size_t *length_read);
|
||||||
static int mmc_block_close(io_entity_t *entity);
|
static int mmc_block_close(io_entity_t *entity);
|
||||||
static int mmc_dev_close(io_dev_info_t *dev_info);
|
static int mmc_dev_close(io_dev_info_t *dev_info);
|
||||||
static io_type_t device_type_mmc(void);
|
static io_type_t device_type_mmc(void);
|
||||||
|
|
||||||
static ssize_t seek_offset;
|
static signed long long seek_offset;
|
||||||
|
|
||||||
static const io_dev_connector_t mmc_dev_connector = {
|
static const io_dev_connector_t mmc_dev_connector = {
|
||||||
.dev_open = mmc_dev_open
|
.dev_open = mmc_dev_open
|
||||||
|
@ -85,7 +86,8 @@ static int mmc_block_open(io_dev_info_t *dev_info, const uintptr_t spec,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Seek to a particular file offset on the mmc device */
|
/* Seek to a particular file offset on the mmc device */
|
||||||
static int mmc_block_seek(io_entity_t *entity, int mode, ssize_t offset)
|
static int mmc_block_seek(io_entity_t *entity, int mode,
|
||||||
|
signed long long offset)
|
||||||
{
|
{
|
||||||
seek_offset = offset;
|
seek_offset = offset;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -39,7 +39,7 @@ typedef struct io_dev_funcs {
|
||||||
io_type_t (*type)(void);
|
io_type_t (*type)(void);
|
||||||
int (*open)(io_dev_info_t *dev_info, const uintptr_t spec,
|
int (*open)(io_dev_info_t *dev_info, const uintptr_t spec,
|
||||||
io_entity_t *entity);
|
io_entity_t *entity);
|
||||||
int (*seek)(io_entity_t *entity, int mode, ssize_t offset);
|
int (*seek)(io_entity_t *entity, int mode, signed long long offset);
|
||||||
int (*size)(io_entity_t *entity, size_t *length);
|
int (*size)(io_entity_t *entity, size_t *length);
|
||||||
int (*read)(io_entity_t *entity, uintptr_t buffer, size_t length,
|
int (*read)(io_entity_t *entity, uintptr_t buffer, size_t length,
|
||||||
size_t *length_read);
|
size_t *length_read);
|
||||||
|
|
|
@ -86,7 +86,7 @@ int io_dev_close(uintptr_t dev_handle);
|
||||||
/* Synchronous operations */
|
/* Synchronous operations */
|
||||||
int io_open(uintptr_t dev_handle, const uintptr_t spec, uintptr_t *handle);
|
int io_open(uintptr_t dev_handle, const uintptr_t spec, uintptr_t *handle);
|
||||||
|
|
||||||
int io_seek(uintptr_t handle, io_seek_mode_t mode, ssize_t offset);
|
int io_seek(uintptr_t handle, io_seek_mode_t mode, signed long long offset);
|
||||||
|
|
||||||
int io_size(uintptr_t handle, size_t *length);
|
int io_size(uintptr_t handle, size_t *length);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
//===-- aeabi_ldivmod.S - EABI ldivmod implementation ---------------------===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is dual licensed under the MIT and the University of Illinois Open
|
||||||
|
// Source Licenses. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#include "../assembly.h"
|
||||||
|
|
||||||
|
// struct { int64_t quot, int64_t rem}
|
||||||
|
// __aeabi_ldivmod(int64_t numerator, int64_t denominator) {
|
||||||
|
// int64_t rem, quot;
|
||||||
|
// quot = __divmoddi4(numerator, denominator, &rem);
|
||||||
|
// return {quot, rem};
|
||||||
|
// }
|
||||||
|
|
||||||
|
#if defined(__MINGW32__)
|
||||||
|
#define __aeabi_ldivmod __rt_sdiv64
|
||||||
|
#endif
|
||||||
|
|
||||||
|
.syntax unified
|
||||||
|
.p2align 2
|
||||||
|
DEFINE_COMPILERRT_FUNCTION(__aeabi_ldivmod)
|
||||||
|
push {r6, lr}
|
||||||
|
sub sp, sp, #16
|
||||||
|
add r6, sp, #8
|
||||||
|
str r6, [sp]
|
||||||
|
#if defined(__MINGW32__)
|
||||||
|
movs r6, r0
|
||||||
|
movs r0, r2
|
||||||
|
movs r2, r6
|
||||||
|
movs r6, r1
|
||||||
|
movs r1, r3
|
||||||
|
movs r3, r6
|
||||||
|
#endif
|
||||||
|
bl SYMBOL_NAME(__divmoddi4)
|
||||||
|
ldr r2, [sp, #8]
|
||||||
|
ldr r3, [sp, #12]
|
||||||
|
add sp, sp, #16
|
||||||
|
pop {r6, pc}
|
||||||
|
END_COMPILERRT_FUNCTION(__aeabi_ldivmod)
|
||||||
|
|
||||||
|
NO_EXEC_STACK_DIRECTIVE
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
/* ===-- divdi3.c - Implement __divdi3 -------------------------------------===
|
||||||
|
*
|
||||||
|
* The LLVM Compiler Infrastructure
|
||||||
|
*
|
||||||
|
* This file is dual licensed under the MIT and the University of Illinois Open
|
||||||
|
* Source Licenses. See LICENSE.TXT for details.
|
||||||
|
*
|
||||||
|
* ===----------------------------------------------------------------------===
|
||||||
|
*
|
||||||
|
* This file implements __divdi3 for the compiler_rt library.
|
||||||
|
*
|
||||||
|
* ===----------------------------------------------------------------------===
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "int_lib.h"
|
||||||
|
|
||||||
|
/* Returns: a / b */
|
||||||
|
|
||||||
|
COMPILER_RT_ABI di_int
|
||||||
|
__divdi3(di_int a, di_int b)
|
||||||
|
{
|
||||||
|
const int bits_in_dword_m1 = (int)(sizeof(di_int) * CHAR_BIT) - 1;
|
||||||
|
di_int s_a = a >> bits_in_dword_m1; /* s_a = a < 0 ? -1 : 0 */
|
||||||
|
di_int s_b = b >> bits_in_dword_m1; /* s_b = b < 0 ? -1 : 0 */
|
||||||
|
a = (a ^ s_a) - s_a; /* negate if s_a == -1 */
|
||||||
|
b = (b ^ s_b) - s_b; /* negate if s_b == -1 */
|
||||||
|
s_a ^= s_b; /*sign of quotient */
|
||||||
|
return (__udivmoddi4(a, b, (du_int*)0) ^ s_a) - s_a; /* negate if s_a == -1 */
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
/*===-- divmoddi4.c - Implement __divmoddi4 --------------------------------===
|
||||||
|
*
|
||||||
|
* The LLVM Compiler Infrastructure
|
||||||
|
*
|
||||||
|
* This file is dual licensed under the MIT and the University of Illinois Open
|
||||||
|
* Source Licenses. See LICENSE.TXT for details.
|
||||||
|
*
|
||||||
|
* ===----------------------------------------------------------------------===
|
||||||
|
*
|
||||||
|
* This file implements __divmoddi4 for the compiler_rt library.
|
||||||
|
*
|
||||||
|
* ===----------------------------------------------------------------------===
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "int_lib.h"
|
||||||
|
|
||||||
|
/* Returns: a / b, *rem = a % b */
|
||||||
|
|
||||||
|
COMPILER_RT_ABI di_int
|
||||||
|
__divmoddi4(di_int a, di_int b, di_int* rem)
|
||||||
|
{
|
||||||
|
di_int d = __divdi3(a,b);
|
||||||
|
*rem = a - (d*b);
|
||||||
|
return d;
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
#
|
#
|
||||||
# Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
|
# Copyright (c) 2017-2019, ARM Limited and Contributors. All rights reserved.
|
||||||
#
|
#
|
||||||
# Redistribution and use in source and binary forms, with or without
|
# Redistribution and use in source and binary forms, with or without
|
||||||
# modification, are permitted provided that the following conditions are met:
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
@ -29,8 +29,11 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
ifeq (${ARCH},aarch32)
|
ifeq (${ARCH},aarch32)
|
||||||
COMPILER_RT_SRCS := lib/compiler-rt/builtins/arm/aeabi_uldivmod.S \
|
COMPILER_RT_SRCS := lib/compiler-rt/builtins/arm/aeabi_ldivmod.S \
|
||||||
lib/compiler-rt/builtins/udivmoddi4.c \
|
lib/compiler-rt/builtins/arm/aeabi_uldivmod.S \
|
||||||
lib/compiler-rt/builtins/ctzdi2.c \
|
lib/compiler-rt/builtins/ctzdi2.c \
|
||||||
lib/compiler-rt/builtins/lshrdi3.c
|
lib/compiler-rt/builtins/divdi3.c \
|
||||||
|
lib/compiler-rt/builtins/divmoddi4.c \
|
||||||
|
lib/compiler-rt/builtins/lshrdi3.c \
|
||||||
|
lib/compiler-rt/builtins/udivmoddi4.c
|
||||||
endif
|
endif
|
||||||
|
|
Loading…
Reference in New Issue