Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-2.6: parisc: hppb.c - fix printk format strings parisc: parisc-agp.c - use correct page_mask function parisc: sticore.c - check return values parisc: dino.c - check return value of pci_assign_resource() parisc: hp_sdc_mlc.c - check return value of down_trylock() parisc: includecheck fix for ccio-dma.c parisc: Set correct bit in protection flags parisc: isa-eeprom - Fix loff_t usage parisc: fixed faulty check in lba_pci parisc: Fix read buffer overflow in pdc_stable driver parisc: Fix GOT overflow during module load on 64bit kernel
This commit is contained in:
@@ -553,7 +553,7 @@
|
|||||||
* on most of those machines only handles cache transactions.
|
* on most of those machines only handles cache transactions.
|
||||||
*/
|
*/
|
||||||
extrd,u,*= \pte,_PAGE_NO_CACHE_BIT+32,1,%r0
|
extrd,u,*= \pte,_PAGE_NO_CACHE_BIT+32,1,%r0
|
||||||
depi 1,12,1,\prot
|
depdi 1,12,1,\prot
|
||||||
|
|
||||||
/* Drop prot bits and convert to page addr for iitlbt and idtlbt */
|
/* Drop prot bits and convert to page addr for iitlbt and idtlbt */
|
||||||
convert_for_tlb_insert20 \pte
|
convert_for_tlb_insert20 \pte
|
||||||
|
@@ -86,8 +86,12 @@
|
|||||||
* the bottom of the table, which has a maximum signed displacement of
|
* the bottom of the table, which has a maximum signed displacement of
|
||||||
* 0x3fff; however, since we're only going forward, this becomes
|
* 0x3fff; however, since we're only going forward, this becomes
|
||||||
* 0x1fff, and thus, since each GOT entry is 8 bytes long we can have
|
* 0x1fff, and thus, since each GOT entry is 8 bytes long we can have
|
||||||
* at most 1023 entries */
|
* at most 1023 entries.
|
||||||
#define MAX_GOTS 1023
|
* To overcome this 14bit displacement with some kernel modules, we'll
|
||||||
|
* use instead the unusal 16bit displacement method (see reassemble_16a)
|
||||||
|
* which gives us a maximum positive displacement of 0x7fff, and as such
|
||||||
|
* allows us to allocate up to 4095 GOT entries. */
|
||||||
|
#define MAX_GOTS 4095
|
||||||
|
|
||||||
/* three functions to determine where in the module core
|
/* three functions to determine where in the module core
|
||||||
* or init pieces the location is */
|
* or init pieces the location is */
|
||||||
@@ -145,12 +149,40 @@ struct stub_entry {
|
|||||||
/* The reassemble_* functions prepare an immediate value for
|
/* The reassemble_* functions prepare an immediate value for
|
||||||
insertion into an opcode. pa-risc uses all sorts of weird bitfields
|
insertion into an opcode. pa-risc uses all sorts of weird bitfields
|
||||||
in the instruction to hold the value. */
|
in the instruction to hold the value. */
|
||||||
|
static inline int sign_unext(int x, int len)
|
||||||
|
{
|
||||||
|
int len_ones;
|
||||||
|
|
||||||
|
len_ones = (1 << len) - 1;
|
||||||
|
return x & len_ones;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int low_sign_unext(int x, int len)
|
||||||
|
{
|
||||||
|
int sign, temp;
|
||||||
|
|
||||||
|
sign = (x >> (len-1)) & 1;
|
||||||
|
temp = sign_unext(x, len-1);
|
||||||
|
return (temp << 1) | sign;
|
||||||
|
}
|
||||||
|
|
||||||
static inline int reassemble_14(int as14)
|
static inline int reassemble_14(int as14)
|
||||||
{
|
{
|
||||||
return (((as14 & 0x1fff) << 1) |
|
return (((as14 & 0x1fff) << 1) |
|
||||||
((as14 & 0x2000) >> 13));
|
((as14 & 0x2000) >> 13));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int reassemble_16a(int as16)
|
||||||
|
{
|
||||||
|
int s, t;
|
||||||
|
|
||||||
|
/* Unusual 16-bit encoding, for wide mode only. */
|
||||||
|
t = (as16 << 1) & 0xffff;
|
||||||
|
s = (as16 & 0x8000);
|
||||||
|
return (t ^ s ^ (s >> 1)) | (s >> 15);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static inline int reassemble_17(int as17)
|
static inline int reassemble_17(int as17)
|
||||||
{
|
{
|
||||||
return (((as17 & 0x10000) >> 16) |
|
return (((as17 & 0x10000) >> 16) |
|
||||||
@@ -407,6 +439,7 @@ static Elf_Addr get_stub(struct module *me, unsigned long value, long addend,
|
|||||||
enum elf_stub_type stub_type, Elf_Addr loc0, unsigned int targetsec)
|
enum elf_stub_type stub_type, Elf_Addr loc0, unsigned int targetsec)
|
||||||
{
|
{
|
||||||
struct stub_entry *stub;
|
struct stub_entry *stub;
|
||||||
|
int __maybe_unused d;
|
||||||
|
|
||||||
/* initialize stub_offset to point in front of the section */
|
/* initialize stub_offset to point in front of the section */
|
||||||
if (!me->arch.section[targetsec].stub_offset) {
|
if (!me->arch.section[targetsec].stub_offset) {
|
||||||
@@ -460,12 +493,19 @@ static Elf_Addr get_stub(struct module *me, unsigned long value, long addend,
|
|||||||
*/
|
*/
|
||||||
switch (stub_type) {
|
switch (stub_type) {
|
||||||
case ELF_STUB_GOT:
|
case ELF_STUB_GOT:
|
||||||
stub->insns[0] = 0x537b0000; /* ldd 0(%dp),%dp */
|
d = get_got(me, value, addend);
|
||||||
|
if (d <= 15) {
|
||||||
|
/* Format 5 */
|
||||||
|
stub->insns[0] = 0x0f6010db; /* ldd 0(%dp),%dp */
|
||||||
|
stub->insns[0] |= low_sign_unext(d, 5) << 16;
|
||||||
|
} else {
|
||||||
|
/* Format 3 */
|
||||||
|
stub->insns[0] = 0x537b0000; /* ldd 0(%dp),%dp */
|
||||||
|
stub->insns[0] |= reassemble_16a(d);
|
||||||
|
}
|
||||||
stub->insns[1] = 0x53610020; /* ldd 10(%dp),%r1 */
|
stub->insns[1] = 0x53610020; /* ldd 10(%dp),%r1 */
|
||||||
stub->insns[2] = 0xe820d000; /* bve (%r1) */
|
stub->insns[2] = 0xe820d000; /* bve (%r1) */
|
||||||
stub->insns[3] = 0x537b0030; /* ldd 18(%dp),%dp */
|
stub->insns[3] = 0x537b0030; /* ldd 18(%dp),%dp */
|
||||||
|
|
||||||
stub->insns[0] |= reassemble_14(get_got(me, value, addend) & 0x3fff);
|
|
||||||
break;
|
break;
|
||||||
case ELF_STUB_MILLI:
|
case ELF_STUB_MILLI:
|
||||||
stub->insns[0] = 0x20200000; /* ldil 0,%r1 */
|
stub->insns[0] = 0x20200000; /* ldil 0,%r1 */
|
||||||
|
@@ -225,7 +225,7 @@ static const struct agp_bridge_driver parisc_agp_driver = {
|
|||||||
.configure = parisc_agp_configure,
|
.configure = parisc_agp_configure,
|
||||||
.fetch_size = parisc_agp_fetch_size,
|
.fetch_size = parisc_agp_fetch_size,
|
||||||
.tlb_flush = parisc_agp_tlbflush,
|
.tlb_flush = parisc_agp_tlbflush,
|
||||||
.mask_memory = parisc_agp_mask_memory,
|
.mask_memory = parisc_agp_page_mask_memory,
|
||||||
.masks = parisc_agp_masks,
|
.masks = parisc_agp_masks,
|
||||||
.agp_enable = parisc_agp_enable,
|
.agp_enable = parisc_agp_enable,
|
||||||
.cache_flush = global_cache_flush,
|
.cache_flush = global_cache_flush,
|
||||||
|
@@ -296,7 +296,7 @@ static void hp_sdc_mlc_out(hil_mlc *mlc)
|
|||||||
priv->tseq[3] = 0;
|
priv->tseq[3] = 0;
|
||||||
if (mlc->opacket & HIL_CTRL_APE) {
|
if (mlc->opacket & HIL_CTRL_APE) {
|
||||||
priv->tseq[3] |= HP_SDC_LPC_APE_IPF;
|
priv->tseq[3] |= HP_SDC_LPC_APE_IPF;
|
||||||
down_trylock(&mlc->csem);
|
BUG_ON(down_trylock(&mlc->csem));
|
||||||
}
|
}
|
||||||
enqueue:
|
enqueue:
|
||||||
hp_sdc_enqueue_transaction(&priv->trans);
|
hp_sdc_enqueue_transaction(&priv->trans);
|
||||||
|
@@ -70,7 +70,6 @@
|
|||||||
#undef CCIO_COLLECT_STATS
|
#undef CCIO_COLLECT_STATS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <linux/proc_fs.h>
|
|
||||||
#include <asm/runway.h> /* for proc_runway_root */
|
#include <asm/runway.h> /* for proc_runway_root */
|
||||||
|
|
||||||
#ifdef DEBUG_CCIO_INIT
|
#ifdef DEBUG_CCIO_INIT
|
||||||
|
@@ -614,7 +614,7 @@ dino_fixup_bus(struct pci_bus *bus)
|
|||||||
dev_name(&bus->self->dev), i,
|
dev_name(&bus->self->dev), i,
|
||||||
bus->self->resource[i].start,
|
bus->self->resource[i].start,
|
||||||
bus->self->resource[i].end);
|
bus->self->resource[i].end);
|
||||||
pci_assign_resource(bus->self, i);
|
WARN_ON(pci_assign_resource(bus->self, i));
|
||||||
DBG("DEBUG %s after assign %d [0x%lx,0x%lx]\n",
|
DBG("DEBUG %s after assign %d [0x%lx,0x%lx]\n",
|
||||||
dev_name(&bus->self->dev), i,
|
dev_name(&bus->self->dev), i,
|
||||||
bus->self->resource[i].start,
|
bus->self->resource[i].start,
|
||||||
|
@@ -55,7 +55,7 @@ static ssize_t eisa_eeprom_read(struct file * file,
|
|||||||
ssize_t ret;
|
ssize_t ret;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (*ppos >= HPEE_MAX_LENGTH)
|
if (*ppos < 0 || *ppos >= HPEE_MAX_LENGTH)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
count = *ppos + count < HPEE_MAX_LENGTH ? count : HPEE_MAX_LENGTH - *ppos;
|
count = *ppos + count < HPEE_MAX_LENGTH ? count : HPEE_MAX_LENGTH - *ppos;
|
||||||
|
@@ -62,7 +62,8 @@ static int hppb_probe(struct parisc_device *dev)
|
|||||||
}
|
}
|
||||||
card = card->next;
|
card = card->next;
|
||||||
}
|
}
|
||||||
printk(KERN_INFO "Found GeckoBoa at 0x%x\n", dev->hpa.start);
|
printk(KERN_INFO "Found GeckoBoa at 0x%llx\n",
|
||||||
|
(unsigned long long) dev->hpa.start);
|
||||||
|
|
||||||
card->hpa = dev->hpa.start;
|
card->hpa = dev->hpa.start;
|
||||||
card->mmio_region.name = "HP-PB Bus";
|
card->mmio_region.name = "HP-PB Bus";
|
||||||
@@ -73,8 +74,10 @@ static int hppb_probe(struct parisc_device *dev)
|
|||||||
|
|
||||||
status = ccio_request_resource(dev, &card->mmio_region);
|
status = ccio_request_resource(dev, &card->mmio_region);
|
||||||
if(status < 0) {
|
if(status < 0) {
|
||||||
printk(KERN_ERR "%s: failed to claim HP-PB bus space (%08x, %08x)\n",
|
printk(KERN_ERR "%s: failed to claim HP-PB "
|
||||||
__FILE__, card->mmio_region.start, card->mmio_region.end);
|
"bus space (0x%08llx, 0x%08llx)\n",
|
||||||
|
__FILE__, (unsigned long long) card->mmio_region.start,
|
||||||
|
(unsigned long long) card->mmio_region.end);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@@ -992,7 +992,7 @@ lba_pat_resources(struct parisc_device *pa_dev, struct lba_device *lba_dev)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
io_pdc_cell = kzalloc(sizeof(pdc_pat_cell_mod_maddr_block_t), GFP_KERNEL);
|
io_pdc_cell = kzalloc(sizeof(pdc_pat_cell_mod_maddr_block_t), GFP_KERNEL);
|
||||||
if (!pa_pdc_cell) {
|
if (!io_pdc_cell) {
|
||||||
kfree(pa_pdc_cell);
|
kfree(pa_pdc_cell);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@@ -370,7 +370,7 @@ pdcspath_layer_read(struct pdcspath_entry *entry, char *buf)
|
|||||||
if (!i) /* entry is not ready */
|
if (!i) /* entry is not ready */
|
||||||
return -ENODATA;
|
return -ENODATA;
|
||||||
|
|
||||||
for (i = 0; devpath->layers[i] && (likely(i < 6)); i++)
|
for (i = 0; i < 6 && devpath->layers[i]; i++)
|
||||||
out += sprintf(out, "%u ", devpath->layers[i]);
|
out += sprintf(out, "%u ", devpath->layers[i]);
|
||||||
|
|
||||||
out += sprintf(out, "\n");
|
out += sprintf(out, "\n");
|
||||||
|
@@ -957,9 +957,14 @@ static int __devinit sticore_pci_init(struct pci_dev *pd,
|
|||||||
#ifdef CONFIG_PCI
|
#ifdef CONFIG_PCI
|
||||||
unsigned long fb_base, rom_base;
|
unsigned long fb_base, rom_base;
|
||||||
unsigned int fb_len, rom_len;
|
unsigned int fb_len, rom_len;
|
||||||
|
int err;
|
||||||
struct sti_struct *sti;
|
struct sti_struct *sti;
|
||||||
|
|
||||||
pci_enable_device(pd);
|
err = pci_enable_device(pd);
|
||||||
|
if (err < 0) {
|
||||||
|
dev_err(&pd->dev, "Cannot enable PCI device\n");
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
fb_base = pci_resource_start(pd, 0);
|
fb_base = pci_resource_start(pd, 0);
|
||||||
fb_len = pci_resource_len(pd, 0);
|
fb_len = pci_resource_len(pd, 0);
|
||||||
@@ -1048,7 +1053,7 @@ static void __devinit sti_init_roms(void)
|
|||||||
|
|
||||||
/* Register drivers for native & PCI cards */
|
/* Register drivers for native & PCI cards */
|
||||||
register_parisc_driver(&pa_sti_driver);
|
register_parisc_driver(&pa_sti_driver);
|
||||||
pci_register_driver(&pci_sti_driver);
|
WARN_ON(pci_register_driver(&pci_sti_driver));
|
||||||
|
|
||||||
/* if we didn't find the given default sti, take the first one */
|
/* if we didn't find the given default sti, take the first one */
|
||||||
if (!default_sti)
|
if (!default_sti)
|
||||||
|
Reference in New Issue
Block a user