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
Kirill Smelkov
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
Show 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
...
...
@@ -33,8 +33,13 @@
#define DRM_DEVICE drm_file_t *priv = filp->private_data; \
drm_device_t *dev = priv->dev
/** IRQ handler arguments */
/** 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
)
...
...
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:
*/
...
...
@@ -45,25 +49,18 @@
#define DRIVER_AUTHOR "SIS"
#define DRIVER_NAME "sis"
#define DRIVER_DESC "SIS 300/630/540"
#define DRIVER_DATE
"20010503
"
#define DRIVER_DATE
"20030826
"
#define DRIVER_MAJOR 1
#define DRIVER_MINOR
0
#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
;
unsigned
long
free
;
}
drm_sis_mem_t
;
typedef
struct
{
...
...
@@ -24,23 +27,7 @@ typedef struct {
}
drm_sis_agp_t
;
typedef
struct
{
unsigned
int
left
,
right
;
}
drm_sis_flip_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
unsigned
int
offset
,
size
;
}
drm_sis_fb_t
;
#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
...
...
@@ -48,10 +42,10 @@ 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
=
(
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
;
...
...
@@ -66,11 +60,10 @@ int setAdd(set_t *set, ITEM_TYPE item)
{
int
free
=
set
->
free
;
if
(
free
!=
-
1
)
{
if
(
free
!=
-
1
)
{
set
->
list
[
free
].
val
=
item
;
set
->
free
=
set
->
list
[
free
].
free_next
;
}
else
{
}
else
{
return
0
;
}
...
...
@@ -86,10 +79,11 @@ 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
;
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
;
...
...
@@ -98,7 +92,7 @@ int setDel(set_t *set, ITEM_TYPE item)
alloc
=
set
->
list
[
alloc
].
alloc_next
;
}
if
(
alloc
==
-
1
)
if
(
alloc
==
-
1
)
return
0
;
set
->
list
[
alloc
].
free_next
=
set
->
free
;
...
...
@@ -112,7 +106,7 @@ int setDel(set_t *set, ITEM_TYPE item)
int
setFirst
(
set_t
*
set
,
ITEM_TYPE
*
item
)
{
if
(
set
->
alloc
==
-
1
)
if
(
set
->
alloc
==
-
1
)
return
0
;
*
item
=
set
->
list
[
set
->
alloc
].
val
;
...
...
@@ -123,7 +117,7 @@ int setFirst(set_t *set, ITEM_TYPE *item)
int
setNext
(
set_t
*
set
,
ITEM_TYPE
*
item
)
{
if
(
set
->
trace
==
-
1
)
if
(
set
->
trace
==
-
1
)
return
0
;
*
item
=
set
->
list
[
set
->
trace
].
val
;
...
...
@@ -134,7 +128,7 @@ int setNext(set_t *set, ITEM_TYPE *item)
int
setDestroy
(
set_t
*
set
)
{
FREE
(
set
);
DRM
(
free
)(
set
,
sizeof
(
set_t
),
DRM_MEM_DRIVER
);
return
1
;
}
...
...
@@ -165,48 +159,16 @@ 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
)
{
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
"
);
}
memHeap_t
*
mmInit
(
int
ofs
,
int
size
)
{
PMemBlock
blocks
;
if
(
size
<=
0
)
{
if
(
size
<=
0
)
return
0
;
}
blocks
=
(
TMemBlock
*
)
calloc
(
1
,
sizeof
(
TMemBlock
)
);
if
(
blocks
)
{
blocks
=
(
TMemBlock
*
)
DRM
(
calloc
)(
1
,
sizeof
(
TMemBlock
),
DRM_MEM_DRIVER
);
if
(
blocks
!=
NULL
)
{
blocks
->
ofs
=
ofs
;
blocks
->
size
=
size
;
blocks
->
free
=
1
;
...
...
@@ -215,6 +177,24 @@ memHeap_t *mmInit(int ofs,
return
0
;
}
/* Checks if a pointer 'b' is part of the heap 'heap' */
int
mmBlockInHeap
(
memHeap_t
*
heap
,
PMemBlock
b
)
{
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.
*/
memHeap_t
*
mmAddRange
(
memHeap_t
*
heap
,
...
...
@@ -222,23 +202,22 @@ memHeap_t *mmAddRange( memHeap_t *heap,
int
size
)
{
PMemBlock
blocks
;
blocks
=
(
TMemBlock
*
)
calloc
(
2
,
sizeof
(
TMemBlock
)
);
if
(
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.
/* 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
;
blocks
[
1
].
next
=
(
PMemBlock
)
heap
;
return
(
memHeap_t
*
)
blocks
;
}
else
}
else
return
heap
;
}
...
...
@@ -250,7 +229,8 @@ static TMemBlock* SliceBlock(TMemBlock *p,
/* break left */
if
(
startofs
>
p
->
ofs
)
{
newblock
=
(
TMemBlock
*
)
calloc
(
1
,
sizeof
(
TMemBlock
));
newblock
=
(
TMemBlock
*
)
DRM
(
calloc
)(
1
,
sizeof
(
TMemBlock
),
DRM_MEM_DRIVER
);
newblock
->
ofs
=
startofs
;
newblock
->
size
=
p
->
size
-
(
startofs
-
p
->
ofs
);
newblock
->
free
=
1
;
...
...
@@ -262,7 +242,8 @@ static TMemBlock* SliceBlock(TMemBlock *p,
/* break right */
if
(
size
<
p
->
size
)
{
newblock
=
(
TMemBlock
*
)
calloc
(
1
,
sizeof
(
TMemBlock
));
newblock
=
(
TMemBlock
*
)
DRM
(
calloc
)(
1
,
sizeof
(
TMemBlock
),
DRM_MEM_DRIVER
);
newblock
->
ofs
=
startofs
+
size
;
newblock
->
size
=
p
->
size
-
size
;
newblock
->
free
=
1
;
...
...
@@ -280,15 +261,16 @@ static TMemBlock* SliceBlock(TMemBlock *p,
PMemBlock
mmAllocMem
(
memHeap_t
*
heap
,
int
size
,
int
align2
,
int
startSearch
)
{
int
mask
,
startofs
,
endofs
;
int
mask
,
startofs
,
endofs
;
TMemBlock
*
p
;
if
(
!
heap
||
align2
<
0
||
size
<=
0
)
if
(
heap
==
NULL
||
align2
<
0
||
size
<=
0
)
return
NULL
;
mask
=
(
1
<<
align2
)
-
1
;
startofs
=
0
;
p
=
(
TMemBlock
*
)
heap
;
while
(
p
)
{
while
(
p
!=
NULL
)
{
if
(
ISFREE
(
p
))
{
startofs
=
(
p
->
ofs
+
mask
)
&
~
mask
;
if
(
startofs
<
startSearch
)
{
...
...
@@ -300,7 +282,7 @@ PMemBlock mmAllocMem( memHeap_t *heap, int size, int align2, int startSearch)
}
p
=
p
->
next
;
}
if
(
!
p
)
if
(
p
==
NULL
)
return
NULL
;
p
=
SliceBlock
(
p
,
startofs
,
size
,
0
,
mask
+
1
);
p
->
heap
=
heap
;
...
...
@@ -313,7 +295,7 @@ static __inline__ int Join2Blocks(TMemBlock *p)
TMemBlock
*
q
=
p
->
next
;
p
->
size
+=
q
->
size
;
p
->
next
=
q
->
next
;
free
(
q
);
DRM
(
free
)(
q
,
sizeof
(
TMemBlock
),
DRM_MEM_DRIVER
);
return
1
;
}
return
0
;
...
...
@@ -321,29 +303,22 @@ static __inline__ int Join2Blocks(TMemBlock *p)
int
mmFreeMem
(
PMemBlock
b
)
{
TMemBlock
*
p
,
*
prev
;
TMemBlock
*
p
,
*
prev
;
if
(
!
b
)
if
(
b
==
NULL
)
return
0
;
if
(
!
b
->
heap
)
{
fprintf
(
stderr
,
"no heap
\n
"
);
if
(
b
->
heap
==
NULL
)
return
-
1
;
}
p
=
b
->
heap
;
prev
=
NULL
;
while
(
p
&&
p
!=
b
)
{
while
(
p
!=
NULL
&&
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
"
);
if
(
p
==
NULL
||
p
->
free
||
p
->
reserved
)
return
-
1
;
}
p
->
free
=
1
;
Join2Blocks
(
p
);
if
(
prev
)
...
...
@@ -356,9 +331,10 @@ int mmReserveMem(memHeap_t *heap, int offset,int size)
int
endofs
;
TMemBlock
*
p
;
if
(
!
heap
||
size
<=
0
)
if
(
heap
==
NULL
||
size
<=
0
)
return
-
1
;
endofs
=
offset
+
size
;
endofs
=
offset
+
size
;
p
=
(
TMemBlock
*
)
heap
;
while
(
p
&&
p
->
ofs
<=
offset
)
{
if
(
ISFREE
(
p
)
&&
endofs
<=
(
p
->
ofs
+
p
->
size
))
{
...
...
@@ -374,20 +350,22 @@ int mmFreeReserved(memHeap_t *heap, int offset)
{
TMemBlock
*
p
,
*
prev
;
if
(
!
heap
)
if
(
heap
==
NULL
)
return
-
1
;
p
=
(
TMemBlock
*
)
heap
;
prev
=
NULL
;
while
(
p
&&
p
->
ofs
!=
offset
)
{
while
(
p
!=
NULL
&&
p
->
ofs
!=
offset
)
{
prev
=
p
;
p
=
p
->
next
;
}
if
(
!
p
||
!
p
->
reserved
)
if
(
p
==
NULL
||
!
p
->
reserved
)
return
-
1
;
p
->
free
=
1
;
p
->
reserved
=
0
;
Join2Blocks
(
p
);
if
(
prev
)
if
(
prev
!=
NULL
)
Join2Blocks
(
prev
);
return
0
;
}
...
...
@@ -396,12 +374,13 @@ void mmDestroy(memHeap_t *heap)
{
TMemBlock
*
p
,
*
q
;
if
(
!
heap
)
if
(
heap
==
NULL
)
return
;
p
=
(
TMemBlock
*
)
heap
;
while
(
p
)
{
while
(
p
!=
NULL
)
{
q
=
p
->
next
;
free
(
p
);
DRM
(
free
)(
p
,
sizeof
(
TMemBlock
),
DRM_MEM_DRIVER
);
p
=
q
;
}
}
drivers/char/drm/sis_ds.h
View file @
da501825
...
...
@@ -28,14 +28,12 @@
*
*/
#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
;
...
...
@@ -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,9 +80,6 @@ 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
;
...
...
@@ -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'
...
...
@@ -135,6 +131,11 @@ memHeap_t *mmAddRange( memHeap_t *heap,
*/
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
...
...
@@ -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,13 +28,14 @@
*
*/
#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
...
...
@@ -48,82 +49,88 @@ typedef struct {
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
){
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
){
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
)
{
return
0
;
}
int
sis_fb_alloc
(
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
;
DRM_COPY_FROM_USER_IOCTL
(
fb
,
(
drm_sis_mem_t
*
)
data
,
sizeof
(
fb
));
req
.
size
=
fb
.
size
;
sis_malloc
(
&
req
);
if
(
req
.
offset
)
{
if
(
req
.
offset
)
{
/* TODO */
fb
.
offset
=
req
.
offset
;
fb
.
free
=
req
.
offset
;
if
(
!
add_alloc_set
(
fb
.
context
,
VIDEO_TYPE
,
fb
.
free
))
{
if
(
!
add_alloc_set
(
fb
.
context
,
VIDEO_TYPE
,
fb
.
free
))
{
DRM_DEBUG
(
"adding to allocation set fails
\n
"
);
sis_free
(
req
.
offset
);
retval
=
-
1
;
}
retval
=
DRM_ERR
(
EINVAL
);
}
else
{
}
else
{
fb
.
offset
=
0
;
fb
.
size
=
0
;
fb
.
free
=
0
;
}
if
(
copy_to_user
((
drm_sis_mem_t
*
)
arg
,
&
fb
,
sizeof
(
fb
)))
return
-
EFAULT
;
DRM_COPY_TO_USER_IOCTL
((
drm_sis_mem_t
*
)
data
,
fb
,
sizeof
(
fb
))
;
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
;
DRM_COPY_FROM_USER_IOCTL
(
fb
,
(
drm_sis_mem_t
*
)
data
,
sizeof
(
fb
));
if
(
!
fb
.
free
){
return
-
1
;
}
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
);
if
(
!
del_alloc_set
(
fb
.
context
,
VIDEO_TYPE
,
fb
.
free
))
retval
=
-
1
;
DRM_DEBUG
(
"free fb, offset = %d
\n
"
,
fb
.
free
);
...
...
@@ -132,126 +139,215 @@ int sis_fb_free(struct inode *inode, struct file *filp, unsigned int cmd,
#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
)
{
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_DEVICE
;
drm_sis_private_t
*
dev_priv
=
dev
->
dev_private
;
drm_sis_agp_t
agp
;
if
(
copy_from_user
(
&
agp
,
(
drm_sis_agp_t
*
)
arg
,
sizeof
(
agp
)))
return
-
EFAULT
;
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
);
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_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
(
Agp
Heap
,
agp
.
size
,
0
,
0
);
if
(
block
)
{
block
=
mmAllocMem
(
dev_priv
->
AGP
Heap
,
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
))
{
if
(
!
add_alloc_set
(
agp
.
context
,
AGP_TYPE
,
agp
.
free
))
{
DRM_DEBUG
(
"adding to allocation set fails
\n
"
);
mmFreeMem
((
PMemBlock
)(
unsigned
long
)
agp
.
free
);
mmFreeMem
((
PMemBlock
)
agp
.
free
);
retval
=
-
1
;
}
}
else
{
}
else
{
agp
.
offset
=
0
;
agp
.
size
=
0
;
agp
.
free
=
0
;
}
if
(
copy_to_user
((
drm_sis_mem_t
*
)
arg
,
&
agp
,
sizeof
(
agp
)))
return
-
EFAULT
;
DRM_COPY_TO_USER_IOCTL
((
drm_sis_mem_t
*
)
data
,
agp
,
sizeof
(
agp
))
;
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_DEVICE
;
drm_sis_private_t
*
dev_priv
=
dev
->
dev_private
;
drm_sis_mem_t
agp
;
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
));
if
(
!
agp
.
free
){
return
-
1
;
}
if
(
!
mmBlockInHeap
(
dev_priv
->
AGPHeap
,
(
PMemBlock
)
agp
.
free
))
return
DRM_ERR
(
EINVAL
);
mmFreeMem
((
PMemBlock
)(
unsigned
long
)
agp
.
free
);
if
(
!
del_alloc_set
(
agp
.
context
,
AGP_TYPE
,
agp
.
free
))
retval
=
-
1
;
mmFreeMem
((
PMemBlock
)
agp
.
free
);
if
(
!
del_alloc_set
(
agp
.
context
,
AGP_TYPE
,
agp
.
free
))
return
DRM_ERR
(
EINVAL
)
;
DRM_DEBUG
(
"free agp, free = %d
\n
"
,
agp
.
free
);
DRM_DEBUG
(
"free agp, free = 0x%lx
\n
"
,
agp
.
free
);
return
retval
;
return
0
;
}
#endif
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
))
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
)
{
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
);
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
)){
if
((
i
>=
MAX_CONTEXT
)
||
(
global_ppriv
[
i
].
sets
[
0
]
==
NULL
)
||
(
global_ppriv
[
i
].
sets
[
1
]
==
NULL
))
{
return
0
;
}
}
...
...
@@ -263,11 +359,13 @@ 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
))
for
(
i
=
0
;
i
<
MAX_CONTEXT
;
i
++
)
{
if
(
global_ppriv
[
i
].
used
&&
(
global_ppriv
[
i
].
context
==
context
))
break
;
}
if
(
i
<
MAX_CONTEXT
)
{
if
(
i
<
MAX_CONTEXT
)
{
set_t
*
set
;
unsigned
int
item
;
int
retval
;
...
...
@@ -277,9 +375,13 @@ int sis_final_context(int context)
/* Video Memory */
set
=
global_ppriv
[
i
].
sets
[
0
];
retval
=
setFirst
(
set
,
&
item
);
while
(
retval
)
{
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
);
...
...
@@ -287,9 +389,9 @@ int sis_final_context(int context)
/* AGP Memory */
set
=
global_ppriv
[
i
].
sets
[
1
];
retval
=
setFirst
(
set
,
&
item
);
while
(
retval
)
{
while
(
retval
)
{
DRM_DEBUG
(
"free agp memory 0x%x
\n
"
,
item
);
mmFreeMem
((
PMemBlock
)(
unsigned
long
)
item
);
mmFreeMem
((
PMemBlock
)
item
);
retval
=
setNext
(
set
,
&
item
);
}
setDestroy
(
set
);
...
...
@@ -297,11 +399,5 @@ int sis_final_context(int context)
global_ppriv
[
i
].
used
=
0
;
}
/* turn-off auto-flip */
/* TODO */
#if defined(SIS_STEREO)
flip_final
();
#endif
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