From: Brian Gerst <bgerst@didntduck.org>
To: Thomas Hood <jdthood@mail.com>
Cc: linux-kernel@vger.kernel.org
Subject: Re: PnP BIOS driver status
Date: Fri, 08 Mar 2002 21:23:52 -0500 [thread overview]
Message-ID: <3C897238.CA903C93@didntduck.org> (raw)
In-Reply-To: <1015628440.14518.212.camel@thanatos> <3C895E90.696E92A2@didntduck.org> <1015636233.988.9.camel@thanatos>
[-- Attachment #1: Type: text/plain, Size: 421 bytes --]
Thomas Hood wrote:
>
> On Fri, 2002-03-08 at 20:00, Brian Gerst wrote:
> > The current driver is not SMP-safe.
>
> That's true.
>
> > It is modifying the GDT descriptors
> > outside of the pnp_bios_lock. Also, you can remove the __cli(), as
> > spin_lock_irq() already turns off interrupts.
>
> I'd welcome a patch like the return of a kidnapped pet.
How does this patch look? Against 2.5.6
--
Brian Gerst
[-- Attachment #2: pnpbios-segs-1 --]
[-- Type: text/plain, Size: 6363 bytes --]
diff -urN linux-2.5.6/drivers/pnp/pnpbios_core.c linux/drivers/pnp/pnpbios_core.c
--- linux-2.5.6/drivers/pnp/pnpbios_core.c Fri Mar 8 07:51:30 2002
+++ linux/drivers/pnp/pnpbios_core.c Fri Mar 8 21:15:58 2002
@@ -141,7 +141,9 @@
static spinlock_t pnp_bios_lock;
static inline u16 call_pnp_bios(u16 func, u16 arg1, u16 arg2, u16 arg3,
- u16 arg4, u16 arg5, u16 arg6, u16 arg7)
+ u16 arg4, u16 arg5, u16 arg6, u16 arg7,
+ void *ts1_base, u32 ts1_size,
+ void *ts2_base, u32 ts2_size)
{
unsigned long flags;
u16 status;
@@ -155,7 +157,12 @@
/* On some boxes IRQ's during PnP BIOS calls are deadly. */
spin_lock_irqsave(&pnp_bios_lock, flags);
- __cli();
+
+ if (ts1_size)
+ Q2_SET_SEL(PNP_TS1, ts1_base, ts1_size);
+ if (ts2_size)
+ Q2_SET_SEL(PNP_TS2, ts2_base, ts2_size);
+
__asm__ __volatile__(
"pushl %%ebp\n\t"
"pushl %%edi\n\t"
@@ -253,8 +260,8 @@
u16 status;
if (!pnp_bios_present ())
return PNP_FUNCTION_NOT_SUPPORTED;
- Q2_SET_SEL(PNP_TS1, data, sizeof(struct pnp_dev_node_info));
- status = call_pnp_bios(PNP_GET_NUM_SYS_DEV_NODES, 0, PNP_TS1, 2, PNP_TS1, PNP_DS, 0, 0);
+ status = call_pnp_bios(PNP_GET_NUM_SYS_DEV_NODES, 0, PNP_TS1, 2, PNP_TS1, PNP_DS, 0, 0,
+ data, sizeof(struct pnp_dev_node_info), 0, 0);
data->no_nodes &= 0xff;
return status;
}
@@ -288,9 +295,8 @@
return PNP_FUNCTION_NOT_SUPPORTED;
if ( !boot & pnpbios_dont_use_current_config )
return PNP_FUNCTION_NOT_SUPPORTED;
- Q2_SET_SEL(PNP_TS1, nodenum, sizeof(char));
- Q2_SET_SEL(PNP_TS2, data, 64 * 1024);
- status = call_pnp_bios(PNP_GET_SYS_DEV_NODE, 0, PNP_TS1, 0, PNP_TS2, boot ? 2 : 1, PNP_DS, 0);
+ status = call_pnp_bios(PNP_GET_SYS_DEV_NODE, 0, PNP_TS1, 0, PNP_TS2, boot ? 2 : 1, PNP_DS, 0,
+ nodenum, sizeof(char), data, 65536);
return status;
}
@@ -317,8 +323,8 @@
return PNP_FUNCTION_NOT_SUPPORTED;
if ( !boot & pnpbios_dont_use_current_config )
return PNP_FUNCTION_NOT_SUPPORTED;
- Q2_SET_SEL(PNP_TS1, data, /* *((u16 *) data)*/ 65536);
- status = call_pnp_bios(PNP_SET_SYS_DEV_NODE, nodenum, 0, PNP_TS1, boot ? 2 : 1, PNP_DS, 0, 0);
+ status = call_pnp_bios(PNP_SET_SYS_DEV_NODE, nodenum, 0, PNP_TS1, boot ? 2 : 1, PNP_DS, 0, 0,
+ data, 65536, 0, 0);
return status;
}
@@ -352,8 +358,8 @@
u16 status;
if (!pnp_bios_present ())
return PNP_FUNCTION_NOT_SUPPORTED;
- Q2_SET_SEL(PNP_TS1, event, sizeof(u16));
- status = call_pnp_bios(PNP_GET_EVENT, 0, PNP_TS1, PNP_DS, 0, 0 ,0 ,0);
+ status = call_pnp_bios(PNP_GET_EVENT, 0, PNP_TS1, PNP_DS, 0, 0 ,0 ,0,
+ event, sizeof(u16), 0, 0);
return status;
}
#endif
@@ -367,7 +373,7 @@
u16 status;
if (!pnp_bios_present ())
return PNP_FUNCTION_NOT_SUPPORTED;
- status = call_pnp_bios(PNP_SEND_MESSAGE, message, PNP_DS, 0, 0, 0, 0, 0);
+ status = call_pnp_bios(PNP_SEND_MESSAGE, message, PNP_DS, 0, 0, 0, 0, 0, 0, 0, 0, 0);
return status;
}
#endif
@@ -381,8 +387,8 @@
u16 status;
if (!pnp_bios_present ())
return PNP_FUNCTION_NOT_SUPPORTED;
- Q2_SET_SEL(PNP_TS1, data, sizeof(struct pnp_docking_station_info));
- status = call_pnp_bios(PNP_GET_DOCKING_STATION_INFORMATION, 0, PNP_TS1, PNP_DS, 0, 0, 0, 0);
+ status = call_pnp_bios(PNP_GET_DOCKING_STATION_INFORMATION, 0, PNP_TS1, PNP_DS, 0, 0, 0, 0,
+ data, sizeof(struct pnp_docking_station_info), 0, 0);
return status;
}
#endif
@@ -397,8 +403,8 @@
u16 status;
if (!pnp_bios_present ())
return PNP_FUNCTION_NOT_SUPPORTED;
- Q2_SET_SEL(PNP_TS1, info, *((u16 *) info));
- status = call_pnp_bios(PNP_SET_STATIC_ALLOCED_RES_INFO, 0, PNP_TS1, PNP_DS, 0, 0, 0, 0);
+ status = call_pnp_bios(PNP_SET_STATIC_ALLOCED_RES_INFO, 0, PNP_TS1, PNP_DS, 0, 0, 0, 0,
+ info, *((u16 *) info), 0, 0);
return status;
}
#endif
@@ -413,8 +419,8 @@
u16 status;
if (!pnp_bios_present ())
return PNP_FUNCTION_NOT_SUPPORTED;
- Q2_SET_SEL(PNP_TS1, info, 64 * 1024);
- status = call_pnp_bios(PNP_GET_STATIC_ALLOCED_RES_INFO, 0, PNP_TS1, PNP_DS, 0, 0, 0, 0);
+ status = call_pnp_bios(PNP_GET_STATIC_ALLOCED_RES_INFO, 0, PNP_TS1, PNP_DS, 0, 0, 0, 0,
+ info, 65536, 0, 0);
return status;
}
#endif
@@ -428,9 +434,8 @@
u16 status;
if (!pnp_bios_present ())
return PNP_FUNCTION_NOT_SUPPORTED;
- Q2_SET_SEL(PNP_TS1, table, *size);
- Q2_SET_SEL(PNP_TS2, size, sizeof(u16));
- status = call_pnp_bios(PNP_GET_APM_ID_TABLE, 0, PNP_TS2, 0, PNP_TS1, PNP_DS, 0, 0);
+ status = call_pnp_bios(PNP_GET_APM_ID_TABLE, 0, PNP_TS2, 0, PNP_TS1, PNP_DS, 0, 0,
+ table, *size, size, sizeof(u16));
return status;
}
#endif
@@ -444,8 +449,8 @@
u16 status;
if (!pnp_bios_present ())
return PNP_FUNCTION_NOT_SUPPORTED;
- Q2_SET_SEL(PNP_TS1, data, sizeof(struct pnp_isa_config_struc));
- status = call_pnp_bios(PNP_GET_PNP_ISA_CONFIG_STRUC, 0, PNP_TS1, PNP_DS, 0, 0, 0, 0);
+ status = call_pnp_bios(PNP_GET_PNP_ISA_CONFIG_STRUC, 0, PNP_TS1, PNP_DS, 0, 0, 0, 0,
+ data, sizeof(struct pnp_isa_config_struc), 0, 0);
return status;
}
#endif
@@ -459,8 +464,8 @@
u16 status;
if (!pnp_bios_present ())
return ESCD_FUNCTION_NOT_SUPPORTED;
- Q2_SET_SEL(PNP_TS1, data, sizeof(struct escd_info_struc));
- status = call_pnp_bios(PNP_GET_ESCD_INFO, 0, PNP_TS1, 2, PNP_TS1, 4, PNP_TS1, PNP_DS);
+ status = call_pnp_bios(PNP_GET_ESCD_INFO, 0, PNP_TS1, 2, PNP_TS1, 4, PNP_TS1, PNP_DS,
+ data, sizeof(struct escd_info_struc), 0, 0);
return status;
}
#endif
@@ -475,10 +480,8 @@
u16 status;
if (!pnp_bios_present ())
return ESCD_FUNCTION_NOT_SUPPORTED;
- Q2_SET_SEL(PNP_TS1, data, 64 * 1024);
- set_base(gdt[PNP_TS2 >> 3], nvram_base);
- set_limit(gdt[PNP_TS2 >> 3], 64 * 1024);
- status = call_pnp_bios(PNP_READ_ESCD, 0, PNP_TS1, PNP_TS2, PNP_DS, 0, 0, 0);
+ status = call_pnp_bios(PNP_READ_ESCD, 0, PNP_TS1, PNP_TS2, PNP_DS, 0, 0, 0,
+ data, 65536, nvram_base, 65536);
return status;
}
#endif
@@ -492,10 +495,8 @@
u16 status;
if (!pnp_bios_present ())
return ESCD_FUNCTION_NOT_SUPPORTED;
- Q2_SET_SEL(PNP_TS1, data, 64 * 1024);
- set_base(gdt[PNP_TS2 >> 3], nvram_base);
- set_limit(gdt[PNP_TS2 >> 3], 64 * 1024);
- status = call_pnp_bios(PNP_WRITE_ESCD, 0, PNP_TS1, PNP_TS2, PNP_DS, 0, 0, 0);
+ status = call_pnp_bios(PNP_WRITE_ESCD, 0, PNP_TS1, PNP_TS2, PNP_DS, 0, 0, 0,
+ data, 65536, nvram_base, 65536);
return status;
}
#endif
next prev parent reply other threads:[~2002-03-09 2:24 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-03-08 23:00 PnP BIOS driver status Thomas Hood
2002-03-08 23:14 ` Dave Jones
2002-03-09 0:43 ` Thomas Hood
2002-03-09 1:00 ` Brian Gerst
2002-03-09 1:10 ` Thomas Hood
2002-03-09 2:23 ` Brian Gerst [this message]
2002-03-09 3:02 ` Thomas Hood
2002-03-09 1:25 ` Alan Cox
2002-03-09 1:37 ` Brian Gerst
2002-03-09 2:00 ` Alan Cox
2002-03-09 1:51 ` Brian Gerst
2002-03-09 2:26 ` Alan Cox
2002-03-09 2:24 ` Thomas Hood
2002-03-09 2:48 ` Thomas Hood
2002-03-09 14:44 ` Thomas Hood
-- strict thread matches above, loose matches on Subject: below --
2002-03-09 15:11 Thomas Hood
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=3C897238.CA903C93@didntduck.org \
--to=bgerst@didntduck.org \
--cc=jdthood@mail.com \
--cc=linux-kernel@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.