@@ -116,6 +116,7 @@ void lwp_cleanup(struct rt_thread *tid);
116
116
117
117
#ifdef ARCH_MM_MMU
118
118
#define ALLOC_KERNEL_STACK_SIZE 5120
119
+ #define KMEM_MAX_SIZE (64 * 1024)
119
120
120
121
static void * kmem_get (size_t size )
121
122
{
@@ -386,40 +387,55 @@ ssize_t sys_read(int fd, void *buf, size_t nbyte)
386
387
#ifdef ARCH_MM_MMU
387
388
void * kmem = RT_NULL ;
388
389
ssize_t ret = -1 ;
390
+ ssize_t size = 0 , rd_byte ;
389
391
390
392
if (!nbyte )
391
393
{
392
394
return - EINVAL ;
393
395
}
394
396
395
- if (!lwp_user_accessable (( void * ) buf , nbyte ))
397
+ if (!lwp_user_accessable (buf , nbyte ))
396
398
{
397
399
return - EFAULT ;
398
400
}
399
401
400
- kmem = kmem_get (nbyte );
402
+ kmem = kmem_get (nbyte > KMEM_MAX_SIZE ? KMEM_MAX_SIZE : nbyte );
401
403
if (!kmem )
402
404
{
403
405
return - ENOMEM ;
404
406
}
405
407
406
- ret = read (fd , kmem , nbyte );
407
- if (ret > 0 )
408
- {
409
- if (ret != lwp_put_to_user (buf , kmem , ret ))
410
- return - EFAULT ;
411
- }
412
-
413
- if (ret < 0 )
408
+ while (nbyte )
414
409
{
415
- ret = GET_ERRNO ();
410
+ rd_byte = nbyte > KMEM_MAX_SIZE ? KMEM_MAX_SIZE : nbyte ;
411
+ ret = read (fd , kmem , rd_byte );
412
+ if (ret > 0 )
413
+ {
414
+ if (ret != lwp_put_to_user (buf , kmem , ret ))
415
+ {
416
+ ret = - EFAULT ;
417
+ break ;
418
+ }
419
+ buf += ret ;
420
+ size += ret ;
421
+ nbyte -= ret ;
422
+ if (ret == rd_byte )
423
+ {
424
+ continue ;
425
+ }
426
+ }
427
+ else if (ret < 0 )
428
+ {
429
+ ret = GET_ERRNO ();
430
+ }
431
+ break ;
416
432
}
417
433
418
434
kmem_put (kmem );
419
435
420
- return ret ;
436
+ return ret < 0 ? ret : size ;
421
437
#else
422
- if (!lwp_user_accessable (( void * ) buf , nbyte ))
438
+ if (!lwp_user_accessable (buf , nbyte ))
423
439
{
424
440
return - EFAULT ;
425
441
}
@@ -434,32 +450,53 @@ ssize_t sys_write(int fd, const void *buf, size_t nbyte)
434
450
#ifdef ARCH_MM_MMU
435
451
void * kmem = RT_NULL ;
436
452
ssize_t ret = -1 ;
453
+ ssize_t size = 0 , wr_byte ;
437
454
438
- if (nbyte )
455
+ if (! nbyte )
439
456
{
440
- if (!lwp_user_accessable ((void * )buf , nbyte ))
441
- {
442
- return - EFAULT ;
443
- }
457
+ return - EINVAL ;
458
+ }
444
459
445
- kmem = kmem_get (nbyte );
446
- if (!kmem )
447
- {
448
- return - ENOMEM ;
449
- }
460
+ if (!lwp_user_accessable ((void * )buf , nbyte ))
461
+ {
462
+ return - EFAULT ;
463
+ }
450
464
451
- lwp_get_from_user (kmem , (void * )buf , nbyte );
465
+ kmem = kmem_get (nbyte > KMEM_MAX_SIZE ? KMEM_MAX_SIZE : nbyte );
466
+ if (!kmem )
467
+ {
468
+ return - ENOMEM ;
452
469
}
453
470
454
- ret = write (fd , kmem , nbyte );
455
- if (ret < 0 )
471
+ while (nbyte )
456
472
{
457
- ret = GET_ERRNO ();
473
+ wr_byte = nbyte > KMEM_MAX_SIZE ? KMEM_MAX_SIZE : nbyte ;
474
+ if (wr_byte != lwp_get_from_user (kmem , (void * )buf , wr_byte ))
475
+ {
476
+ ret = - EFAULT ;
477
+ break ;
478
+ }
479
+ ret = write (fd , kmem , wr_byte );
480
+ if (ret > 0 )
481
+ {
482
+ buf += ret ;
483
+ size += ret ;
484
+ nbyte -= ret ;
485
+ if (ret == wr_byte )
486
+ {
487
+ continue ;
488
+ }
489
+ }
490
+ else if (ret < 0 )
491
+ {
492
+ ret = GET_ERRNO ();
493
+ }
494
+ break ;
458
495
}
459
496
460
497
kmem_put (kmem );
461
498
462
- return ret ;
499
+ return ret < 0 ? ret : size ;
463
500
#else
464
501
if (!lwp_user_accessable ((void * )buf , nbyte ))
465
502
{
0 commit comments