From: Juan Perez-Sanchez <lithoxs@gmail.com>
To: linux-8086 <linux-8086@vger.kernel.org>
Subject: [PATCH] Standardization of memcpy_form/tofs functions
Date: Thu, 15 Nov 2012 17:55:24 -0600 [thread overview]
Message-ID: <CAD6VGuYAucqZJ+BPmjNBkCT2LY4TrXSs2H31oZay_KBb97M11A@mail.gmail.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 1138 bytes --]
Hi,
Patch 3 of 5
Juan
PREVIOUS OPERATION
1. Several functions used memcpy_from/tofs to move 1, 2 or 4 bytes,
instead of the more efficient get_user_*/put_user_*, so wasting
memory.
2. Other functions did the opposite: transfer more than 4 bytes of memory
using for loops with get_user_*/put_user_* instead of memcpy_from/tofs,
again wasting memory.
3. Library function memmove() implemented and used a memory block move
function (blt_back()), almost exactly the same as fmemcpy(), again
wasting memory.
NEW OPERATION
1. All transfers to/from user space less than 4 bytes were modified to use
only get_user_*/put_user_* functions.
2. All transfers to/from user space more than 4 bytes were modified to use
only memcpy_from/tofs functions.
3. Removed blt_back() function and replaced it with fmemcpy().
4. In file "arch/i86/drivers/block/doshd.c", function "bioshd_geninit()"
was rewritten to make it faster and smaller.
OTHER CHANGES
Code size reduced by 80 bytes.
The Image builded without errors. The kernel was tested with QEMU and
dioscuri emulators. Also in a PPro pc booting from floppy.
[-- Attachment #2: elksQ.patch --]
[-- Type: application/octet-stream, Size: 6581 bytes --]
diff -Nurb elks.orig/arch/i86/drivers/block/doshd.c elks/arch/i86/drivers/block/doshd.c
--- elks.orig/arch/i86/drivers/block/doshd.c 2012-10-17 13:34:52.000000000 -0500
+++ elks/arch/i86/drivers/block/doshd.c 2012-10-18 00:08:16.000000000 -0500
@@ -179,7 +179,7 @@
#ifdef CONFIG_BLK_DEV_BFD
-unsigned short int bioshd_getfdinfo(void)
+static unsigned short int bioshd_getfdinfo(void)
{
#ifdef CONFIG_BLK_DEV_BFD_HARD
@@ -833,12 +833,11 @@
static void bioshd_geninit(void)
{
register struct drive_infot *drivep;
- register struct hd_struct *hdp;
+ register struct hd_struct *hdp = hd;
int i;
for (i = 0; i < 4 << 6; i++) {
drivep = &drive_info[i >> 6];
- hdp = &hd[i];
if ((i & ((1 << 6) - 1)) == 0) {
hdp->nr_sects = (sector_t) drivep->sectors *
drivep->heads * drivep->cylinders;
@@ -847,6 +846,7 @@
hdp->nr_sects = 0;
hdp->start_sect = -1;
}
+ hdp++;
}
#if 0
diff -Nurb elks.orig/arch/i86/drivers/block/floppy.c elks/arch/i86/drivers/block/floppy.c
--- elks.orig/arch/i86/drivers/block/floppy.c 2012-10-17 12:12:32.000000000 -0500
+++ elks/arch/i86/drivers/block/floppy.c 2012-10-17 23:36:57.000000000 -0500
@@ -1172,14 +1172,8 @@
this_floppy = &floppy_type[drive >> 2];
else if ((this_floppy = current_type[drive & 3]) == NULL)
return -ENODEV;
- i =
- verify_area(VERIFY_WRITE, (void *) param,
- sizeof(struct floppy_struct));
- if (i)
- return i;
- for (cnt = 0; cnt < sizeof(struct floppy_struct); cnt++)
- put_user_char(((char *) this_floppy)[cnt], (char *) param + cnt);
- return 0;
+ return verified_memcpy_tofs((char *)param,
+ (char *)this_floppy, sizeof(struct floppy_struct));
case FDFMTTRK:
if (!suser())
return -EPERM;
@@ -1188,8 +1182,8 @@
clr_irq();
while (format_status != FORMAT_NONE)
sleep_on(&format_done);
- for (cnt = 0; cnt < sizeof(struct format_descr); cnt++)
- ((char *) &format_req)[cnt] = get_user_char((char *) param + cnt);
+ memcpy_fromfs((char *)(&format_req),
+ (char *)param, sizeof(struct format_descr));
format_req.device = drive;
format_status = FORMAT_WAIT;
format_errors = 0;
diff -Nurb elks.orig/arch/i86/drivers/char/mem.c elks/arch/i86/drivers/char/mem.c
--- elks.orig/arch/i86/drivers/char/mem.c 2012-08-18 13:28:59.000000000 -0500
+++ elks/arch/i86/drivers/char/mem.c 2012-10-17 23:36:57.000000000 -0500
@@ -172,18 +172,18 @@
case MEM_GETMODTEXT:
i = (char *) module_init;
- memcpy_tofs(arg, &i, 2);
+ put_user((unsigned short int)i, (void *)arg);
return 0;
case MEM_GETMODDATA:
i = (char *) module_data;
- memcpy_tofs(arg, &i, 2);
+ put_user((unsigned short int)i, (void *)arg);
return 0;
#endif
case MEM_GETTASK:
i = (char *) task;
- memcpy_tofs(arg, &i, 2);
+ put_user((unsigned short int)i, (void *)arg);
#if 0
@@ -197,11 +197,11 @@
return 0;
case MEM_GETCS:
i = (char *) get_cs();
- memcpy_tofs(arg, &i, 2);
+ put_user((unsigned short int)i, (void *)arg);
return 0;
case MEM_GETDS:
i = (char *) get_ds();
- memcpy_tofs(arg, &i, 2);
+ put_user((unsigned short int)i, (void *)arg);
return 0;
case MEM_GETUSAGE:
mu.free_memory = mm_get_usage(MM_MEM, 0);
diff -Nurb elks.orig/arch/i86/kernel/bios16.c elks/arch/i86/kernel/bios16.c
--- elks.orig/arch/i86/kernel/bios16.c 2012-08-18 13:28:59.000000000 -0500
+++ elks/arch/i86/kernel/bios16.c 2012-10-18 00:18:09.000000000 -0500
@@ -56,7 +56,7 @@
! DS already saved in stashed_ds
- mov bx, _bios_data_table
+ mov bx, #_bdt
! Load the register block from the table
@@ -104,7 +104,7 @@
! ***** We can now use the bios data table again *****
- mov bx, _bios_data_table
+ mov bx, #_bdt
pop 18[bx] ! Save the old DS
mov 2[bx],ax ! Save the old AX
diff -Nurb elks.orig/arch/i86/lib/memmove.c elks/arch/i86/lib/memmove.c
--- elks.orig/arch/i86/lib/memmove.c 2012-08-18 13:28:59.000000000 -0500
+++ elks/arch/i86/lib/memmove.c 2012-10-18 01:21:01.000000000 -0500
@@ -7,7 +7,6 @@
#include <linuxmt/mm.h>
-static void blt_back(unsigned,unsigned,unsigned,unsigned,unsigned);
static void blt_forth(unsigned,unsigned,unsigned,unsigned,unsigned);
void far_memmove(unsigned sseg, unsigned soff, unsigned dseg, unsigned doff,
@@ -23,47 +22,14 @@
--bytes;
blt_forth(sseg, soff+bytes, dseg, doff+bytes, bytes+1);
} else {
- blt_back(sseg, soff, dseg, doff, bytes );
+ fmemcpy(dseg, doff, sseg, soff, bytes );
}
}
}
#ifndef S_SPLINT_S
#asm
- ! blt_back( sseg, soff, dseg, doff, bytes )
- ! for to < from
.text
- .even
-
-_blt_back:
- push bp
- mov bp, sp
- push ax
- push es
- push ds
- push cx
- push si
- push di
- pushf
- mov ax, [bp+4]
- mov ds, ax
- mov si, [bp+6]
- mov ax, [bp+8]
- mov es, ax
- mov di, [bp+10]
- mov cx, [bp+12]
- cld
- rep
- movsb
- popf
- pop di
- pop si
- pop cx
- pop ds
- pop es
- pop ax
- pop bp
- ret
! blt_forth( sseg, soff, dseg, doff, bytes )
! for to > from
.even
diff -Nurb elks.orig/fs/minix/file.c elks/fs/minix/file.c
--- elks.orig/fs/minix/file.c 2012-08-18 13:28:59.000000000 -0500
+++ elks/fs/minix/file.c 2012-10-17 23:36:57.000000000 -0500
@@ -154,9 +154,8 @@
unmap_brelse(bh);
buf += chars;
} else {
- char zero = 0;
while (chars-- > 0)
- memcpy_tofs(buf++, &zero, 1);
+ put_user_char((unsigned char)0, (void *)(buf++));
}
offset = 0;
}
diff -Nurb elks.orig/fs/minix/symlink.c elks/fs/minix/symlink.c
--- elks.orig/fs/minix/symlink.c 2012-10-17 12:12:32.000000000 -0500
+++ elks/fs/minix/symlink.c 2012-10-17 23:36:57.000000000 -0500
@@ -89,8 +89,7 @@
register char *pi = 0;
while (((int)pi) < buflen && (c = bh->b_data[(int)pi])) {
pi++;
- memcpy_tofs(buffer++, &c, 1);
- /* put_user_char(c,buffer++); */
+ put_user_char(c,buffer++);
}
unmap_brelse(bh);
return (int)pi;
diff -Nurb elks.orig/fs/pipe.c elks/fs/pipe.c
--- elks.orig/fs/pipe.c 2012-08-18 13:28:59.000000000 -0500
+++ elks/fs/pipe.c 2012-10-18 01:22:24.000000000 -0500
@@ -34,7 +34,7 @@
do {
if (!current->files.fd[(unsigned int) pfd]) {
- (void) clear_bit((unsigned int) pfd,
+ clear_bit((unsigned int) pfd,
¤t->files.close_on_exec);
return (int) pfd;
}
diff -Nurb elks.orig/fs/read_write.c elks/fs/read_write.c
--- elks.orig/fs/read_write.c 2012-10-17 12:12:32.000000000 -0500
+++ elks/fs/read_write.c 2012-10-17 23:36:57.000000000 -0500
@@ -53,7 +53,7 @@
}
- memcpy_tofs(p_offset, &tmp, 4);
+ put_user_long((unsigned long int)tmp, (void *)p_offset);
return 0;
}
reply other threads:[~2012-11-15 23:55 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAD6VGuYAucqZJ+BPmjNBkCT2LY4TrXSs2H31oZay_KBb97M11A@mail.gmail.com \
--to=lithoxs@gmail.com \
--cc=linux-8086@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).