Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/mac68k/obio For wdc_obio_match(), struct wdc_regs i...



details:   https://anonhg.NetBSD.org/src/rev/1950484f61b5
branches:  trunk
changeset: 933902:1950484f61b5
user:      rin <rin%NetBSD.org@localhost>
date:      Sun May 31 08:59:40 2020 +0000

description:
For wdc_obio_match(), struct wdc_regs is too large for stack.
Use kmem_alloc(9) instead.

Frame size becomes:
    3088 --> 0

diffstat:

 sys/arch/mac68k/obio/wdc_obio.c |  46 ++++++++++++++++++++++------------------
 1 files changed, 25 insertions(+), 21 deletions(-)

diffs (94 lines):

diff -r 73286d1b5c4b -r 1950484f61b5 sys/arch/mac68k/obio/wdc_obio.c
--- a/sys/arch/mac68k/obio/wdc_obio.c   Sun May 31 08:38:54 2020 +0000
+++ b/sys/arch/mac68k/obio/wdc_obio.c   Sun May 31 08:59:40 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: wdc_obio.c,v 1.29 2017/10/20 07:06:07 jdolecek Exp $ */
+/*     $NetBSD: wdc_obio.c,v 1.30 2020/05/31 08:59:40 rin Exp $ */
 
 /*
  * Copyright (c) 2002 Takeshi Shibagaki  All rights reserved.
@@ -32,14 +32,14 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wdc_obio.c,v 1.29 2017/10/20 07:06:07 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wdc_obio.c,v 1.30 2020/05/31 08:59:40 rin Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/device.h>
-#include <sys/malloc.h>
 #include <sys/kernel.h>
+#include <sys/kmem.h>
 #include <sys/callout.h>
 
 #include <machine/bus.h>
@@ -87,45 +87,49 @@
 wdc_obio_match(device_t parent, cfdata_t match, void *aux)
 {
        struct obio_attach_args *oa = (struct obio_attach_args *) aux;
-       struct wdc_regs wdr;
+       struct wdc_regs *wdr;
        int i, result = 0;
 
+       wdr = kmem_alloc(sizeof(struct wdc_regs), KM_SLEEP);
+
        switch (current_mac_model->machineid) {
        case MACH_MACPB150:
        case MACH_MACPB190:
        case MACH_MACPB190CS:
        case MACH_MACP580:
        case MACH_MACQ630:
-               wdr.cmd_iot = wdr.ctl_iot = oa->oa_tag;
+               wdr->cmd_iot = wdr->ctl_iot = oa->oa_tag;
 
-               if (bus_space_map(wdr.cmd_iot, IDEBase, WDC_OBIO_REG_NPORTS,
-                               0, &wdr.cmd_baseioh))
-                       return 0;
+               if (bus_space_map(wdr->cmd_iot, IDEBase, WDC_OBIO_REG_NPORTS,
+                               0, &wdr->cmd_baseioh))
+                       goto out;
 
-               mac68k_bus_space_handle_swapped(wdr.cmd_iot, &wdr.cmd_baseioh);
+               mac68k_bus_space_handle_swapped(wdr->cmd_iot,
+                   &wdr->cmd_baseioh);
 
                for (i = 0; i < WDC_NREG; i++) {
-                       if (bus_space_subregion(wdr.cmd_iot, wdr.cmd_baseioh,
-                                           4 * i, 4, &wdr.cmd_iohs[i]) != 0) {
-                               return 0;
-                       }
+                       if (bus_space_subregion(wdr->cmd_iot, wdr->cmd_baseioh,
+                                           4 * i, 4, &wdr->cmd_iohs[i]) != 0)
+                               goto out;
                }
-               wdc_init_shadow_regs(&wdr);
+               wdc_init_shadow_regs(wdr);
 
 
-               if (bus_space_subregion(wdr.cmd_iot, wdr.cmd_baseioh,
+               if (bus_space_subregion(wdr->cmd_iot, wdr->cmd_baseioh,
                                        WDC_OBIO_AUXREG_OFFSET,
                                        WDC_OBIO_AUXREG_NPORTS,
-                                       &wdr.ctl_ioh))
-                       return 0;
+                                       &wdr->ctl_ioh))
+                       goto out;
 
-               result = wdcprobe(&wdr);
+               result = wdcprobe(wdr);
 
-               bus_space_unmap(wdr.cmd_iot, wdr.cmd_baseioh, WDC_OBIO_REG_NPORTS);
+               bus_space_unmap(wdr->cmd_iot, wdr->cmd_baseioh,
+                   WDC_OBIO_REG_NPORTS);
 
-               return (result);
+               goto out;
        }
-       return 0;
+out:   kmem_free(wdr, sizeof(struct wdc_regs));
+       return result;
 }
 
 void



Home | Main Index | Thread Index | Old Index