Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
da501825
Commit
da501825
authored
Sep 25, 2003
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
http://linux-sound.bkbits.net/linux-sound
into home.osdl.org:/home/torvalds/v2.5/linux
parents
c1fabdad
2a98ed00
Changes
33
Hide whitespace changes
Inline
Side-by-side
Showing
33 changed files
with
724 additions
and
597 deletions
+724
-597
drivers/char/drm/Kconfig
drivers/char/drm/Kconfig
+2
-2
drivers/char/drm/drmP.h
drivers/char/drm/drmP.h
+11
-12
drivers/char/drm/drm_agpsupport.h
drivers/char/drm/drm_agpsupport.h
+6
-6
drivers/char/drm/drm_memory.h
drivers/char/drm/drm_memory.h
+4
-4
drivers/char/drm/drm_memory_debug.h
drivers/char/drm/drm_memory_debug.h
+5
-5
drivers/char/drm/drm_os_linux.h
drivers/char/drm/drm_os_linux.h
+8
-3
drivers/char/drm/gamma_dma.c
drivers/char/drm/gamma_dma.c
+4
-3
drivers/char/drm/i830_irq.c
drivers/char/drm/i830_irq.c
+2
-2
drivers/char/drm/sis.h
drivers/char/drm/sis.h
+17
-20
drivers/char/drm/sis_drm.h
drivers/char/drm/sis_drm.h
+21
-34
drivers/char/drm/sis_drv.h
drivers/char/drm/sis_drv.h
+11
-9
drivers/char/drm/sis_ds.c
drivers/char/drm/sis_ds.c
+250
-271
drivers/char/drm/sis_ds.h
drivers/char/drm/sis_ds.h
+31
-30
drivers/char/drm/sis_mm.c
drivers/char/drm/sis_mm.c
+291
-195
include/asm-alpha/mman.h
include/asm-alpha/mman.h
+2
-0
include/asm-arm/mman.h
include/asm-arm/mman.h
+2
-0
include/asm-arm26/mman.h
include/asm-arm26/mman.h
+2
-0
include/asm-cris/mman.h
include/asm-cris/mman.h
+2
-0
include/asm-h8300/mman.h
include/asm-h8300/mman.h
+2
-0
include/asm-i386/mman.h
include/asm-i386/mman.h
+4
-0
include/asm-ia64/mman.h
include/asm-ia64/mman.h
+2
-0
include/asm-m68k/mman.h
include/asm-m68k/mman.h
+2
-0
include/asm-mips/mman.h
include/asm-mips/mman.h
+2
-0
include/asm-parisc/mman.h
include/asm-parisc/mman.h
+2
-0
include/asm-ppc/mman.h
include/asm-ppc/mman.h
+2
-0
include/asm-ppc64/mman.h
include/asm-ppc64/mman.h
+2
-0
include/asm-s390/mman.h
include/asm-s390/mman.h
+2
-0
include/asm-sh/mman.h
include/asm-sh/mman.h
+2
-0
include/asm-sparc/mman.h
include/asm-sparc/mman.h
+2
-0
include/asm-sparc64/mman.h
include/asm-sparc64/mman.h
+2
-0
include/asm-v850/mman.h
include/asm-v850/mman.h
+2
-0
include/asm-x86_64/mman.h
include/asm-x86_64/mman.h
+2
-0
mm/mprotect.c
mm/mprotect.c
+23
-1
No files found.
drivers/char/drm/Kconfig
View file @
da501825
...
...
@@ -75,9 +75,9 @@ config DRM_MGA
config DRM_SIS
tristate "SiS video cards"
depends on DRM && AGP
&& FB_SIS
depends on DRM && AGP
help
Choose this option if you have a SiS 630 or compatibel video
chipset. If M is selected the module will be called sis. AGP
and SiS FB
support is required for this driver to work.
support is required for this driver to work.
drivers/char/drm/drmP.h
View file @
da501825
...
...
@@ -551,7 +551,7 @@ typedef struct drm_device_dma {
*/
typedef
struct
drm_agp_mem
{
unsigned
long
handle
;
/**< handle */
struct
agp_memory
*
memory
;
DRM_AGP_MEM
*
memory
;
unsigned
long
bound
;
/**< address */
int
pages
;
struct
drm_agp_mem
*
prev
;
/**< previous entry */
...
...
@@ -564,7 +564,7 @@ typedef struct drm_agp_mem {
* \sa DRM(agp_init)() and drm_device::agp.
*/
typedef
struct
drm_agp_head
{
struct
agp_kern_info
agp_info
;
/**< AGP device information */
DRM_AGP_KERN
agp_info
;
/**< AGP device information */
drm_agp_mem_t
*
memory
;
/**< memory entries */
unsigned
long
mode
;
/**< AGP mode */
int
enabled
;
/**< whether the AGP bus as been enabled */
...
...
@@ -797,10 +797,10 @@ extern void *DRM(ioremap_nocache)(unsigned long offset, unsigned long size,
extern
void
DRM
(
ioremapfree
)(
void
*
pt
,
unsigned
long
size
,
drm_device_t
*
dev
);
#if __REALLY_HAVE_AGP
extern
struct
agp_memory
*
DRM
(
alloc_agp
)(
int
pages
,
u32
type
);
extern
int
DRM
(
free_agp
)(
struct
agp_memory
*
handle
,
int
pages
);
extern
int
DRM
(
bind_agp
)(
struct
agp_memory
*
handle
,
unsigned
int
start
);
extern
int
DRM
(
unbind_agp
)(
struct
agp_memory
*
handle
);
extern
DRM_AGP_MEM
*
DRM
(
alloc_agp
)(
int
pages
,
u32
type
);
extern
int
DRM
(
free_agp
)(
DRM_AGP_MEM
*
handle
,
int
pages
);
extern
int
DRM
(
bind_agp
)(
DRM_AGP_MEM
*
handle
,
unsigned
int
start
);
extern
int
DRM
(
unbind_agp
)(
DRM_AGP_MEM
*
handle
);
#endif
/* Misc. IOCTL support (drm_ioctl.h) */
...
...
@@ -905,8 +905,7 @@ extern int DRM(control)( struct inode *inode, struct file *filp,
unsigned
int
cmd
,
unsigned
long
arg
);
extern
int
DRM
(
irq_install
)(
drm_device_t
*
dev
,
int
irq
);
extern
int
DRM
(
irq_uninstall
)(
drm_device_t
*
dev
);
extern
irqreturn_t
DRM
(
dma_service
)(
int
irq
,
void
*
device
,
struct
pt_regs
*
regs
);
extern
irqreturn_t
DRM
(
dma_service
)(
DRM_IRQ_ARGS
);
extern
void
DRM
(
driver_irq_preinstall
)(
drm_device_t
*
dev
);
extern
void
DRM
(
driver_irq_postinstall
)(
drm_device_t
*
dev
);
extern
void
DRM
(
driver_irq_uninstall
)(
drm_device_t
*
dev
);
...
...
@@ -944,10 +943,10 @@ extern int DRM(agp_unbind)(struct inode *inode, struct file *filp,
unsigned
int
cmd
,
unsigned
long
arg
);
extern
int
DRM
(
agp_bind
)(
struct
inode
*
inode
,
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
);
extern
struct
agp_memory
*
DRM
(
agp_allocate_memory
)(
size_t
pages
,
u32
type
);
extern
int
DRM
(
agp_free_memory
)(
struct
agp_memory
*
handle
);
extern
int
DRM
(
agp_bind_memory
)(
struct
agp_memory
*
handle
,
off_t
start
);
extern
int
DRM
(
agp_unbind_memory
)(
struct
agp_memory
*
handle
);
extern
DRM_AGP_MEM
*
DRM
(
agp_allocate_memory
)(
size_t
pages
,
u32
type
);
extern
int
DRM
(
agp_free_memory
)(
DRM_AGP_MEM
*
handle
);
extern
int
DRM
(
agp_bind_memory
)(
DRM_AGP_MEM
*
handle
,
off_t
start
);
extern
int
DRM
(
agp_unbind_memory
)(
DRM_AGP_MEM
*
handle
);
#endif
/* Stub support (drm_stub.h) */
...
...
drivers/char/drm/drm_agpsupport.h
View file @
da501825
...
...
@@ -62,7 +62,7 @@ int DRM(agp_info)(struct inode *inode, struct file *filp,
{
drm_file_t
*
priv
=
filp
->
private_data
;
drm_device_t
*
dev
=
priv
->
dev
;
struct
agp_kern_info
*
kern
;
DRM_AGP_KERN
*
kern
;
drm_agp_info_t
info
;
if
(
!
dev
->
agp
||
!
dev
->
agp
->
acquired
||
!
drm_agp
->
copy_info
)
...
...
@@ -198,7 +198,7 @@ int DRM(agp_alloc)(struct inode *inode, struct file *filp,
drm_device_t
*
dev
=
priv
->
dev
;
drm_agp_buffer_t
request
;
drm_agp_mem_t
*
entry
;
struct
agp_memory
*
memory
;
DRM_AGP_MEM
*
memory
;
unsigned
long
pages
;
u32
type
;
...
...
@@ -429,7 +429,7 @@ void DRM(agp_uninit)(void)
}
/** Calls drm_agp->allocate_memory() */
struct
agp_memory
*
DRM
(
agp_allocate_memory
)(
size_t
pages
,
u32
type
)
DRM_AGP_MEM
*
DRM
(
agp_allocate_memory
)(
size_t
pages
,
u32
type
)
{
if
(
!
drm_agp
->
allocate_memory
)
return
NULL
;
...
...
@@ -437,7 +437,7 @@ struct agp_memory *DRM(agp_allocate_memory)(size_t pages, u32 type)
}
/** Calls drm_agp->free_memory() */
int
DRM
(
agp_free_memory
)(
struct
agp_memory
*
handle
)
int
DRM
(
agp_free_memory
)(
DRM_AGP_MEM
*
handle
)
{
if
(
!
handle
||
!
drm_agp
->
free_memory
)
return
0
;
...
...
@@ -446,7 +446,7 @@ int DRM(agp_free_memory)(struct agp_memory *handle)
}
/** Calls drm_agp->bind_memory() */
int
DRM
(
agp_bind_memory
)(
struct
agp_memory
*
handle
,
off_t
start
)
int
DRM
(
agp_bind_memory
)(
DRM_AGP_MEM
*
handle
,
off_t
start
)
{
if
(
!
handle
||
!
drm_agp
->
bind_memory
)
return
-
EINVAL
;
...
...
@@ -454,7 +454,7 @@ int DRM(agp_bind_memory)(struct agp_memory *handle, off_t start)
}
/** Calls drm_agp->unbind_memory() */
int
DRM
(
agp_unbind_memory
)(
struct
agp_memory
*
handle
)
int
DRM
(
agp_unbind_memory
)(
DRM_AGP_MEM
*
handle
)
{
if
(
!
handle
||
!
drm_agp
->
unbind_memory
)
return
-
EINVAL
;
...
...
drivers/char/drm/drm_memory.h
View file @
da501825
...
...
@@ -333,25 +333,25 @@ void DRM(ioremapfree)(void *pt, unsigned long size, drm_device_t *dev)
#if __REALLY_HAVE_AGP
/** Wrapper around agp_allocate_memory() */
struct
agp_memory
*
DRM
(
alloc_agp
)(
int
pages
,
u32
type
)
DRM_AGP_MEM
*
DRM
(
alloc_agp
)(
int
pages
,
u32
type
)
{
return
DRM
(
agp_allocate_memory
)(
pages
,
type
);
}
/** Wrapper around agp_free_memory() */
int
DRM
(
free_agp
)(
struct
agp_memory
*
handle
,
int
pages
)
int
DRM
(
free_agp
)(
DRM_AGP_MEM
*
handle
,
int
pages
)
{
return
DRM
(
agp_free_memory
)(
handle
)
?
0
:
-
EINVAL
;
}
/** Wrapper around agp_bind_memory() */
int
DRM
(
bind_agp
)(
struct
agp_memory
*
handle
,
unsigned
int
start
)
int
DRM
(
bind_agp
)(
DRM_AGP_MEM
*
handle
,
unsigned
int
start
)
{
return
DRM
(
agp_bind_memory
)(
handle
,
start
);
}
/** Wrapper around agp_unbind_memory() */
int
DRM
(
unbind_agp
)(
struct
agp_memory
*
handle
)
int
DRM
(
unbind_agp
)(
DRM_AGP_MEM
*
handle
)
{
return
DRM
(
agp_unbind_memory
)(
handle
);
}
...
...
drivers/char/drm/drm_memory_debug.h
View file @
da501825
...
...
@@ -353,9 +353,9 @@ void DRM(ioremapfree)(void *pt, unsigned long size, drm_device_t *dev)
#if __REALLY_HAVE_AGP
agp_memory
*
DRM
(
alloc_agp
)(
int
pages
,
u32
type
)
DRM_AGP_MEM
*
DRM
(
alloc_agp
)(
int
pages
,
u32
type
)
{
agp_memory
*
handle
;
DRM_AGP_MEM
*
handle
;
if
(
!
pages
)
{
DRM_MEM_ERROR
(
DRM_MEM_TOTALAGP
,
"Allocating 0 pages
\n
"
);
...
...
@@ -376,7 +376,7 @@ agp_memory *DRM(alloc_agp)(int pages, u32 type)
return
NULL
;
}
int
DRM
(
free_agp
)(
agp_memory
*
handle
,
int
pages
)
int
DRM
(
free_agp
)(
DRM_AGP_MEM
*
handle
,
int
pages
)
{
int
alloc_count
;
int
free_count
;
...
...
@@ -405,7 +405,7 @@ int DRM(free_agp)(agp_memory *handle, int pages)
return
retval
;
}
int
DRM
(
bind_agp
)(
agp_memory
*
handle
,
unsigned
int
start
)
int
DRM
(
bind_agp
)(
DRM_AGP_MEM
*
handle
,
unsigned
int
start
)
{
int
retcode
=
-
EINVAL
;
...
...
@@ -429,7 +429,7 @@ int DRM(bind_agp)(agp_memory *handle, unsigned int start)
return
retcode
;
}
int
DRM
(
unbind_agp
)(
agp_memory
*
handle
)
int
DRM
(
unbind_agp
)(
DRM_AGP_MEM
*
handle
)
{
int
alloc_count
;
int
free_count
;
...
...
drivers/char/drm/drm_os_linux.h
View file @
da501825
...
...
@@ -32,9 +32,14 @@
/** DRM device local declaration */
#define DRM_DEVICE drm_file_t *priv = filp->private_data; \
drm_device_t *dev = priv->dev
/** IRQ handler arguments */
#define DRM_IRQ_ARGS int irq, void *arg, struct pt_regs *regs
/** IRQ handler arguments and return type and values */
#define DRM_IRQ_ARGS int irq, void *arg, struct pt_regs *regs
/** AGP types */
#define DRM_AGP_MEM struct agp_memory
#define DRM_AGP_KERN struct agp_kern_info
/** Task queue handler arguments */
#define DRM_TASKQUEUE_ARGS void *arg
...
...
drivers/char/drm/gamma_dma.c
View file @
da501825
...
...
@@ -116,13 +116,14 @@ static inline int gamma_dma_is_ready(drm_device_t *dev)
return
(
!
GAMMA_READ
(
GAMMA_DMACOUNT
));
}
irqreturn_t
gamma_dma_service
(
int
irq
,
void
*
device
,
struct
pt_regs
*
regs
)
irqreturn_t
gamma_dma_service
(
DRM_IRQ_ARGS
)
{
drm_device_t
*
dev
=
(
drm_device_t
*
)
device
;
drm_device_t
*
dev
=
(
drm_device_t
*
)
arg
;
drm_device_dma_t
*
dma
=
dev
->
dma
;
drm_gamma_private_t
*
dev_priv
=
(
drm_gamma_private_t
*
)
dev
->
dev_private
;
/* FIXME: should check whether we're actually interested in the interrupt? */
atomic_inc
(
&
dev
->
counts
[
6
]);
/* _DRM_STAT_IRQ */
while
(
GAMMA_READ
(
GAMMA_INFIFOSPACE
)
<
3
)
...
...
@@ -141,7 +142,7 @@ irqreturn_t gamma_dma_service(int irq, void *device, struct pt_regs *regs)
}
clear_bit
(
0
,
&
dev
->
dma_flag
);
/* Dispatch new buffer */
/* Dispatch new buffer */
schedule_work
(
&
dev
->
work
);
}
return
IRQ_HANDLED
;
...
...
drivers/char/drm/i830_irq.c
View file @
da501825
...
...
@@ -35,9 +35,9 @@
#include <linux/delay.h>
irqreturn_t
DRM
(
dma_service
)(
int
irq
,
void
*
device
,
struct
pt_regs
*
regs
)
irqreturn_t
DRM
(
dma_service
)(
DRM_IRQ_ARGS
)
{
drm_device_t
*
dev
=
(
drm_device_t
*
)
device
;
drm_device_t
*
dev
=
(
drm_device_t
*
)
arg
;
drm_i830_private_t
*
dev_priv
=
(
drm_i830_private_t
*
)
dev
->
dev_private
;
u16
temp
;
...
...
drivers/char/drm/sis.h
View file @
da501825
...
...
@@ -33,7 +33,11 @@
* Name it sisdrv_##x as there's a conflict with sis_free/malloc in the kernel
* that's used for fb devices
*/
#ifdef __linux__
#define DRM(x) sisdrv_##x
#else
#define DRM(x) sis_##x
#endif
/* General customization:
*/
...
...
@@ -42,28 +46,21 @@
#define __HAVE_MTRR 1
#define __HAVE_CTX_BITMAP 1
#define DRIVER_AUTHOR
"SIS"
#define DRIVER_NAME
"sis"
#define DRIVER_DESC
"SIS 300/630/540"
#define DRIVER_DATE
"20010503
"
#define DRIVER_MAJOR
1
#define DRIVER_MINOR
0
#define DRIVER_PATCHLEVEL
0
#define DRIVER_AUTHOR
"SIS"
#define DRIVER_NAME
"sis"
#define DRIVER_DESC
"SIS 300/630/540"
#define DRIVER_DATE
"20030826
"
#define DRIVER_MAJOR
1
#define DRIVER_MINOR
1
#define DRIVER_PATCHLEVEL
0
#define DRIVER_IOCTLS \
[DRM_IOCTL_NR(SIS_IOCTL_FB_ALLOC)] = { sis_fb_alloc, 1, 0 }, \
[DRM_IOCTL_NR(SIS_IOCTL_FB_FREE)] = { sis_fb_free, 1, 0 }, \
/* AGP Memory Management */
\
[DRM_IOCTL_NR(SIS_IOCTL_AGP_INIT)] = { sisp_agp_init, 1, 0 }, \
[DRM_IOCTL_NR(SIS_IOCTL_AGP_ALLOC)] = { sisp_agp_alloc, 1, 0 }, \
[DRM_IOCTL_NR(SIS_IOCTL_AGP_FREE)] = { sisp_agp_free, 1, 0 }
#if 0 /* these don't appear to be defined */
/* SIS Stereo */
[DRM_IOCTL_NR(DRM_IOCTL_CONTROL)] = { sis_control, 1, 1 },
[DRM_IOCTL_NR(SIS_IOCTL_FLIP)] = { sis_flip, 1, 1 },
[DRM_IOCTL_NR(SIS_IOCTL_FLIP_INIT)] = { sis_flip_init, 1, 1 },
[DRM_IOCTL_NR(SIS_IOCTL_FLIP_FINAL)] = { sis_flip_final, 1, 1 }
#endif
[DRM_IOCTL_NR(DRM_IOCTL_SIS_FB_ALLOC)] = { sis_fb_alloc, 1, 0 }, \
[DRM_IOCTL_NR(DRM_IOCTL_SIS_FB_FREE)] = { sis_fb_free, 1, 0 }, \
[DRM_IOCTL_NR(DRM_IOCTL_SIS_AGP_INIT)] = { sis_ioctl_agp_init, 1, 1 }, \
[DRM_IOCTL_NR(DRM_IOCTL_SIS_AGP_ALLOC)] = { sis_ioctl_agp_alloc, 1, 0 }, \
[DRM_IOCTL_NR(DRM_IOCTL_SIS_AGP_FREE)] = { sis_ioctl_agp_free, 1, 0 }, \
[DRM_IOCTL_NR(DRM_IOCTL_SIS_FB_INIT)] = { sis_fb_init, 1, 1 }
#define __HAVE_COUNTERS 5
...
...
drivers/char/drm/sis_drm.h
View file @
da501825
#ifndef _
sis_drm_public_h
_
#define _
sis_drm_public_h
_
#ifndef _
_SIS_DRM_H_
_
#define _
_SIS_DRM_H_
_
/* SiS specific ioctls */
#define SIS_IOCTL_FB_ALLOC DRM_IOWR(0x44, drm_sis_mem_t)
#define SIS_IOCTL_FB_FREE DRM_IOW( 0x45, drm_sis_mem_t)
#define SIS_IOCTL_AGP_INIT DRM_IOWR(0x53, drm_sis_agp_t)
#define SIS_IOCTL_AGP_ALLOC DRM_IOWR(0x54, drm_sis_mem_t)
#define SIS_IOCTL_AGP_FREE DRM_IOW( 0x55, drm_sis_mem_t)
#define SIS_IOCTL_FLIP DRM_IOW( 0x48, drm_sis_flip_t)
#define SIS_IOCTL_FLIP_INIT DRM_IO( 0x49)
#define SIS_IOCTL_FLIP_FINAL DRM_IO( 0x50)
#define DRM_IOCTL_SIS_FB_ALLOC DRM_IOWR(0x44, drm_sis_mem_t)
#define DRM_IOCTL_SIS_FB_FREE DRM_IOW( 0x45, drm_sis_mem_t)
#define DRM_IOCTL_SIS_AGP_INIT DRM_IOWR(0x53, drm_sis_agp_t)
#define DRM_IOCTL_SIS_AGP_ALLOC DRM_IOWR(0x54, drm_sis_mem_t)
#define DRM_IOCTL_SIS_AGP_FREE DRM_IOW( 0x55, drm_sis_mem_t)
#define DRM_IOCTL_SIS_FB_INIT DRM_IOW( 0x56, drm_sis_fb_t)
/*
#define DRM_IOCTL_SIS_FLIP DRM_IOW( 0x48, drm_sis_flip_t)
#define DRM_IOCTL_SIS_FLIP_INIT DRM_IO( 0x49)
#define DRM_IOCTL_SIS_FLIP_FINAL DRM_IO( 0x50)
*/
typedef
struct
{
int
context
;
unsigned
int
offset
;
unsigned
int
size
;
unsigned
int
free
;
int
context
;
unsigned
int
offset
;
unsigned
int
size
;
unsigned
long
free
;
}
drm_sis_mem_t
;
typedef
struct
{
unsigned
int
offset
,
size
;
unsigned
int
offset
,
size
;
}
drm_sis_agp_t
;
typedef
struct
{
unsigned
int
left
,
right
;
}
drm_sis_f
lip
_t
;
unsigned
int
offset
,
size
;
}
drm_sis_f
b
_t
;
#ifdef __KERNEL__
int
sis_fb_alloc
(
struct
inode
*
inode
,
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
);
int
sis_fb_free
(
struct
inode
*
inode
,
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
);
int
sisp_agp_init
(
struct
inode
*
inode
,
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
);
int
sisp_agp_alloc
(
struct
inode
*
inode
,
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
);
int
sisp_agp_free
(
struct
inode
*
inode
,
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
);
#endif
#endif
#endif
/* __SIS_DRM_H__ */
drivers/char/drm/sis_drv.h
View file @
da501825
...
...
@@ -28,18 +28,20 @@
#ifndef _SIS_DRV_H_
#define _SIS_DRV_H_
#include "sis_ds.h"
typedef
struct
drm_sis_private
{
drm_map_t
*
buffers
;
}
drm_sis_private_t
;
/* Stereo ? - this was never committed */
memHeap_t
*
AGPHeap
;
memHeap_t
*
FBHeap
;
}
drm_sis_private_t
;
int
sis_flip
(
struct
inode
*
inode
,
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
);
int
sis_flip_init
(
struct
inode
*
inode
,
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
);
int
sis_flip_final
(
struct
inode
*
inode
,
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
);
void
flip_final
(
void
);
extern
int
sis_fb_alloc
(
DRM_IOCTL_ARGS
);
extern
int
sis_fb_free
(
DRM_IOCTL_ARGS
);
extern
int
sis_ioctl_agp_init
(
DRM_IOCTL_ARGS
);
extern
int
sis_ioctl_agp_alloc
(
DRM_IOCTL_ARGS
);
extern
int
sis_ioctl_agp_free
(
DRM_IOCTL_ARGS
);
extern
int
sis_fb_init
(
DRM_IOCTL_ARGS
);
#endif
drivers/char/drm/sis_ds.c
View file @
da501825
...
...
@@ -28,15 +28,9 @@
*
*/
#include <linux/module.h>
#include <linux/delay.h>
#include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/poll.h>
#include <asm/io.h>
#include <linux/pci.h>
#include "sis.h"
#include "drmP.h"
#include "drm.h"
#include "sis_ds.h"
/* Set Data Structure, not check repeated value
...
...
@@ -45,98 +39,98 @@
set_t
*
setInit
(
void
)
{
int
i
;
set_t
*
set
;
set
=
(
set_t
*
)
MALLOC
(
sizeof
(
set_t
)
);
if
(
set
)
{
for
(
i
=
0
;
i
<
SET_SIZE
;
i
++
)
{
set
->
list
[
i
].
free_next
=
i
+
1
;
set
->
list
[
i
].
alloc_next
=
-
1
;
}
set
->
list
[
SET_SIZE
-
1
].
free_next
=
-
1
;
set
->
free
=
0
;
set
->
alloc
=
-
1
;
set
->
trace
=
-
1
;
}
return
set
;
int
i
;
set_t
*
set
;
set
=
(
set_t
*
)
DRM
(
alloc
)(
sizeof
(
set_t
),
DRM_MEM_DRIVER
);
if
(
set
!=
NULL
)
{
for
(
i
=
0
;
i
<
SET_SIZE
;
i
++
)
{
set
->
list
[
i
].
free_next
=
i
+
1
;
set
->
list
[
i
].
alloc_next
=
-
1
;
}
set
->
list
[
SET_SIZE
-
1
].
free_next
=
-
1
;
set
->
free
=
0
;
set
->
alloc
=
-
1
;
set
->
trace
=
-
1
;
}
return
set
;
}
int
setAdd
(
set_t
*
set
,
ITEM_TYPE
item
)
{
int
free
=
set
->
free
;
int
free
=
set
->
free
;
if
(
free
!=
-
1
){
set
->
list
[
free
].
val
=
item
;
set
->
free
=
set
->
list
[
free
].
free_next
;
}
else
{
return
0
;
}
set
->
list
[
free
].
alloc_next
=
set
->
alloc
;
set
->
alloc
=
free
;
set
->
list
[
free
].
free_next
=
-
1
;
return
1
;
if
(
free
!=
-
1
)
{
set
->
list
[
free
].
val
=
item
;
set
->
free
=
set
->
list
[
free
].
free_next
;
}
else
{
return
0
;
}
set
->
list
[
free
].
alloc_next
=
set
->
alloc
;
set
->
alloc
=
free
;
set
->
list
[
free
].
free_next
=
-
1
;
return
1
;
}
int
setDel
(
set_t
*
set
,
ITEM_TYPE
item
)
{
int
alloc
=
set
->
alloc
;
int
prev
=
-
1
;
while
(
alloc
!=
-
1
){
if
(
set
->
list
[
alloc
].
val
==
item
){
if
(
prev
!=
-
1
)
set
->
list
[
prev
].
alloc_next
=
set
->
list
[
alloc
].
alloc_next
;
else
set
->
alloc
=
set
->
list
[
alloc
].
alloc_next
;
break
;
}
prev
=
alloc
;
alloc
=
set
->
list
[
alloc
].
alloc_next
;
}
if
(
alloc
==
-
1
)
return
0
;
set
->
list
[
alloc
].
free_next
=
set
->
free
;
set
->
free
=
alloc
;
set
->
list
[
alloc
].
alloc_next
=
-
1
;
return
1
;
int
alloc
=
set
->
alloc
;
int
prev
=
-
1
;
while
(
alloc
!=
-
1
)
{
if
(
set
->
list
[
alloc
].
val
==
item
)
{
if
(
prev
!=
-
1
)
set
->
list
[
prev
].
alloc_next
=
set
->
list
[
alloc
].
alloc_next
;
else
set
->
alloc
=
set
->
list
[
alloc
].
alloc_next
;
break
;
}
prev
=
alloc
;
alloc
=
set
->
list
[
alloc
].
alloc_next
;
}
if
(
alloc
==
-
1
)
return
0
;
set
->
list
[
alloc
].
free_next
=
set
->
free
;
set
->
free
=
alloc
;
set
->
list
[
alloc
].
alloc_next
=
-
1
;
return
1
;
}
/* setFirst -> setAdd -> setNext is wrong */
int
setFirst
(
set_t
*
set
,
ITEM_TYPE
*
item
)
{
if
(
set
->
alloc
==
-
1
)
return
0
;
if
(
set
->
alloc
==
-
1
)
return
0
;
*
item
=
set
->
list
[
set
->
alloc
].
val
;
set
->
trace
=
set
->
list
[
set
->
alloc
].
alloc_next
;
*
item
=
set
->
list
[
set
->
alloc
].
val
;
set
->
trace
=
set
->
list
[
set
->
alloc
].
alloc_next
;
return
1
;
return
1
;
}
int
setNext
(
set_t
*
set
,
ITEM_TYPE
*
item
)
{
if
(
set
->
trace
==
-
1
)
return
0
;
*
item
=
set
->
list
[
set
->
trace
].
val
;
set
->
trace
=
set
->
list
[
set
->
trace
].
alloc_next
;
if
(
set
->
trace
==
-
1
)
return
0
;
*
item
=
set
->
list
[
set
->
trace
].
val
;
set
->
trace
=
set
->
list
[
set
->
trace
].
alloc_next
;
return
1
;
return
1
;
}
int
setDestroy
(
set_t
*
set
)
{
FREE
(
set
);
DRM
(
free
)(
set
,
sizeof
(
set_t
),
DRM_MEM_DRIVER
);
return
1
;
return
1
;
}
/*
...
...
@@ -165,54 +159,40 @@ int setDestroy(set_t *set)
#define ISFREE(bptr) ((bptr)->free)
#define PRINTF(fmt, arg...) do{}while(0)
#define fprintf(fmt, arg...) do{}while(0)
static
void
*
calloc
(
size_t
nmemb
,
size_t
size
)
{
void
*
addr
;
addr
=
kmalloc
(
nmemb
*
size
,
GFP_KERNEL
);
if
(
addr
)
memset
(
addr
,
0
,
nmemb
*
size
);
return
addr
;
}
#define free(n) kfree(n)
void
mmDumpMemInfo
(
memHeap_t
*
heap
)
memHeap_t
*
mmInit
(
int
ofs
,
int
size
)
{
TMemBlock
*
p
;
PRINTF
(
"Memory heap %p:
\n
"
,
heap
);
if
(
heap
==
0
)
{
PRINTF
(
" heap == 0
\n
"
);
}
else
{
p
=
(
TMemBlock
*
)
heap
;
while
(
p
)
{
PRINTF
(
" Offset:%08x, Size:%08x, %c%c
\n
"
,
p
->
ofs
,
p
->
size
,
p
->
free
?
'.'
:
'U'
,
p
->
reserved
?
'R'
:
'.'
);
p
=
p
->
next
;
}
}
PRINTF
(
"End of memory blocks
\n
"
);
PMemBlock
blocks
;
if
(
size
<=
0
)
return
0
;
blocks
=
(
TMemBlock
*
)
DRM
(
calloc
)(
1
,
sizeof
(
TMemBlock
),
DRM_MEM_DRIVER
);
if
(
blocks
!=
NULL
)
{
blocks
->
ofs
=
ofs
;
blocks
->
size
=
size
;
blocks
->
free
=
1
;
return
(
memHeap_t
*
)
blocks
;
}
else
return
0
;
}
memHeap_t
*
mmInit
(
int
ofs
,
int
size
)
/* Checks if a pointer 'b' is part of the heap 'heap' */
int
mmBlockInHeap
(
memHeap_t
*
heap
,
PMemBlock
b
)
{
PMemBlock
blocks
;
if
(
size
<=
0
)
{
return
0
;
}
blocks
=
(
TMemBlock
*
)
calloc
(
1
,
sizeof
(
TMemBlock
))
;
if
(
blocks
)
{
blocks
->
ofs
=
ofs
;
blocks
->
size
=
size
;
blocks
->
free
=
1
;
return
(
memHeap_t
*
)
blocks
;
}
else
return
0
;
TMemBlock
*
p
;
if
(
heap
==
NULL
||
b
==
NULL
)
return
0
;
p
=
heap
;
while
(
p
!=
NULL
&&
p
!=
b
)
{
p
=
p
->
next
;
}
if
(
p
==
b
)
return
1
;
else
return
0
;
}
/* Kludgey workaround for existing i810 server. Remove soon.
...
...
@@ -221,187 +201,186 @@ memHeap_t *mmAddRange( memHeap_t *heap,
int
ofs
,
int
size
)
{
PMemBlock
blocks
;
blocks
=
(
TMemBlock
*
)
calloc
(
2
,
sizeof
(
TMemBlock
));
if
(
blocks
)
{
blocks
[
0
].
size
=
size
;
blocks
[
0
].
free
=
1
;
blocks
[
0
].
ofs
=
ofs
;
blocks
[
0
].
next
=
&
blocks
[
1
];
/* Discontinuity - stops JoinBlock from trying to join non-adjacent
* ranges.
*/
blocks
[
1
].
size
=
0
;
blocks
[
1
].
free
=
0
;
blocks
[
1
].
ofs
=
ofs
+
size
;
blocks
[
1
].
next
=
(
PMemBlock
)
heap
;
return
(
memHeap_t
*
)
blocks
;
}
else
return
heap
;
PMemBlock
blocks
;
blocks
=
(
TMemBlock
*
)
DRM
(
calloc
)(
2
,
sizeof
(
TMemBlock
),
DRM_MEM_DRIVER
);
if
(
blocks
!=
NULL
)
{
blocks
[
0
].
size
=
size
;
blocks
[
0
].
free
=
1
;
blocks
[
0
].
ofs
=
ofs
;
blocks
[
0
].
next
=
&
blocks
[
1
];
/* Discontinuity - stops JoinBlock from trying to join
* non-adjacent ranges.
*/
blocks
[
1
].
size
=
0
;
blocks
[
1
].
free
=
0
;
blocks
[
1
].
ofs
=
ofs
+
size
;
blocks
[
1
].
next
=
(
PMemBlock
)
heap
;
return
(
memHeap_t
*
)
blocks
;
}
else
return
heap
;
}
static
TMemBlock
*
SliceBlock
(
TMemBlock
*
p
,
int
startofs
,
int
size
,
int
reserved
,
int
alignment
)
{
TMemBlock
*
newblock
;
/* break left */
if
(
startofs
>
p
->
ofs
)
{
newblock
=
(
TMemBlock
*
)
calloc
(
1
,
sizeof
(
TMemBlock
));
newblock
->
ofs
=
startofs
;
newblock
->
size
=
p
->
size
-
(
startofs
-
p
->
ofs
);
newblock
->
free
=
1
;
newblock
->
next
=
p
->
next
;
p
->
size
-=
newblock
->
size
;
p
->
next
=
newblock
;
p
=
newblock
;
}
/* break right */
if
(
size
<
p
->
size
)
{
newblock
=
(
TMemBlock
*
)
calloc
(
1
,
sizeof
(
TMemBlock
));
newblock
->
ofs
=
startofs
+
size
;
newblock
->
size
=
p
->
size
-
size
;
newblock
->
free
=
1
;
newblock
->
next
=
p
->
next
;
p
->
size
=
size
;
p
->
next
=
newblock
;
}
/* p = middle block */
p
->
align
=
alignment
;
p
->
free
=
0
;
p
->
reserved
=
reserved
;
return
p
;
TMemBlock
*
newblock
;
/* break left */
if
(
startofs
>
p
->
ofs
)
{
newblock
=
(
TMemBlock
*
)
DRM
(
calloc
)(
1
,
sizeof
(
TMemBlock
),
DRM_MEM_DRIVER
);
newblock
->
ofs
=
startofs
;
newblock
->
size
=
p
->
size
-
(
startofs
-
p
->
ofs
);
newblock
->
free
=
1
;
newblock
->
next
=
p
->
next
;
p
->
size
-=
newblock
->
size
;
p
->
next
=
newblock
;
p
=
newblock
;
}
/* break right */
if
(
size
<
p
->
size
)
{
newblock
=
(
TMemBlock
*
)
DRM
(
calloc
)(
1
,
sizeof
(
TMemBlock
),
DRM_MEM_DRIVER
);
newblock
->
ofs
=
startofs
+
size
;
newblock
->
size
=
p
->
size
-
size
;
newblock
->
free
=
1
;
newblock
->
next
=
p
->
next
;
p
->
size
=
size
;
p
->
next
=
newblock
;
}
/* p = middle block */
p
->
align
=
alignment
;
p
->
free
=
0
;
p
->
reserved
=
reserved
;
return
p
;
}
PMemBlock
mmAllocMem
(
memHeap_t
*
heap
,
int
size
,
int
align2
,
int
startSearch
)
{
int
mask
,
startofs
,
endofs
;
TMemBlock
*
p
;
if
(
!
heap
||
align2
<
0
||
size
<=
0
)
return
NULL
;
mask
=
(
1
<<
align2
)
-
1
;
startofs
=
0
;
p
=
(
TMemBlock
*
)
heap
;
while
(
p
)
{
if
(
ISFREE
(
p
))
{
startofs
=
(
p
->
ofs
+
mask
)
&
~
mask
;
if
(
startofs
<
startSearch
)
{
startofs
=
startSearch
;
}
endofs
=
startofs
+
size
;
if
(
endofs
<=
(
p
->
ofs
+
p
->
size
))
break
;
}
p
=
p
->
next
;
}
if
(
!
p
)
return
NULL
;
p
=
SliceBlock
(
p
,
startofs
,
size
,
0
,
mask
+
1
);
p
->
heap
=
heap
;
return
p
;
int
mask
,
startofs
,
endofs
;
TMemBlock
*
p
;
if
(
heap
==
NULL
||
align2
<
0
||
size
<=
0
)
return
NULL
;
mask
=
(
1
<<
align2
)
-
1
;
startofs
=
0
;
p
=
(
TMemBlock
*
)
heap
;
while
(
p
!=
NULL
)
{
if
(
ISFREE
(
p
))
{
startofs
=
(
p
->
ofs
+
mask
)
&
~
mask
;
if
(
startofs
<
startSearch
)
{
startofs
=
startSearch
;
}
endofs
=
startofs
+
size
;
if
(
endofs
<=
(
p
->
ofs
+
p
->
size
))
break
;
}
p
=
p
->
next
;
}
if
(
p
==
NULL
)
return
NULL
;
p
=
SliceBlock
(
p
,
startofs
,
size
,
0
,
mask
+
1
);
p
->
heap
=
heap
;
return
p
;
}
static
__inline__
int
Join2Blocks
(
TMemBlock
*
p
)
{
if
(
p
->
free
&&
p
->
next
&&
p
->
next
->
free
)
{
TMemBlock
*
q
=
p
->
next
;
p
->
size
+=
q
->
size
;
p
->
next
=
q
->
next
;
free
(
q
);
return
1
;
}
return
0
;
if
(
p
->
free
&&
p
->
next
&&
p
->
next
->
free
)
{
TMemBlock
*
q
=
p
->
next
;
p
->
size
+=
q
->
size
;
p
->
next
=
q
->
next
;
DRM
(
free
)(
q
,
sizeof
(
TMemBlock
),
DRM_MEM_DRIVER
);
return
1
;
}
return
0
;
}
int
mmFreeMem
(
PMemBlock
b
)
{
TMemBlock
*
p
,
*
prev
;
if
(
!
b
)
return
0
;
if
(
!
b
->
heap
)
{
fprintf
(
stderr
,
"no heap
\n
"
);
return
-
1
;
}
p
=
b
->
heap
;
prev
=
NULL
;
while
(
p
&&
p
!=
b
)
{
prev
=
p
;
p
=
p
->
next
;
}
if
(
!
p
||
p
->
free
||
p
->
reserved
)
{
if
(
!
p
)
fprintf
(
stderr
,
"block not found in heap
\n
"
);
else
if
(
p
->
free
)
fprintf
(
stderr
,
"block already free
\n
"
);
else
fprintf
(
stderr
,
"block is reserved
\n
"
);
return
-
1
;
}
p
->
free
=
1
;
Join2Blocks
(
p
);
if
(
prev
)
Join2Blocks
(
prev
);
return
0
;
TMemBlock
*
p
,
*
prev
;
if
(
b
==
NULL
)
return
0
;
if
(
b
->
heap
==
NULL
)
return
-
1
;
p
=
b
->
heap
;
prev
=
NULL
;
while
(
p
!=
NULL
&&
p
!=
b
)
{
prev
=
p
;
p
=
p
->
next
;
}
if
(
p
==
NULL
||
p
->
free
||
p
->
reserved
)
return
-
1
;
p
->
free
=
1
;
Join2Blocks
(
p
);
if
(
prev
)
Join2Blocks
(
prev
);
return
0
;
}
int
mmReserveMem
(
memHeap_t
*
heap
,
int
offset
,
int
size
)
{
int
endofs
;
TMemBlock
*
p
;
if
(
!
heap
||
size
<=
0
)
return
-
1
;
endofs
=
offset
+
size
;
p
=
(
TMemBlock
*
)
heap
;
while
(
p
&&
p
->
ofs
<=
offset
)
{
if
(
ISFREE
(
p
)
&&
endofs
<=
(
p
->
ofs
+
p
->
size
))
{
SliceBlock
(
p
,
offset
,
size
,
1
,
1
);
return
0
;
}
p
=
p
->
next
;
}
return
-
1
;
int
endofs
;
TMemBlock
*
p
;
if
(
heap
==
NULL
||
size
<=
0
)
return
-
1
;
endofs
=
offset
+
size
;
p
=
(
TMemBlock
*
)
heap
;
while
(
p
&&
p
->
ofs
<=
offset
)
{
if
(
ISFREE
(
p
)
&&
endofs
<=
(
p
->
ofs
+
p
->
size
))
{
SliceBlock
(
p
,
offset
,
size
,
1
,
1
);
return
0
;
}
p
=
p
->
next
;
}
return
-
1
;
}
int
mmFreeReserved
(
memHeap_t
*
heap
,
int
offset
)
{
TMemBlock
*
p
,
*
prev
;
if
(
!
heap
)
return
-
1
;
p
=
(
TMemBlock
*
)
heap
;
prev
=
NULL
;
while
(
p
&&
p
->
ofs
!=
offset
)
{
prev
=
p
;
p
=
p
->
next
;
}
if
(
!
p
||
!
p
->
reserved
)
return
-
1
;
p
->
free
=
1
;
p
->
reserved
=
0
;
Join2Blocks
(
p
);
if
(
prev
)
Join2Blocks
(
prev
);
return
0
;
TMemBlock
*
p
,
*
prev
;
if
(
heap
==
NULL
)
return
-
1
;
p
=
(
TMemBlock
*
)
heap
;
prev
=
NULL
;
while
(
p
!=
NULL
&&
p
->
ofs
!=
offset
)
{
prev
=
p
;
p
=
p
->
next
;
}
if
(
p
==
NULL
||
!
p
->
reserved
)
return
-
1
;
p
->
free
=
1
;
p
->
reserved
=
0
;
Join2Blocks
(
p
);
if
(
prev
!=
NULL
)
Join2Blocks
(
prev
);
return
0
;
}
void
mmDestroy
(
memHeap_t
*
heap
)
{
TMemBlock
*
p
,
*
q
;
if
(
!
heap
)
return
;
p
=
(
TMemBlock
*
)
heap
;
while
(
p
)
{
q
=
p
->
next
;
free
(
p
);
p
=
q
;
}
TMemBlock
*
p
,
*
q
;
if
(
heap
==
NULL
)
return
;
p
=
(
TMemBlock
*
)
heap
;
while
(
p
!=
NULL
)
{
q
=
p
->
next
;
DRM
(
free
)(
p
,
sizeof
(
TMemBlock
),
DRM_MEM_DRIVER
);
p
=
q
;
}
}
drivers/char/drm/sis_ds.h
View file @
da501825
...
...
@@ -28,27 +28,25 @@
*
*/
#ifndef _
sis_ds_h
_
#define _
sis_ds_h
_
#ifndef _
_SIS_DS_H_
_
#define _
_SIS_DS_H_
_
/* Set Data Structure */
#define SET_SIZE 5000
#define MALLOC(s) kmalloc(s, GFP_KERNEL)
#define FREE(s) kfree(s)
typedef
unsigned
int
ITEM_TYPE
;
typedef
struct
{
ITEM_TYPE
val
;
int
alloc_next
,
free_next
;
ITEM_TYPE
val
;
int
alloc_next
,
free_next
;
}
list_item_t
;
typedef
struct
{
int
alloc
;
int
free
;
int
trace
;
list_item_t
list
[
SET_SIZE
];
int
alloc
;
int
free
;
int
trace
;
list_item_t
list
[
SET_SIZE
];
}
set_t
;
set_t
*
setInit
(
void
);
...
...
@@ -58,8 +56,6 @@ int setFirst(set_t *set, ITEM_TYPE *item);
int
setNext
(
set_t
*
set
,
ITEM_TYPE
*
item
);
int
setDestroy
(
set_t
*
set
);
#endif
/*
* GLX Hardware Device Driver common code
* Copyright (C) 1999 Keith Whitwell
...
...
@@ -84,16 +80,13 @@ int setDestroy(set_t *set);
*
*/
#ifndef MM_INC
#define MM_INC
struct
mem_block_t
{
struct
mem_block_t
*
next
;
struct
mem_block_t
*
heap
;
int
ofs
,
size
;
int
align
;
int
free
:
1
;
int
reserved
:
1
;
struct
mem_block_t
*
next
;
struct
mem_block_t
*
heap
;
int
ofs
,
size
;
int
align
;
int
free
:
1
;
int
reserved
:
1
;
};
typedef
struct
mem_block_t
TMemBlock
;
typedef
struct
mem_block_t
*
PMemBlock
;
...
...
@@ -102,13 +95,19 @@ typedef struct mem_block_t *PMemBlock;
typedef
struct
mem_block_t
memHeap_t
;
static
__inline__
int
mmBlockSize
(
PMemBlock
b
)
{
return
b
->
size
;
}
{
return
b
->
size
;
}
static
__inline__
int
mmOffset
(
PMemBlock
b
)
{
return
b
->
ofs
;
}
{
return
b
->
ofs
;
}
static
__inline__
void
mmMarkReserved
(
PMemBlock
b
)
{
b
->
reserved
=
1
;
}
{
b
->
reserved
=
1
;
}
/*
* input: total size in bytes
...
...
@@ -116,13 +115,10 @@ static __inline__ void mmMarkReserved(PMemBlock b)
*/
memHeap_t
*
mmInit
(
int
ofs
,
int
size
);
memHeap_t
*
mmAddRange
(
memHeap_t
*
heap
,
int
ofs
,
int
size
);
/*
* Allocate 'size' bytes with 2^align2 bytes alignment,
* restrict the search to free memory after 'startSearch'
...
...
@@ -133,14 +129,19 @@ memHeap_t *mmAddRange( memHeap_t *heap,
* startSearch = linear offset from start of heap to begin search
* return: pointer to the allocated block, 0 if error
*/
PMemBlock
mmAllocMem
(
memHeap_t
*
heap
,
int
size
,
int
align2
,
int
startSearch
);
PMemBlock
mmAllocMem
(
memHeap_t
*
heap
,
int
size
,
int
align2
,
int
startSearch
);
/*
* Returns 1 if the block 'b' is part of the heap 'heap'
*/
int
mmBlockInHeap
(
PMemBlock
heap
,
PMemBlock
b
);
/*
* Free block starts at offset
* input: pointer to a block
* return: 0 if OK, -1 if error
*/
int
mmFreeMem
(
PMemBlock
b
);
int
mmFreeMem
(
PMemBlock
b
);
/*
* Reserve 'size' bytes block start at offset
...
...
@@ -160,4 +161,4 @@ void mmDestroy( memHeap_t *mmInit );
/* For debuging purpose. */
void
mmDumpMemInfo
(
memHeap_t
*
mmInit
);
#endif
#endif
/* __SIS_DS_H__ */
drivers/char/drm/sis_mm.c
View file @
da501825
...
...
@@ -28,232 +28,328 @@
*
*/
#include <linux/config.h>
#include "sis.h"
#include "video/sisfb.h"
#include "drmP.h"
#include "sis_drm.h"
#include "sis_drv.h"
#include "sis_ds.h"
#if defined(__linux__) && defined(CONFIG_FB_SIS)
#include <linux/sisfb.h>
#endif
#define MAX_CONTEXT 100
#define VIDEO_TYPE 0
#define AGP_TYPE 1
typedef
struct
{
int
used
;
int
context
;
set_t
*
sets
[
2
];
/* 0 for video, 1 for AGP */
int
used
;
int
context
;
set_t
*
sets
[
2
];
/* 0 for video, 1 for AGP */
}
sis_context_t
;
static
sis_context_t
global_ppriv
[
MAX_CONTEXT
];
static
int
add_alloc_set
(
int
context
,
int
type
,
unsigned
int
val
)
{
int
i
,
retval
=
0
;
for
(
i
=
0
;
i
<
MAX_CONTEXT
;
i
++
)
if
(
global_ppriv
[
i
].
used
&&
global_ppriv
[
i
].
context
==
context
){
retval
=
setAdd
(
global_ppriv
[
i
].
sets
[
type
],
val
);
break
;
}
return
retval
;
int
i
,
retval
=
0
;
for
(
i
=
0
;
i
<
MAX_CONTEXT
;
i
++
)
{
if
(
global_ppriv
[
i
].
used
&&
global_ppriv
[
i
].
context
==
context
)
{
retval
=
setAdd
(
global_ppriv
[
i
].
sets
[
type
],
val
);
break
;
}
}
return
retval
;
}
static
int
del_alloc_set
(
int
context
,
int
type
,
unsigned
int
val
)
{
int
i
,
retval
=
0
;
for
(
i
=
0
;
i
<
MAX_CONTEXT
;
i
++
)
if
(
global_ppriv
[
i
].
used
&&
global_ppriv
[
i
].
context
==
context
){
retval
=
setDel
(
global_ppriv
[
i
].
sets
[
type
],
val
);
break
;
}
return
retval
;
int
i
,
retval
=
0
;
for
(
i
=
0
;
i
<
MAX_CONTEXT
;
i
++
)
{
if
(
global_ppriv
[
i
].
used
&&
global_ppriv
[
i
].
context
==
context
)
{
retval
=
setDel
(
global_ppriv
[
i
].
sets
[
type
],
val
);
break
;
}
}
return
retval
;
}
/* fb management via fb device */
#if
1
int
sis_fb_alloc
(
struct
inode
*
inode
,
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
)
#if
defined(__linux__) && defined(CONFIG_FB_SIS)
int
sis_fb_init
(
DRM_IOCTL_ARGS
)
{
drm_sis_mem_t
fb
;
struct
sis_memreq
req
;
int
retval
=
0
;
if
(
copy_from_user
(
&
fb
,
(
drm_sis_mem_t
*
)
arg
,
sizeof
(
fb
)))
return
-
EFAULT
;
req
.
size
=
fb
.
size
;
sis_malloc
(
&
req
);
if
(
req
.
offset
){
/* TODO */
fb
.
offset
=
req
.
offset
;
fb
.
free
=
req
.
offset
;
if
(
!
add_alloc_set
(
fb
.
context
,
VIDEO_TYPE
,
fb
.
free
)){
DRM_DEBUG
(
"adding to allocation set fails
\n
"
);
sis_free
(
req
.
offset
);
retval
=
-
1
;
}
}
else
{
fb
.
offset
=
0
;
fb
.
size
=
0
;
fb
.
free
=
0
;
}
if
(
copy_to_user
((
drm_sis_mem_t
*
)
arg
,
&
fb
,
sizeof
(
fb
)))
return
-
EFAULT
;
return
0
;
}
int
sis_fb_alloc
(
DRM_IOCTL_ARGS
)
{
drm_sis_mem_t
fb
;
struct
sis_memreq
req
;
int
retval
=
0
;
DRM_COPY_FROM_USER_IOCTL
(
fb
,
(
drm_sis_mem_t
*
)
data
,
sizeof
(
fb
));
req
.
size
=
fb
.
size
;
sis_malloc
(
&
req
);
if
(
req
.
offset
)
{
/* TODO */
fb
.
offset
=
req
.
offset
;
fb
.
free
=
req
.
offset
;
if
(
!
add_alloc_set
(
fb
.
context
,
VIDEO_TYPE
,
fb
.
free
))
{
DRM_DEBUG
(
"adding to allocation set fails
\n
"
);
sis_free
(
req
.
offset
);
retval
=
DRM_ERR
(
EINVAL
);
}
}
else
{
fb
.
offset
=
0
;
fb
.
size
=
0
;
fb
.
free
=
0
;
}
DRM_DEBUG
(
"alloc fb, size = %d, offset = %ld
\n
"
,
fb
.
size
,
req
.
offset
);
DRM_COPY_TO_USER_IOCTL
((
drm_sis_mem_t
*
)
data
,
fb
,
sizeof
(
fb
)
);
return
retval
;
DRM_DEBUG
(
"alloc fb, size = %d, offset = %ld
\n
"
,
fb
.
size
,
req
.
offset
);
return
retval
;
}
int
sis_fb_free
(
struct
inode
*
inode
,
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
)
int
sis_fb_free
(
DRM_IOCTL_ARGS
)
{
drm_sis_mem_t
fb
;
int
retval
=
0
;
if
(
copy_from_user
(
&
fb
,
(
drm_sis_mem_t
*
)
arg
,
sizeof
(
fb
)))
return
-
EFAULT
;
if
(
!
fb
.
free
){
return
-
1
;
}
drm_sis_mem_t
fb
;
int
retval
=
0
;
sis_free
(
fb
.
free
);
if
(
!
del_alloc_set
(
fb
.
context
,
VIDEO_TYPE
,
fb
.
free
))
retval
=
-
1
;
DRM_COPY_FROM_USER_IOCTL
(
fb
,
(
drm_sis_mem_t
*
)
data
,
sizeof
(
fb
));
DRM_DEBUG
(
"free fb, offset = %d
\n
"
,
fb
.
free
);
return
retval
;
if
(
!
fb
.
free
)
return
DRM_ERR
(
EINVAL
);
if
(
!
del_alloc_set
(
fb
.
context
,
VIDEO_TYPE
,
fb
.
free
))
retval
=
DRM_ERR
(
EINVAL
);
sis_free
(
fb
.
free
);
DRM_DEBUG
(
"free fb, offset = %d
\n
"
,
fb
.
free
);
return
retval
;
}
#else
int
sis_fb_alloc
(
struct
inode
*
inode
,
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
)
/* Called by the X Server to initialize the FB heap. Allocations will fail
* unless this is called. Offset is the beginning of the heap from the
* framebuffer offset (MaxXFBMem in XFree86).
*
* Memory layout according to Thomas Winischofer:
* |------------------|DDDDDDDDDDDDDDDDDDDDDDDDDDDDD|HHHH|CCCCCCCCCCC|
*
* X driver/sisfb HW- Command-
* framebuffer memory DRI heap Cursor queue
*/
int
sis_fb_init
(
DRM_IOCTL_ARGS
)
{
return
-
1
;
DRM_DEVICE
;
drm_sis_private_t
*
dev_priv
=
dev
->
dev_private
;
drm_sis_fb_t
fb
;
DRM_COPY_FROM_USER_IOCTL
(
fb
,
(
drm_sis_fb_t
*
)
data
,
sizeof
(
fb
));
if
(
dev_priv
==
NULL
)
{
dev
->
dev_private
=
DRM
(
calloc
)(
1
,
sizeof
(
drm_sis_private_t
),
DRM_MEM_DRIVER
);
dev_priv
=
dev
->
dev_private
;
if
(
dev_priv
==
NULL
)
return
ENOMEM
;
}
if
(
dev_priv
->
FBHeap
!=
NULL
)
return
DRM_ERR
(
EINVAL
);
dev_priv
->
FBHeap
=
mmInit
(
fb
.
offset
,
fb
.
size
);
DRM_DEBUG
(
"offset = %u, size = %u"
,
fb
.
offset
,
fb
.
size
);
return
0
;
}
int
sis_fb_free
(
struct
inode
*
inode
,
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
)
int
sis_fb_alloc
(
DRM_IOCTL_ARGS
)
{
return
0
;
DRM_DEVICE
;
drm_sis_private_t
*
dev_priv
=
dev
->
dev_private
;
drm_sis_mem_t
fb
;
PMemBlock
block
;
int
retval
=
0
;
if
(
dev_priv
==
NULL
||
dev_priv
->
FBHeap
==
NULL
)
return
DRM_ERR
(
EINVAL
);
DRM_COPY_FROM_USER_IOCTL
(
fb
,
(
drm_sis_mem_t
*
)
data
,
sizeof
(
fb
));
block
=
mmAllocMem
(
dev_priv
->
FBHeap
,
fb
.
size
,
0
,
0
);
if
(
block
)
{
/* TODO */
fb
.
offset
=
block
->
ofs
;
fb
.
free
=
(
unsigned
long
)
block
;
if
(
!
add_alloc_set
(
fb
.
context
,
VIDEO_TYPE
,
fb
.
free
))
{
DRM_DEBUG
(
"adding to allocation set fails
\n
"
);
mmFreeMem
((
PMemBlock
)
fb
.
free
);
retval
=
DRM_ERR
(
EINVAL
);
}
}
else
{
fb
.
offset
=
0
;
fb
.
size
=
0
;
fb
.
free
=
0
;
}
DRM_COPY_TO_USER_IOCTL
((
drm_sis_mem_t
*
)
data
,
fb
,
sizeof
(
fb
));
DRM_DEBUG
(
"alloc fb, size = %d, offset = %d
\n
"
,
fb
.
size
,
fb
.
offset
);
return
retval
;
}
int
sis_fb_free
(
DRM_IOCTL_ARGS
)
{
DRM_DEVICE
;
drm_sis_private_t
*
dev_priv
=
dev
->
dev_private
;
drm_sis_mem_t
fb
;
if
(
dev_priv
==
NULL
||
dev_priv
->
FBHeap
==
NULL
)
return
DRM_ERR
(
EINVAL
);
DRM_COPY_FROM_USER_IOCTL
(
fb
,
(
drm_sis_mem_t
*
)
data
,
sizeof
(
fb
));
if
(
!
mmBlockInHeap
(
dev_priv
->
FBHeap
,
(
PMemBlock
)
fb
.
free
))
return
DRM_ERR
(
EINVAL
);
if
(
!
del_alloc_set
(
fb
.
context
,
VIDEO_TYPE
,
fb
.
free
))
return
DRM_ERR
(
EINVAL
);
mmFreeMem
((
PMemBlock
)
fb
.
free
);
DRM_DEBUG
(
"free fb, free = 0x%lx
\n
"
,
fb
.
free
);
return
0
;
}
#endif
/* agp memory management */
#if 1
static
memHeap_t
*
AgpHeap
=
NULL
;
int
sisp_agp_init
(
struct
inode
*
inode
,
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
)
int
sis_ioctl_agp_init
(
DRM_IOCTL_ARGS
)
{
drm_sis_agp_t
agp
;
if
(
copy_from_user
(
&
agp
,
(
drm_sis_agp_t
*
)
arg
,
sizeof
(
agp
)))
return
-
EFAULT
;
DRM_DEVICE
;
drm_sis_private_t
*
dev_priv
=
dev
->
dev_private
;
drm_sis_agp_t
agp
;
if
(
dev_priv
==
NULL
)
{
dev
->
dev_private
=
DRM
(
calloc
)(
1
,
sizeof
(
drm_sis_private_t
),
DRM_MEM_DRIVER
);
dev_priv
=
dev
->
dev_private
;
if
(
dev_priv
==
NULL
)
return
ENOMEM
;
}
if
(
dev_priv
->
AGPHeap
!=
NULL
)
return
DRM_ERR
(
EINVAL
);
DRM_COPY_FROM_USER_IOCTL
(
agp
,
(
drm_sis_agp_t
*
)
data
,
sizeof
(
agp
));
Agp
Heap
=
mmInit
(
agp
.
offset
,
agp
.
size
);
dev_priv
->
AGP
Heap
=
mmInit
(
agp
.
offset
,
agp
.
size
);
DRM_DEBUG
(
"offset = %u, size = %u"
,
agp
.
offset
,
agp
.
size
);
DRM_DEBUG
(
"offset = %u, size = %u"
,
agp
.
offset
,
agp
.
size
);
return
0
;
return
0
;
}
int
sisp_agp_alloc
(
struct
inode
*
inode
,
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
)
int
sis_ioctl_agp_alloc
(
DRM_IOCTL_ARGS
)
{
drm_sis_mem_t
agp
;
PMemBlock
block
;
int
retval
=
0
;
DRM_DEVICE
;
drm_sis_private_t
*
dev_priv
=
dev
->
dev_private
;
drm_sis_mem_t
agp
;
PMemBlock
block
;
int
retval
=
0
;
if
(
!
AgpHeap
)
return
-
1
;
if
(
dev_priv
==
NULL
||
dev_priv
->
AGPHeap
==
NULL
)
return
DRM_ERR
(
EINVAL
)
;
if
(
copy_from_user
(
&
agp
,
(
drm_sis_mem_t
*
)
arg
,
sizeof
(
agp
)))
return
-
EFAULT
;
DRM_COPY_FROM_USER_IOCTL
(
agp
,
(
drm_sis_mem_t
*
)
data
,
sizeof
(
agp
));
block
=
mmAllocMem
(
AgpHeap
,
agp
.
size
,
0
,
0
);
if
(
block
){
/* TODO */
agp
.
offset
=
block
->
ofs
;
agp
.
free
=
(
unsigned
long
)
block
;
if
(
!
add_alloc_set
(
agp
.
context
,
AGP_TYPE
,
agp
.
free
)){
DRM_DEBUG
(
"adding to allocation set fails
\n
"
);
mmFreeMem
((
PMemBlock
)(
unsigned
long
)
agp
.
free
);
retval
=
-
1
;
}
}
else
{
agp
.
offset
=
0
;
agp
.
size
=
0
;
agp
.
free
=
0
;
}
if
(
copy_to_user
((
drm_sis_mem_t
*
)
arg
,
&
agp
,
sizeof
(
agp
)))
return
-
EFAULT
;
block
=
mmAllocMem
(
dev_priv
->
AGPHeap
,
agp
.
size
,
0
,
0
);
if
(
block
)
{
/* TODO */
agp
.
offset
=
block
->
ofs
;
agp
.
free
=
(
unsigned
long
)
block
;
if
(
!
add_alloc_set
(
agp
.
context
,
AGP_TYPE
,
agp
.
free
))
{
DRM_DEBUG
(
"adding to allocation set fails
\n
"
);
mmFreeMem
((
PMemBlock
)
agp
.
free
);
retval
=
-
1
;
}
}
else
{
agp
.
offset
=
0
;
agp
.
size
=
0
;
agp
.
free
=
0
;
}
DRM_DEBUG
(
"alloc agp, size = %d, offset = %d
\n
"
,
agp
.
size
,
agp
.
offset
);
DRM_COPY_TO_USER_IOCTL
((
drm_sis_mem_t
*
)
data
,
agp
,
sizeof
(
agp
)
);
return
retval
;
DRM_DEBUG
(
"alloc agp, size = %d, offset = %d
\n
"
,
agp
.
size
,
agp
.
offset
);
return
retval
;
}
int
sisp_agp_free
(
struct
inode
*
inode
,
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
)
int
sis_ioctl_agp_free
(
DRM_IOCTL_ARGS
)
{
drm_sis_mem_t
agp
;
int
retval
=
0
;
if
(
!
AgpHeap
)
return
-
1
;
if
(
copy_from_user
(
&
agp
,
(
drm_sis_mem_t
*
)
arg
,
sizeof
(
agp
)))
return
-
EFAULT
;
if
(
!
agp
.
free
){
return
-
1
;
}
DRM_DEVICE
;
drm_sis_private_t
*
dev_priv
=
dev
->
dev_private
;
drm_sis_mem_t
agp
;
mmFreeMem
((
PMemBlock
)(
unsigned
long
)
agp
.
free
);
if
(
!
del_alloc_set
(
agp
.
context
,
AGP_TYPE
,
agp
.
free
))
retval
=
-
1
;
if
(
dev_priv
==
NULL
||
dev_priv
->
AGPHeap
==
NULL
)
return
DRM_ERR
(
EINVAL
);
DRM_DEBUG
(
"free agp, free = %d
\n
"
,
agp
.
free
);
return
retval
;
}
DRM_COPY_FROM_USER_IOCTL
(
agp
,
(
drm_sis_mem_t
*
)
data
,
sizeof
(
agp
));
#endif
if
(
!
mmBlockInHeap
(
dev_priv
->
AGPHeap
,
(
PMemBlock
)
agp
.
free
))
return
DRM_ERR
(
EINVAL
);
mmFreeMem
((
PMemBlock
)
agp
.
free
);
if
(
!
del_alloc_set
(
agp
.
context
,
AGP_TYPE
,
agp
.
free
))
return
DRM_ERR
(
EINVAL
);
DRM_DEBUG
(
"free agp, free = 0x%lx
\n
"
,
agp
.
free
);
return
0
;
}
int
sis_init_context
(
int
context
)
{
int
i
;
for
(
i
=
0
;
i
<
MAX_CONTEXT
;
i
++
)
if
(
global_ppriv
[
i
].
used
&&
(
global_ppriv
[
i
].
context
==
context
))
break
;
if
(
i
>=
MAX_CONTEXT
){
for
(
i
=
0
;
i
<
MAX_CONTEXT
;
i
++
){
if
(
!
global_ppriv
[
i
].
used
){
global_ppriv
[
i
].
context
=
context
;
global_ppriv
[
i
].
used
=
1
;
global_ppriv
[
i
].
sets
[
0
]
=
setInit
();
global_ppriv
[
i
].
sets
[
1
]
=
setInit
();
DRM_DEBUG
(
"init allocation set, socket=%d, context = %d
\n
"
,
i
,
context
);
break
;
}
}
if
((
i
>=
MAX_CONTEXT
)
||
(
global_ppriv
[
i
].
sets
[
0
]
==
NULL
)
||
(
global_ppriv
[
i
].
sets
[
1
]
==
NULL
)){
return
0
;
}
for
(
i
=
0
;
i
<
MAX_CONTEXT
;
i
++
)
{
if
(
global_ppriv
[
i
].
used
&&
(
global_ppriv
[
i
].
context
==
context
))
break
;
}
if
(
i
>=
MAX_CONTEXT
)
{
for
(
i
=
0
;
i
<
MAX_CONTEXT
;
i
++
)
{
if
(
!
global_ppriv
[
i
].
used
)
{
global_ppriv
[
i
].
context
=
context
;
global_ppriv
[
i
].
used
=
1
;
global_ppriv
[
i
].
sets
[
0
]
=
setInit
();
global_ppriv
[
i
].
sets
[
1
]
=
setInit
();
DRM_DEBUG
(
"init allocation set, socket=%d, "
"context = %d
\n
"
,
i
,
context
);
break
;
}
}
if
((
i
>=
MAX_CONTEXT
)
||
(
global_ppriv
[
i
].
sets
[
0
]
==
NULL
)
||
(
global_ppriv
[
i
].
sets
[
1
]
==
NULL
))
{
return
0
;
}
}
return
1
;
...
...
@@ -263,45 +359,45 @@ int sis_final_context(int context)
{
int
i
;
for
(
i
=
0
;
i
<
MAX_CONTEXT
;
i
++
)
if
(
global_ppriv
[
i
].
used
&&
(
global_ppriv
[
i
].
context
==
context
))
break
;
if
(
i
<
MAX_CONTEXT
){
set_t
*
set
;
unsigned
int
item
;
int
retval
;
DRM_DEBUG
(
"find socket %d, context = %d
\n
"
,
i
,
context
);
/* Video Memory */
set
=
global_ppriv
[
i
].
sets
[
0
];
retval
=
setFirst
(
set
,
&
item
);
while
(
retval
){
DRM_DEBUG
(
"free video memory 0x%x
\n
"
,
item
);
sis_free
(
item
);
retval
=
setNext
(
set
,
&
item
);
}
setDestroy
(
set
);
/* AGP Memory */
set
=
global_ppriv
[
i
].
sets
[
1
];
retval
=
setFirst
(
set
,
&
item
);
while
(
retval
){
DRM_DEBUG
(
"free agp memory 0x%x
\n
"
,
item
);
mmFreeMem
((
PMemBlock
)(
unsigned
long
)
item
);
retval
=
setNext
(
set
,
&
item
);
}
setDestroy
(
set
);
global_ppriv
[
i
].
used
=
0
;
}
for
(
i
=
0
;
i
<
MAX_CONTEXT
;
i
++
)
{
if
(
global_ppriv
[
i
].
used
&&
(
global_ppriv
[
i
].
context
==
context
))
break
;
}
/* turn-off auto-flip */
/* TODO */
#if defined(SIS_STEREO)
flip_final
();
if
(
i
<
MAX_CONTEXT
)
{
set_t
*
set
;
unsigned
int
item
;
int
retval
;
DRM_DEBUG
(
"find socket %d, context = %d
\n
"
,
i
,
context
);
/* Video Memory */
set
=
global_ppriv
[
i
].
sets
[
0
];
retval
=
setFirst
(
set
,
&
item
);
while
(
retval
)
{
DRM_DEBUG
(
"free video memory 0x%x
\n
"
,
item
);
#if defined(__linux__) && defined(CONFIG_FB_SIS)
sis_free
(
item
);
#else
mmFreeMem
((
PMemBlock
)
item
);
#endif
retval
=
setNext
(
set
,
&
item
);
}
setDestroy
(
set
);
/* AGP Memory */
set
=
global_ppriv
[
i
].
sets
[
1
];
retval
=
setFirst
(
set
,
&
item
);
while
(
retval
)
{
DRM_DEBUG
(
"free agp memory 0x%x
\n
"
,
item
);
mmFreeMem
((
PMemBlock
)
item
);
retval
=
setNext
(
set
,
&
item
);
}
setDestroy
(
set
);
global_ppriv
[
i
].
used
=
0
;
}
return
1
;
}
include/asm-alpha/mman.h
View file @
da501825
...
...
@@ -6,6 +6,8 @@
#define PROT_EXEC 0x4
/* page can be executed */
#define PROT_SEM 0x8
/* page may be used for atomic ops */
#define PROT_NONE 0x0
/* page can not be accessed */
#define PROT_GROWSDOWN 0x01000000
/* mprotect flag: extend change to start of growsdown vma */
#define PROT_GROWSUP 0x02000000
/* mprotect flag: extend change to end of growsup vma */
#define MAP_SHARED 0x01
/* Share changes */
#define MAP_PRIVATE 0x02
/* Changes are private */
...
...
include/asm-arm/mman.h
View file @
da501825
...
...
@@ -6,6 +6,8 @@
#define PROT_EXEC 0x4
/* page can be executed */
#define PROT_SEM 0x8
/* page may be used for atomic ops */
#define PROT_NONE 0x0
/* page can not be accessed */
#define PROT_GROWSDOWN 0x01000000
/* mprotect flag: extend change to start of growsdown vma */
#define PROT_GROWSUP 0x02000000
/* mprotect flag: extend change to end of growsup vma */
#define MAP_SHARED 0x01
/* Share changes */
#define MAP_PRIVATE 0x02
/* Changes are private */
...
...
include/asm-arm26/mman.h
View file @
da501825
...
...
@@ -6,6 +6,8 @@
#define PROT_EXEC 0x4
/* page can be executed */
#define PROT_SEM 0x8
/* page may be used for atomic ops */
#define PROT_NONE 0x0
/* page can not be accessed */
#define PROT_GROWSDOWN 0x01000000
/* mprotect flag: extend change to start of growsdown vma */
#define PROT_GROWSUP 0x02000000
/* mprotect flag: extend change to end of growsup vma */
#define MAP_SHARED 0x01
/* Share changes */
#define MAP_PRIVATE 0x02
/* Changes are private */
...
...
include/asm-cris/mman.h
View file @
da501825
...
...
@@ -8,6 +8,8 @@
#define PROT_EXEC 0x4
/* page can be executed */
#define PROT_SEM 0x8
/* page may be used for atomic ops */
#define PROT_NONE 0x0
/* page can not be accessed */
#define PROT_GROWSDOWN 0x01000000
/* mprotect flag: extend change to start of growsdown vma */
#define PROT_GROWSUP 0x02000000
/* mprotect flag: extend change to end of growsup vma */
#define MAP_SHARED 0x01
/* Share changes */
#define MAP_PRIVATE 0x02
/* Changes are private */
...
...
include/asm-h8300/mman.h
View file @
da501825
...
...
@@ -5,6 +5,8 @@
#define PROT_WRITE 0x2
/* page can be written */
#define PROT_EXEC 0x4
/* page can be executed */
#define PROT_NONE 0x0
/* page can not be accessed */
#define PROT_GROWSDOWN 0x01000000
/* mprotect flag: extend change to start of growsdown vma */
#define PROT_GROWSUP 0x02000000
/* mprotect flag: extend change to end of growsup vma */
#define MAP_SHARED 0x01
/* Share changes */
#define MAP_PRIVATE 0x02
/* Changes are private */
...
...
include/asm-i386/mman.h
View file @
da501825
...
...
@@ -6,6 +6,10 @@
#define PROT_EXEC 0x4
/* page can be executed */
#define PROT_SEM 0x8
/* page may be used for atomic ops */
#define PROT_NONE 0x0
/* page can not be accessed */
#define PROT_GROWSDOWN 0x01000000
/* mprotect flag: extend change to start of growsdown vma */
#define PROT_GROWSUP 0x02000000
/* mprotect flag: extend change to end of growsup vma */
#define PROT_GROWSDOWN 0x01000000
/* mprotect flag: extend change to start of growsdown vma */
#define PROT_GROWSUP 0x02000000
/* mprotect flag: extend change to end of growsup vma */
#define MAP_SHARED 0x01
/* Share changes */
#define MAP_PRIVATE 0x02
/* Changes are private */
...
...
include/asm-ia64/mman.h
View file @
da501825
...
...
@@ -11,6 +11,8 @@
#define PROT_EXEC 0x4
/* page can be executed */
#define PROT_SEM 0x8
/* page may be used for atomic ops */
#define PROT_NONE 0x0
/* page can not be accessed */
#define PROT_GROWSDOWN 0x01000000
/* mprotect flag: extend change to start of growsdown vma */
#define PROT_GROWSUP 0x02000000
/* mprotect flag: extend change to end of growsup vma */
#define MAP_SHARED 0x01
/* Share changes */
#define MAP_PRIVATE 0x02
/* Changes are private */
...
...
include/asm-m68k/mman.h
View file @
da501825
...
...
@@ -6,6 +6,8 @@
#define PROT_EXEC 0x4
/* page can be executed */
#define PROT_SEM 0x8
/* page may be used for atomic ops */
#define PROT_NONE 0x0
/* page can not be accessed */
#define PROT_GROWSDOWN 0x01000000
/* mprotect flag: extend change to start of growsdown vma */
#define PROT_GROWSUP 0x02000000
/* mprotect flag: extend change to end of growsup vma */
#define MAP_SHARED 0x01
/* Share changes */
#define MAP_PRIVATE 0x02
/* Changes are private */
...
...
include/asm-mips/mman.h
View file @
da501825
...
...
@@ -20,6 +20,8 @@
#define PROT_EXEC 0x04
/* page can be executed */
/* 0x08 reserved for PROT_EXEC_NOFLUSH */
#define PROT_SEM 0x10
/* page may be used for atomic ops */
#define PROT_GROWSDOWN 0x01000000
/* mprotect flag: extend change to start of growsdown vma */
#define PROT_GROWSUP 0x02000000
/* mprotect flag: extend change to end of growsup vma */
/*
* Flags for mmap
...
...
include/asm-parisc/mman.h
View file @
da501825
...
...
@@ -6,6 +6,8 @@
#define PROT_EXEC 0x4
/* page can be executed */
#define PROT_SEM 0x8
/* page may be used for atomic ops */
#define PROT_NONE 0x0
/* page can not be accessed */
#define PROT_GROWSDOWN 0x01000000
/* mprotect flag: extend change to start of growsdown vma */
#define PROT_GROWSUP 0x02000000
/* mprotect flag: extend change to end of growsup vma */
#define MAP_SHARED 0x01
/* Share changes */
#define MAP_PRIVATE 0x02
/* Changes are private */
...
...
include/asm-ppc/mman.h
View file @
da501825
...
...
@@ -6,6 +6,8 @@
#define PROT_EXEC 0x4
/* page can be executed */
#define PROT_SEM 0x8
/* page may be used for atomic ops */
#define PROT_NONE 0x0
/* page can not be accessed */
#define PROT_GROWSDOWN 0x01000000
/* mprotect flag: extend change to start of growsdown vma */
#define PROT_GROWSUP 0x02000000
/* mprotect flag: extend change to end of growsup vma */
#define MAP_SHARED 0x01
/* Share changes */
#define MAP_PRIVATE 0x02
/* Changes are private */
...
...
include/asm-ppc64/mman.h
View file @
da501825
...
...
@@ -13,6 +13,8 @@
#define PROT_EXEC 0x4
/* page can be executed */
#define PROT_SEM 0x8
/* page may be used for atomic ops */
#define PROT_NONE 0x0
/* page can not be accessed */
#define PROT_GROWSDOWN 0x01000000
/* mprotect flag: extend change to start of growsdown vma */
#define PROT_GROWSUP 0x02000000
/* mprotect flag: extend change to end of growsup vma */
#define MAP_SHARED 0x01
/* Share changes */
#define MAP_PRIVATE 0x02
/* Changes are private */
...
...
include/asm-s390/mman.h
View file @
da501825
...
...
@@ -14,6 +14,8 @@
#define PROT_EXEC 0x4
/* page can be executed */
#define PROT_SEM 0x8
/* page may be used for atomic ops */
#define PROT_NONE 0x0
/* page can not be accessed */
#define PROT_GROWSDOWN 0x01000000
/* mprotect flag: extend change to start of growsdown vma */
#define PROT_GROWSUP 0x02000000
/* mprotect flag: extend change to end of growsup vma */
#define MAP_SHARED 0x01
/* Share changes */
#define MAP_PRIVATE 0x02
/* Changes are private */
...
...
include/asm-sh/mman.h
View file @
da501825
...
...
@@ -6,6 +6,8 @@
#define PROT_EXEC 0x4
/* page can be executed */
#define PROT_SEM 0x8
/* page may be used for atomic ops */
#define PROT_NONE 0x0
/* page can not be accessed */
#define PROT_GROWSDOWN 0x01000000
/* mprotect flag: extend change to start of growsdown vma */
#define PROT_GROWSUP 0x02000000
/* mprotect flag: extend change to end of growsup vma */
#define MAP_SHARED 0x01
/* Share changes */
#define MAP_PRIVATE 0x02
/* Changes are private */
...
...
include/asm-sparc/mman.h
View file @
da501825
...
...
@@ -9,6 +9,8 @@
#define PROT_EXEC 0x4
/* page can be executed */
#define PROT_SEM 0x8
/* page may be used for atomic ops */
#define PROT_NONE 0x0
/* page can not be accessed */
#define PROT_GROWSDOWN 0x01000000
/* mprotect flag: extend change to start of growsdown vma */
#define PROT_GROWSUP 0x02000000
/* mprotect flag: extend change to end of growsup vma */
#define MAP_SHARED 0x01
/* Share changes */
#define MAP_PRIVATE 0x02
/* Changes are private */
...
...
include/asm-sparc64/mman.h
View file @
da501825
...
...
@@ -9,6 +9,8 @@
#define PROT_EXEC 0x4
/* page can be executed */
#define PROT_SEM 0x8
/* page may be used for atomic ops */
#define PROT_NONE 0x0
/* page can not be accessed */
#define PROT_GROWSDOWN 0x01000000
/* mprotect flag: extend change to start of growsdown vma */
#define PROT_GROWSUP 0x02000000
/* mprotect flag: extend change to end of growsup vma */
#define MAP_SHARED 0x01
/* Share changes */
#define MAP_PRIVATE 0x02
/* Changes are private */
...
...
include/asm-v850/mman.h
View file @
da501825
...
...
@@ -5,6 +5,8 @@
#define PROT_WRITE 0x2
/* page can be written */
#define PROT_EXEC 0x4
/* page can be executed */
#define PROT_NONE 0x0
/* page can not be accessed */
#define PROT_GROWSDOWN 0x01000000
/* mprotect flag: extend change to start of growsdown vma */
#define PROT_GROWSUP 0x02000000
/* mprotect flag: extend change to end of growsup vma */
#define MAP_SHARED 0x01
/* Share changes */
#define MAP_PRIVATE 0x02
/* Changes are private */
...
...
include/asm-x86_64/mman.h
View file @
da501825
...
...
@@ -6,6 +6,8 @@
#define PROT_EXEC 0x4
/* page can be executed */
#define PROT_NONE 0x0
/* page can not be accessed */
#define PROT_SEM 0x8
#define PROT_GROWSDOWN 0x01000000
/* mprotect flag: extend change to start of growsdown vma */
#define PROT_GROWSUP 0x02000000
/* mprotect flag: extend change to end of growsup vma */
#define MAP_SHARED 0x01
/* Share changes */
#define MAP_PRIVATE 0x02
/* Changes are private */
...
...
mm/mprotect.c
View file @
da501825
...
...
@@ -227,6 +227,10 @@ sys_mprotect(unsigned long start, size_t len, unsigned long prot)
unsigned
long
vm_flags
,
nstart
,
end
,
tmp
;
struct
vm_area_struct
*
vma
,
*
next
,
*
prev
;
int
error
=
-
EINVAL
;
const
int
grows
=
prot
&
(
PROT_GROWSDOWN
|
PROT_GROWSUP
);
prot
&=
~
(
PROT_GROWSDOWN
|
PROT_GROWSUP
);
if
(
grows
==
(
PROT_GROWSDOWN
|
PROT_GROWSUP
))
/* can't be both */
return
-
EINVAL
;
if
(
start
&
~
PAGE_MASK
)
return
-
EINVAL
;
...
...
@@ -245,8 +249,26 @@ sys_mprotect(unsigned long start, size_t len, unsigned long prot)
vma
=
find_vma_prev
(
current
->
mm
,
start
,
&
prev
);
error
=
-
ENOMEM
;
if
(
!
vma
||
vma
->
vm_start
>
start
)
if
(
!
vma
)
goto
out
;
if
(
unlikely
(
grows
&
PROT_GROWSDOWN
))
{
if
(
vma
->
vm_start
>=
end
)
goto
out
;
start
=
vma
->
vm_start
;
error
=
-
EINVAL
;
if
(
!
(
vma
->
vm_flags
&
VM_GROWSDOWN
))
goto
out
;
}
else
{
if
(
vma
->
vm_start
>
start
)
goto
out
;
if
(
unlikely
(
grows
&
PROT_GROWSUP
))
{
end
=
vma
->
vm_end
;
error
=
-
EINVAL
;
if
(
!
(
vma
->
vm_flags
&
VM_GROWSUP
))
goto
out
;
}
}
for
(
nstart
=
start
;
;
)
{
unsigned
int
newflags
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment