···611611N: Randolph Chung612612E: tausq@debian.org613613D: Linux/PA-RISC hacker614614-S: Los Altos, CA 94022615615-S: USA614614+S: Hong Kong616615617616N: Juan Jose Ciarlante618617W: http://juanjox.kernelnotes.org/···34033404S: Chudenicka 834043405S: 10200 Prague 10, Hostivar34053406S: Czech Republic34073407+34083408+N: Thibaut Varene34093409+E: T-Bone@parisc-linux.org34103410+W: http://www.parisc-linux.org/34113411+P: 1024D/B7D2F063 E67C 0D43 A75E 12A5 BB1C FA2F 1E32 C3DA B7D2 F06334123412+D: PA-RISC port minion, PDC and GSCPS2 drivers, debuglocks and other bits34133413+D: Some bits in an ARM port, S1D13XXX FB driver, random patches here and there34143414+D: AD1889 sound driver34153415+S: Paris, France3406341634073417N: Heikki Vatiainen34083418E: hessu@cs.tut.fi
+6-2
arch/parisc/kernel/drivers.c
···499499500500 dev = create_parisc_device(mod_path);501501 if (dev->id.hw_type != HPHW_FAULTY) {502502- printk("Two devices have hardware path %s. Please file a bug with HP.\n"503503- "In the meantime, you could try rearranging your cards.\n", parisc_pathname(dev));502502+ printk(KERN_ERR "Two devices have hardware path [%s]. "503503+ "IODC data for second device: "504504+ "%02x%02x%02x%02x%02x%02x\n"505505+ "Rearranging GSC cards sometimes helps\n",506506+ parisc_pathname(dev), iodc_data[0], iodc_data[1],507507+ iodc_data[3], iodc_data[4], iodc_data[5], iodc_data[6]);504508 return NULL;505509 }506510
+1
arch/parisc/kernel/entry.S
···18461846 ldo -16(%r30),%r29 /* Reference param save area */18471847#endif1848184818491849+ /* WARNING - Clobbers r19 and r21, userspace must save these! */18491850 STREG %r2,PT_GR19(%r1) /* save for child */18501851 STREG %r30,PT_GR21(%r1)18511852 BL sys_clone,%r2
···1919#define CODE2020#include "compat_ioctl.c"21212222-/* Use this to get at 32-bit user passed pointers. 2323- See sys_sparc32.c for description about these. */2424-#define A(__x) ((unsigned long)(__x))2525-/* The same for use with copy_from_user() and copy_to_user(). */2626-#define B(__x) ((void *)(unsigned long)(__x))2727-2828-#if defined(CONFIG_DRM) || defined(CONFIG_DRM_MODULE)2929-/* This really belongs in include/linux/drm.h -DaveM */3030-#include "../../../drivers/char/drm/drm.h"3131-3232-typedef struct drm32_version {3333- int version_major; /* Major version */3434- int version_minor; /* Minor version */3535- int version_patchlevel;/* Patch level */3636- int name_len; /* Length of name buffer */3737- u32 name; /* Name of driver */3838- int date_len; /* Length of date buffer */3939- u32 date; /* User-space buffer to hold date */4040- int desc_len; /* Length of desc buffer */4141- u32 desc; /* User-space buffer to hold desc */4242-} drm32_version_t;4343-#define DRM32_IOCTL_VERSION DRM_IOWR(0x00, drm32_version_t)4444-4545-static int drm32_version(unsigned int fd, unsigned int cmd, unsigned long arg)4646-{4747- drm32_version_t *uversion = (drm32_version_t *)arg;4848- char *name_ptr, *date_ptr, *desc_ptr;4949- u32 tmp1, tmp2, tmp3;5050- drm_version_t kversion;5151- mm_segment_t old_fs;5252- int ret;5353-5454- memset(&kversion, 0, sizeof(kversion));5555- if (get_user(kversion.name_len, &uversion->name_len) ||5656- get_user(kversion.date_len, &uversion->date_len) ||5757- get_user(kversion.desc_len, &uversion->desc_len) ||5858- get_user(tmp1, &uversion->name) ||5959- get_user(tmp2, &uversion->date) ||6060- get_user(tmp3, &uversion->desc))6161- return -EFAULT;6262-6363- name_ptr = (char *) A(tmp1);6464- date_ptr = (char *) A(tmp2);6565- desc_ptr = (char *) A(tmp3);6666-6767- ret = -ENOMEM;6868- if (kversion.name_len && name_ptr) {6969- kversion.name = kmalloc(kversion.name_len, GFP_KERNEL);7070- if (!kversion.name)7171- goto out;7272- }7373- if (kversion.date_len && date_ptr) {7474- kversion.date = kmalloc(kversion.date_len, GFP_KERNEL);7575- if (!kversion.date)7676- goto out;7777- }7878- if (kversion.desc_len && desc_ptr) {7979- kversion.desc = kmalloc(kversion.desc_len, GFP_KERNEL);8080- if (!kversion.desc)8181- goto out;8282- }8383-8484- old_fs = get_fs();8585- set_fs(KERNEL_DS);8686- ret = sys_ioctl (fd, DRM_IOCTL_VERSION, (unsigned long)&kversion);8787- set_fs(old_fs);8888-8989- if (!ret) {9090- if ((kversion.name &&9191- copy_to_user(name_ptr, kversion.name, kversion.name_len)) ||9292- (kversion.date &&9393- copy_to_user(date_ptr, kversion.date, kversion.date_len)) ||9494- (kversion.desc &&9595- copy_to_user(desc_ptr, kversion.desc, kversion.desc_len)))9696- ret = -EFAULT;9797- if (put_user(kversion.version_major, &uversion->version_major) ||9898- put_user(kversion.version_minor, &uversion->version_minor) ||9999- put_user(kversion.version_patchlevel, &uversion->version_patchlevel) ||100100- put_user(kversion.name_len, &uversion->name_len) ||101101- put_user(kversion.date_len, &uversion->date_len) ||102102- put_user(kversion.desc_len, &uversion->desc_len))103103- ret = -EFAULT;104104- }105105-106106-out:107107- kfree(kversion.name);108108- kfree(kversion.date);109109- kfree(kversion.desc);110110- return ret;111111-}112112-113113-typedef struct drm32_unique {114114- int unique_len; /* Length of unique */115115- u32 unique; /* Unique name for driver instantiation */116116-} drm32_unique_t;117117-#define DRM32_IOCTL_GET_UNIQUE DRM_IOWR(0x01, drm32_unique_t)118118-#define DRM32_IOCTL_SET_UNIQUE DRM_IOW( 0x10, drm32_unique_t)119119-120120-static int drm32_getsetunique(unsigned int fd, unsigned int cmd, unsigned long arg)121121-{122122- drm32_unique_t *uarg = (drm32_unique_t *)arg;123123- drm_unique_t karg;124124- mm_segment_t old_fs;125125- char *uptr;126126- u32 tmp;127127- int ret;128128-129129- if (get_user(karg.unique_len, &uarg->unique_len))130130- return -EFAULT;131131- karg.unique = NULL;132132-133133- if (get_user(tmp, &uarg->unique))134134- return -EFAULT;135135-136136- uptr = (char *) A(tmp);137137-138138- if (uptr) {139139- karg.unique = kmalloc(karg.unique_len, GFP_KERNEL);140140- if (!karg.unique)141141- return -ENOMEM;142142- if (cmd == DRM32_IOCTL_SET_UNIQUE &&143143- copy_from_user(karg.unique, uptr, karg.unique_len)) {144144- kfree(karg.unique);145145- return -EFAULT;146146- }147147- }148148-149149- old_fs = get_fs();150150- set_fs(KERNEL_DS);151151- if (cmd == DRM32_IOCTL_GET_UNIQUE)152152- ret = sys_ioctl (fd, DRM_IOCTL_GET_UNIQUE, (unsigned long)&karg);153153- else154154- ret = sys_ioctl (fd, DRM_IOCTL_SET_UNIQUE, (unsigned long)&karg);155155- set_fs(old_fs);156156-157157- if (!ret) {158158- if (cmd == DRM32_IOCTL_GET_UNIQUE &&159159- uptr != NULL &&160160- copy_to_user(uptr, karg.unique, karg.unique_len))161161- ret = -EFAULT;162162- if (put_user(karg.unique_len, &uarg->unique_len))163163- ret = -EFAULT;164164- }165165-166166- kfree(karg.unique);167167- return ret;168168-}169169-170170-typedef struct drm32_map {171171- u32 offset; /* Requested physical address (0 for SAREA)*/172172- u32 size; /* Requested physical size (bytes) */173173- drm_map_type_t type; /* Type of memory to map */174174- drm_map_flags_t flags; /* Flags */175175- u32 handle; /* User-space: "Handle" to pass to mmap */176176- /* Kernel-space: kernel-virtual address */177177- int mtrr; /* MTRR slot used */178178- /* Private data */179179-} drm32_map_t;180180-#define DRM32_IOCTL_ADD_MAP DRM_IOWR(0x15, drm32_map_t)181181-182182-static int drm32_addmap(unsigned int fd, unsigned int cmd, unsigned long arg)183183-{184184- drm32_map_t *uarg = (drm32_map_t *) arg;185185- drm_map_t karg;186186- mm_segment_t old_fs;187187- u32 tmp;188188- int ret;189189-190190- ret = get_user(karg.offset, &uarg->offset);191191- ret |= get_user(karg.size, &uarg->size);192192- ret |= get_user(karg.type, &uarg->type);193193- ret |= get_user(karg.flags, &uarg->flags);194194- ret |= get_user(tmp, &uarg->handle);195195- ret |= get_user(karg.mtrr, &uarg->mtrr);196196- if (ret)197197- return -EFAULT;198198-199199- karg.handle = (void *) A(tmp);200200-201201- old_fs = get_fs();202202- set_fs(KERNEL_DS);203203- ret = sys_ioctl(fd, DRM_IOCTL_ADD_MAP, (unsigned long) &karg);204204- set_fs(old_fs);205205-206206- if (!ret) {207207- ret = put_user(karg.offset, &uarg->offset);208208- ret |= put_user(karg.size, &uarg->size);209209- ret |= put_user(karg.type, &uarg->type);210210- ret |= put_user(karg.flags, &uarg->flags);211211- tmp = (u32) (long)karg.handle;212212- ret |= put_user(tmp, &uarg->handle);213213- ret |= put_user(karg.mtrr, &uarg->mtrr);214214- if (ret)215215- ret = -EFAULT;216216- }217217-218218- return ret;219219-}220220-221221-typedef struct drm32_buf_info {222222- int count; /* Entries in list */223223- u32 list; /* (drm_buf_desc_t *) */ 224224-} drm32_buf_info_t;225225-#define DRM32_IOCTL_INFO_BUFS DRM_IOWR(0x18, drm32_buf_info_t)226226-227227-static int drm32_info_bufs(unsigned int fd, unsigned int cmd, unsigned long arg)228228-{229229- drm32_buf_info_t *uarg = (drm32_buf_info_t *)arg;230230- drm_buf_desc_t *ulist;231231- drm_buf_info_t karg;232232- mm_segment_t old_fs;233233- int orig_count, ret;234234- u32 tmp;235235-236236- if (get_user(karg.count, &uarg->count) ||237237- get_user(tmp, &uarg->list))238238- return -EFAULT;239239-240240- ulist = (drm_buf_desc_t *) A(tmp);241241-242242- orig_count = karg.count;243243-244244- karg.list = kmalloc(karg.count * sizeof(drm_buf_desc_t), GFP_KERNEL);245245- if (!karg.list)246246- return -EFAULT;247247-248248- old_fs = get_fs();249249- set_fs(KERNEL_DS);250250- ret = sys_ioctl(fd, DRM_IOCTL_INFO_BUFS, (unsigned long) &karg);251251- set_fs(old_fs);252252-253253- if (!ret) {254254- if (karg.count <= orig_count &&255255- (copy_to_user(ulist, karg.list,256256- karg.count * sizeof(drm_buf_desc_t))))257257- ret = -EFAULT;258258- if (put_user(karg.count, &uarg->count))259259- ret = -EFAULT;260260- }261261-262262- kfree(karg.list);263263- return ret;264264-}265265-266266-typedef struct drm32_buf_free {267267- int count;268268- u32 list; /* (int *) */269269-} drm32_buf_free_t;270270-#define DRM32_IOCTL_FREE_BUFS DRM_IOW( 0x1a, drm32_buf_free_t)271271-272272-static int drm32_free_bufs(unsigned int fd, unsigned int cmd, unsigned long arg)273273-{274274- drm32_buf_free_t *uarg = (drm32_buf_free_t *)arg;275275- drm_buf_free_t karg;276276- mm_segment_t old_fs;277277- int *ulist;278278- int ret;279279- u32 tmp;280280-281281- if (get_user(karg.count, &uarg->count) ||282282- get_user(tmp, &uarg->list))283283- return -EFAULT;284284-285285- ulist = (int *) A(tmp);286286-287287- karg.list = kmalloc(karg.count * sizeof(int), GFP_KERNEL);288288- if (!karg.list)289289- return -ENOMEM;290290-291291- ret = -EFAULT;292292- if (copy_from_user(karg.list, ulist, (karg.count * sizeof(int))))293293- goto out;294294-295295- old_fs = get_fs();296296- set_fs(KERNEL_DS);297297- ret = sys_ioctl(fd, DRM_IOCTL_FREE_BUFS, (unsigned long) &karg);298298- set_fs(old_fs);299299-300300-out:301301- kfree(karg.list);302302- return ret;303303-}304304-305305-typedef struct drm32_buf_pub {306306- int idx; /* Index into master buflist */307307- int total; /* Buffer size */308308- int used; /* Amount of buffer in use (for DMA) */309309- u32 address; /* Address of buffer (void *) */310310-} drm32_buf_pub_t;311311-312312-typedef struct drm32_buf_map {313313- int count; /* Length of buflist */314314- u32 virtual; /* Mmaped area in user-virtual (void *) */315315- u32 list; /* Buffer information (drm_buf_pub_t *) */316316-} drm32_buf_map_t;317317-#define DRM32_IOCTL_MAP_BUFS DRM_IOWR(0x19, drm32_buf_map_t)318318-319319-static int drm32_map_bufs(unsigned int fd, unsigned int cmd, unsigned long arg)320320-{321321- drm32_buf_map_t *uarg = (drm32_buf_map_t *)arg;322322- drm32_buf_pub_t *ulist;323323- drm_buf_map_t karg;324324- mm_segment_t old_fs;325325- int orig_count, ret, i;326326- u32 tmp1, tmp2;327327-328328- if (get_user(karg.count, &uarg->count) ||329329- get_user(tmp1, &uarg->virtual) ||330330- get_user(tmp2, &uarg->list))331331- return -EFAULT;332332-333333- karg.virtual = (void *) A(tmp1);334334- ulist = (drm32_buf_pub_t *) A(tmp2);335335-336336- orig_count = karg.count;337337-338338- karg.list = kmalloc(karg.count * sizeof(drm_buf_pub_t), GFP_KERNEL);339339- if (!karg.list)340340- return -ENOMEM;341341-342342- ret = -EFAULT;343343- for (i = 0; i < karg.count; i++) {344344- if (get_user(karg.list[i].idx, &ulist[i].idx) ||345345- get_user(karg.list[i].total, &ulist[i].total) ||346346- get_user(karg.list[i].used, &ulist[i].used) ||347347- get_user(tmp1, &ulist[i].address))348348- goto out;349349-350350- karg.list[i].address = (void *) A(tmp1);351351- }352352-353353- old_fs = get_fs();354354- set_fs(KERNEL_DS);355355- ret = sys_ioctl(fd, DRM_IOCTL_MAP_BUFS, (unsigned long) &karg);356356- set_fs(old_fs);357357-358358- if (!ret) {359359- for (i = 0; i < orig_count; i++) {360360- tmp1 = (u32) (long) karg.list[i].address;361361- if (put_user(karg.list[i].idx, &ulist[i].idx) ||362362- put_user(karg.list[i].total, &ulist[i].total) ||363363- put_user(karg.list[i].used, &ulist[i].used) ||364364- put_user(tmp1, &ulist[i].address)) {365365- ret = -EFAULT;366366- goto out;367367- }368368- }369369- if (put_user(karg.count, &uarg->count))370370- ret = -EFAULT;371371- }372372-373373-out:374374- kfree(karg.list);375375- return ret;376376-}377377-378378-typedef struct drm32_dma {379379- /* Indices here refer to the offset into380380- buflist in drm_buf_get_t. */381381- int context; /* Context handle */382382- int send_count; /* Number of buffers to send */383383- u32 send_indices; /* List of handles to buffers (int *) */384384- u32 send_sizes; /* Lengths of data to send (int *) */385385- drm_dma_flags_t flags; /* Flags */386386- int request_count; /* Number of buffers requested */387387- int request_size; /* Desired size for buffers */388388- u32 request_indices; /* Buffer information (int *) */389389- u32 request_sizes; /* (int *) */390390- int granted_count; /* Number of buffers granted */391391-} drm32_dma_t;392392-#define DRM32_IOCTL_DMA DRM_IOWR(0x29, drm32_dma_t)393393-394394-/* RED PEN The DRM layer blindly dereferences the send/request395395- * indice/size arrays even though they are userland396396- * pointers. -DaveM397397- */398398-static int drm32_dma(unsigned int fd, unsigned int cmd, unsigned long arg)399399-{400400- drm32_dma_t *uarg = (drm32_dma_t *) arg;401401- int *u_si, *u_ss, *u_ri, *u_rs;402402- drm_dma_t karg;403403- mm_segment_t old_fs;404404- int ret;405405- u32 tmp1, tmp2, tmp3, tmp4;406406-407407- karg.send_indices = karg.send_sizes = NULL;408408- karg.request_indices = karg.request_sizes = NULL;409409-410410- if (get_user(karg.context, &uarg->context) ||411411- get_user(karg.send_count, &uarg->send_count) ||412412- get_user(tmp1, &uarg->send_indices) ||413413- get_user(tmp2, &uarg->send_sizes) ||414414- get_user(karg.flags, &uarg->flags) ||415415- get_user(karg.request_count, &uarg->request_count) ||416416- get_user(karg.request_size, &uarg->request_size) ||417417- get_user(tmp3, &uarg->request_indices) ||418418- get_user(tmp4, &uarg->request_sizes) ||419419- get_user(karg.granted_count, &uarg->granted_count))420420- return -EFAULT;421421-422422- u_si = (int *) A(tmp1);423423- u_ss = (int *) A(tmp2);424424- u_ri = (int *) A(tmp3);425425- u_rs = (int *) A(tmp4);426426-427427- if (karg.send_count) {428428- karg.send_indices = kmalloc(karg.send_count * sizeof(int), GFP_KERNEL);429429- karg.send_sizes = kmalloc(karg.send_count * sizeof(int), GFP_KERNEL);430430-431431- ret = -ENOMEM;432432- if (!karg.send_indices || !karg.send_sizes)433433- goto out;434434-435435- ret = -EFAULT;436436- if (copy_from_user(karg.send_indices, u_si,437437- (karg.send_count * sizeof(int))) ||438438- copy_from_user(karg.send_sizes, u_ss,439439- (karg.send_count * sizeof(int))))440440- goto out;441441- }442442-443443- if (karg.request_count) {444444- karg.request_indices = kmalloc(karg.request_count * sizeof(int), GFP_KERNEL);445445- karg.request_sizes = kmalloc(karg.request_count * sizeof(int), GFP_KERNEL);446446-447447- ret = -ENOMEM;448448- if (!karg.request_indices || !karg.request_sizes)449449- goto out;450450-451451- ret = -EFAULT;452452- if (copy_from_user(karg.request_indices, u_ri,453453- (karg.request_count * sizeof(int))) ||454454- copy_from_user(karg.request_sizes, u_rs,455455- (karg.request_count * sizeof(int))))456456- goto out;457457- }458458-459459- old_fs = get_fs();460460- set_fs(KERNEL_DS);461461- ret = sys_ioctl(fd, DRM_IOCTL_DMA, (unsigned long) &karg);462462- set_fs(old_fs);463463-464464- if (!ret) {465465- if (put_user(karg.context, &uarg->context) ||466466- put_user(karg.send_count, &uarg->send_count) ||467467- put_user(karg.flags, &uarg->flags) ||468468- put_user(karg.request_count, &uarg->request_count) ||469469- put_user(karg.request_size, &uarg->request_size) ||470470- put_user(karg.granted_count, &uarg->granted_count))471471- ret = -EFAULT;472472-473473- if (karg.send_count) {474474- if (copy_to_user(u_si, karg.send_indices,475475- (karg.send_count * sizeof(int))) ||476476- copy_to_user(u_ss, karg.send_sizes,477477- (karg.send_count * sizeof(int))))478478- ret = -EFAULT;479479- }480480- if (karg.request_count) {481481- if (copy_to_user(u_ri, karg.request_indices,482482- (karg.request_count * sizeof(int))) ||483483- copy_to_user(u_rs, karg.request_sizes,484484- (karg.request_count * sizeof(int))))485485- ret = -EFAULT;486486- }487487- }488488-489489-out:490490- kfree(karg.send_indices);491491- kfree(karg.send_sizes);492492- kfree(karg.request_indices);493493- kfree(karg.request_sizes);494494- return ret;495495-}496496-497497-typedef struct drm32_ctx_res {498498- int count;499499- u32 contexts; /* (drm_ctx_t *) */500500-} drm32_ctx_res_t;501501-#define DRM32_IOCTL_RES_CTX DRM_IOWR(0x26, drm32_ctx_res_t)502502-503503-static int drm32_res_ctx(unsigned int fd, unsigned int cmd, unsigned long arg)504504-{505505- drm32_ctx_res_t *uarg = (drm32_ctx_res_t *) arg;506506- drm_ctx_t *ulist;507507- drm_ctx_res_t karg;508508- mm_segment_t old_fs;509509- int orig_count, ret;510510- u32 tmp;511511-512512- karg.contexts = NULL;513513- if (get_user(karg.count, &uarg->count) ||514514- get_user(tmp, &uarg->contexts))515515- return -EFAULT;516516-517517- ulist = (drm_ctx_t *) A(tmp);518518-519519- orig_count = karg.count;520520- if (karg.count && ulist) {521521- karg.contexts = kmalloc((karg.count * sizeof(drm_ctx_t)), GFP_KERNEL);522522- if (!karg.contexts)523523- return -ENOMEM;524524- if (copy_from_user(karg.contexts, ulist,525525- (karg.count * sizeof(drm_ctx_t)))) {526526- kfree(karg.contexts);527527- return -EFAULT;528528- }529529- }530530-531531- old_fs = get_fs();532532- set_fs(KERNEL_DS);533533- ret = sys_ioctl(fd, DRM_IOCTL_RES_CTX, (unsigned long) &karg);534534- set_fs(old_fs);535535-536536- if (!ret) {537537- if (orig_count) {538538- if (copy_to_user(ulist, karg.contexts,539539- (orig_count * sizeof(drm_ctx_t))))540540- ret = -EFAULT;541541- }542542- if (put_user(karg.count, &uarg->count))543543- ret = -EFAULT;544544- }545545-546546- kfree(karg.contexts);547547- return ret;548548-}549549-550550-#endif551551-55222#define HANDLE_IOCTL(cmd, handler) { cmd, (ioctl_trans_handler_t)handler, NULL },55323#define COMPATIBLE_IOCTL(cmd) HANDLE_IOCTL(cmd, sys_ioctl) 55424···3056031561#define DECLARES32562#include "compat_ioctl.c"3333-3434-/* PA-specific ioctls */3535-COMPATIBLE_IOCTL(PA_PERF_ON)3636-COMPATIBLE_IOCTL(PA_PERF_OFF)3737-COMPATIBLE_IOCTL(PA_PERF_VERSION)3856339564/* And these ioctls need translation */40565HANDLE_IOCTL(SIOCGPPPSTATS, dev_ifsioc)···55590COMPATIBLE_IOCTL(RTC_EPOCH_SET)56591#endif575925858-#if defined(CONFIG_DRM) || defined(CONFIG_DRM_MODULE)5959-HANDLE_IOCTL(DRM32_IOCTL_VERSION, drm32_version);6060-HANDLE_IOCTL(DRM32_IOCTL_GET_UNIQUE, drm32_getsetunique);6161-HANDLE_IOCTL(DRM32_IOCTL_SET_UNIQUE, drm32_getsetunique);6262-HANDLE_IOCTL(DRM32_IOCTL_ADD_MAP, drm32_addmap);6363-HANDLE_IOCTL(DRM32_IOCTL_INFO_BUFS, drm32_info_bufs);6464-HANDLE_IOCTL(DRM32_IOCTL_FREE_BUFS, drm32_free_bufs);6565-HANDLE_IOCTL(DRM32_IOCTL_MAP_BUFS, drm32_map_bufs);6666-HANDLE_IOCTL(DRM32_IOCTL_DMA, drm32_dma);6767-HANDLE_IOCTL(DRM32_IOCTL_RES_CTX, drm32_res_ctx);6868-#endif /* DRM */69593IOCTL_TABLE_END7059471595int ioctl_table_size = ARRAY_SIZE(ioctl_start);
+92-18
arch/parisc/kernel/irq.c
···3030#include <linux/seq_file.h>3131#include <linux/spinlock.h>3232#include <linux/types.h>3333+#include <asm/io.h>3434+3535+#include <asm/smp.h>33363437#undef PARISC_IRQ_CR16_COUNTS3538···4643*/4744static volatile unsigned long cpu_eiem = 0;48454949-static void cpu_set_eiem(void *info)5050-{5151- set_eiem((unsigned long) info);5252-}5353-5454-static inline void cpu_disable_irq(unsigned int irq)4646+static void cpu_disable_irq(unsigned int irq)5547{5648 unsigned long eirr_bit = EIEM_MASK(irq);57495850 cpu_eiem &= ~eirr_bit;5959- on_each_cpu(cpu_set_eiem, (void *) cpu_eiem, 1, 1);5151+ /* Do nothing on the other CPUs. If they get this interrupt,5252+ * The & cpu_eiem in the do_cpu_irq_mask() ensures they won't5353+ * handle it, and the set_eiem() at the bottom will ensure it5454+ * then gets disabled */6055}61566257static void cpu_enable_irq(unsigned int irq)6358{6459 unsigned long eirr_bit = EIEM_MASK(irq);65606666- mtctl(eirr_bit, 23); /* clear EIRR bit before unmasking */6761 cpu_eiem |= eirr_bit;6868- on_each_cpu(cpu_set_eiem, (void *) cpu_eiem, 1, 1);6262+6363+ /* FIXME: while our interrupts aren't nested, we cannot reset6464+ * the eiem mask if we're already in an interrupt. Once we6565+ * implement nested interrupts, this can go away6666+ */6767+ if (!in_interrupt())6868+ set_eiem(cpu_eiem);6969+7070+ /* This is just a simple NOP IPI. But what it does is cause7171+ * all the other CPUs to do a set_eiem(cpu_eiem) at the end7272+ * of the interrupt handler */7373+ smp_send_all_nop();6974}70757176static unsigned int cpu_startup_irq(unsigned int irq)···8574void no_ack_irq(unsigned int irq) { }8675void no_end_irq(unsigned int irq) { }87767777+#ifdef CONFIG_SMP7878+int cpu_check_affinity(unsigned int irq, cpumask_t *dest)7979+{8080+ int cpu_dest;8181+8282+ /* timer and ipi have to always be received on all CPUs */8383+ if (irq == TIMER_IRQ || irq == IPI_IRQ) {8484+ /* Bad linux design decision. The mask has already8585+ * been set; we must reset it */8686+ irq_affinity[irq] = CPU_MASK_ALL;8787+ return -EINVAL;8888+ }8989+9090+ /* whatever mask they set, we just allow one CPU */9191+ cpu_dest = first_cpu(*dest);9292+ *dest = cpumask_of_cpu(cpu_dest);9393+9494+ return 0;9595+}9696+9797+static void cpu_set_affinity_irq(unsigned int irq, cpumask_t dest)9898+{9999+ if (cpu_check_affinity(irq, &dest))100100+ return;101101+102102+ irq_affinity[irq] = dest;103103+}104104+#endif105105+88106static struct hw_interrupt_type cpu_interrupt_type = {89107 .typename = "CPU",90108 .startup = cpu_startup_irq,···12282 .disable = cpu_disable_irq,12383 .ack = no_ack_irq,12484 .end = no_end_irq,125125-// .set_affinity = cpu_set_affinity_irq,8585+#ifdef CONFIG_SMP8686+ .set_affinity = cpu_set_affinity_irq,8787+#endif12688};1278912890int show_interrupts(struct seq_file *p, void *v)···261219 return -1;262220}263221222222+223223+unsigned long txn_affinity_addr(unsigned int irq, int cpu)224224+{225225+#ifdef CONFIG_SMP226226+ irq_affinity[irq] = cpumask_of_cpu(cpu);227227+#endif228228+229229+ return cpu_data[cpu].txn_addr;230230+}231231+232232+264233unsigned long txn_alloc_addr(unsigned int virt_irq)265234{266235 static int next_cpu = -1;···286233 if (next_cpu >= NR_CPUS) 287234 next_cpu = 0; /* nothing else, assign monarch */288235289289- return cpu_data[next_cpu].txn_addr;236236+ return txn_affinity_addr(virt_irq, next_cpu);290237}291238292239···303250 irq_enter();304251305252 /*306306- * Only allow interrupt processing to be interrupted by the307307- * timer tick253253+ * Don't allow TIMER or IPI nested interrupts.254254+ * Allowing any single interrupt to nest can lead to that CPU255255+ * handling interrupts with all enabled interrupts unmasked.308256 */309309- set_eiem(EIEM_MASK(TIMER_IRQ));257257+ set_eiem(0UL);310258311259 /* 1) only process IRQs that are enabled/unmasked (cpu_eiem)312260 * 2) We loop here on EIRR contents in order to avoid···321267 if (!eirr_val)322268 break;323269324324- if (eirr_val & EIEM_MASK(TIMER_IRQ))325325- set_eiem(0);326326-327270 mtctl(eirr_val, 23); /* reset bits we are going to process */328271329272 /* Work our way from MSb to LSb...same order we alloc EIRs */330273 for (irq = TIMER_IRQ; eirr_val && bit; bit>>=1, irq++) {274274+#ifdef CONFIG_SMP275275+ cpumask_t dest = irq_affinity[irq];276276+#endif331277 if (!(bit & eirr_val))332278 continue;333279334280 /* clear bit in mask - can exit loop sooner */335281 eirr_val &= ~bit;336282283283+#ifdef CONFIG_SMP284284+ /* FIXME: because generic set affinity mucks285285+ * with the affinity before sending it to us286286+ * we can get the situation where the affinity is287287+ * wrong for our CPU type interrupts */288288+ if (irq != TIMER_IRQ && irq != IPI_IRQ &&289289+ !cpu_isset(smp_processor_id(), dest)) {290290+ int cpu = first_cpu(dest);291291+292292+ printk(KERN_DEBUG "redirecting irq %d from CPU %d to %d\n",293293+ irq, smp_processor_id(), cpu);294294+ gsc_writel(irq + CPU_IRQ_BASE,295295+ cpu_data[cpu].hpa);296296+ continue;297297+ }298298+#endif299299+337300 __do_IRQ(irq, regs);338301 }339302 }340340- set_eiem(cpu_eiem);303303+304304+ set_eiem(cpu_eiem); /* restore original mask */341305 irq_exit();342306}343307···363291static struct irqaction timer_action = {364292 .handler = timer_interrupt,365293 .name = "timer",294294+ .flags = SA_INTERRUPT,366295};367296368297#ifdef CONFIG_SMP369298static struct irqaction ipi_action = {370299 .handler = ipi_interrupt,371300 .name = "IPI",301301+ .flags = SA_INTERRUPT,372302};373303#endif374304
+20-13
arch/parisc/kernel/perf.c
···196196static ssize_t perf_read(struct file *file, char __user *buf, size_t cnt, loff_t *ppos);197197static ssize_t perf_write(struct file *file, const char __user *buf, size_t count, 198198 loff_t *ppos);199199-static int perf_ioctl(struct inode *inode, struct file *file, unsigned int cmd,200200- unsigned long arg);199199+static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg);201200static void perf_start_counters(void);202201static int perf_stop_counters(uint32_t *raddr);203202static struct rdr_tbl_ent * perf_rdr_get_entry(uint32_t rdr_num);···437438 * must be running on the processor that you wish to change.438439 */439440440440-static int perf_ioctl(struct inode *inode, struct file *file, unsigned int cmd,441441- unsigned long arg)441441+static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg)442442{443443 long error_start;444444- uint32_t raddr[4]; 444444+ uint32_t raddr[4];445445+ int error = 0;445446447447+ lock_kernel();446448 switch (cmd) {447449448450 case PA_PERF_ON:449451 /* Start the counters */450452 perf_start_counters();451451- return 0;453453+ break;452454453455 case PA_PERF_OFF:454456 error_start = perf_stop_counters(raddr);455457 if (error_start != 0) {456458 printk(KERN_ERR "perf_off: perf_stop_counters = %ld\n", error_start);457457- return -EFAULT; 459459+ error = -EFAULT;460460+ break;458461 }459462460463 /* copy out the Counters */461464 if (copy_to_user((void __user *)arg, raddr, 462465 sizeof (raddr)) != 0) {463463- return -EFAULT;466466+ error = -EFAULT;467467+ break;464468 }465465- return 0;469469+ break;466470467471 case PA_PERF_VERSION:468472 /* Return the version # */469469- return put_user(PERF_VERSION, (int *)arg);473473+ error = put_user(PERF_VERSION, (int *)arg);474474+ break;470475471476 default:472472- break;477477+ error = -ENOTTY;473478 }474474- return -ENOTTY;479479+480480+ unlock_kernel();481481+482482+ return error;475483}476484477485static struct file_operations perf_fops = {478486 .llseek = no_llseek,479487 .read = perf_read,480488 .write = perf_write,481481- .ioctl = perf_ioctl,489489+ .unlocked_ioctl = perf_ioctl,490490+ .compat_ioctl = perf_ioctl,482491 .open = perf_open,483492 .release = perf_release484493};
+3-2
arch/parisc/kernel/ptrace.c
···264264 * sigkill. perhaps it should be put in the status265265 * that it wants to exit.266266 */267267+ ret = 0;267268 DBG("sys_ptrace(KILL)\n");268269 if (child->exit_state == EXIT_ZOMBIE) /* already dead */269270 goto out_tsk;···345344346345 case PTRACE_GETEVENTMSG:347346 ret = put_user(child->ptrace_message, (unsigned int __user *) data);348348- goto out;347347+ goto out_tsk;349348350349 default:351350 ret = ptrace_request(child, request, addr, data);352352- goto out;351351+ goto out_tsk;353352 }354353355354out_wake_notrap:
-1
arch/parisc/kernel/signal.c
···296296 struct rt_sigframe __user *frame;297297 unsigned long rp, usp;298298 unsigned long haddr, sigframe_size;299299- struct siginfo si;300299 int err = 0;301300#ifdef __LP64__302301 compat_int_t compat_val;
+18-6
arch/parisc/kernel/smp.c
···181181 while (ops) {182182 unsigned long which = ffz(~ops);183183184184+ ops &= ~(1 << which);185185+184186 switch (which) {187187+ case IPI_NOP:188188+#if (kDEBUG>=100)189189+ printk(KERN_DEBUG "CPU%d IPI_NOP\n",this_cpu);190190+#endif /* kDEBUG */191191+ break;192192+185193 case IPI_RESCHEDULE:186194#if (kDEBUG>=100)187195 printk(KERN_DEBUG "CPU%d IPI_RESCHEDULE\n",this_cpu);188196#endif /* kDEBUG */189189- ops &= ~(1 << IPI_RESCHEDULE);190197 /*191198 * Reschedule callback. Everything to be192199 * done is done by the interrupt return path.···204197#if (kDEBUG>=100)205198 printk(KERN_DEBUG "CPU%d IPI_CALL_FUNC\n",this_cpu);206199#endif /* kDEBUG */207207- ops &= ~(1 << IPI_CALL_FUNC);208200 {209201 volatile struct smp_call_struct *data;210202 void (*func)(void *info);···237231#if (kDEBUG>=100)238232 printk(KERN_DEBUG "CPU%d IPI_CPU_START\n",this_cpu);239233#endif /* kDEBUG */240240- ops &= ~(1 << IPI_CPU_START);241234#ifdef ENTRY_SYS_CPUS242235 p->state = STATE_RUNNING;243236#endif···246241#if (kDEBUG>=100)247242 printk(KERN_DEBUG "CPU%d IPI_CPU_STOP\n",this_cpu);248243#endif /* kDEBUG */249249- ops &= ~(1 << IPI_CPU_STOP);250244#ifdef ENTRY_SYS_CPUS251245#else252246 halt_processor();···256252#if (kDEBUG>=100)257253 printk(KERN_DEBUG "CPU%d is alive!\n",this_cpu);258254#endif /* kDEBUG */259259- ops &= ~(1 << IPI_CPU_TEST);260255 break;261256262257 default:263258 printk(KERN_CRIT "Unknown IPI num on CPU%d: %lu\n",264259 this_cpu, which);265265- ops &= ~(1 << which);266260 return IRQ_NONE;267261 } /* Switch */268262 } /* while (ops) */···314312void 315313smp_send_reschedule(int cpu) { send_IPI_single(cpu, IPI_RESCHEDULE); }316314315315+void316316+smp_send_all_nop(void)317317+{318318+ send_IPI_allbutself(IPI_NOP);319319+}320320+317321318322/**319323 * Run a function on all other CPUs.···346338347339 /* Can deadlock when called with interrupts disabled */348340 WARN_ON(irqs_disabled());341341+342342+ /* can also deadlock if IPIs are disabled */343343+ WARN_ON((get_eiem() & (1UL<<(CPU_IRQ_MAX - IPI_IRQ))) == 0);344344+349345350346 data.func = func;351347 data.info = info;
+2-1
arch/parisc/kernel/syscall.S
···164164#endif165165 STREG %r2, TASK_PT_GR30(%r1) /* ... and save it */166166167167- STREG %r20, TASK_PT_GR20(%r1)167167+ STREG %r20, TASK_PT_GR20(%r1) /* Syscall number */168168 STREG %r21, TASK_PT_GR21(%r1)169169 STREG %r22, TASK_PT_GR22(%r1)170170 STREG %r23, TASK_PT_GR23(%r1) /* 4th argument */···527527 We *must* giveup this call and fail.528528 */529529 ldw 4(%sr2,%r20), %r28 /* Load thread register */530530+ /* WARNING: If cr27 cycles to the same value we have problems */530531 mfctl %cr27, %r21 /* Get current thread register */531532 cmpb,<>,n %r21, %r28, cas_lock /* Called recursive? */532533 b lws_exit /* Return error! */
+1-1
drivers/ide/Kconfig
···625625 tristate "NS87415 chipset support"626626 help627627 This driver adds detection and support for the NS87415 chip628628- (used in SPARC64, among others).628628+ (used mainly on SPARC64 and PA-RISC machines).629629630630 Please read the comments at the top of <file:drivers/ide/pci/ns87415.c>.631631
+6-6
drivers/isdn/hisax/Kconfig
···110110111111config HISAX_TELESPCI112112 bool "Teles PCI"113113- depends on PCI && (BROKEN || !(SPARC64 || PPC))113113+ depends on PCI && (BROKEN || !(SPARC || PPC || PARISC || M68K))114114 help115115 This enables HiSax support for the Teles PCI.116116 See <file:Documentation/isdn/README.HiSax> on how to configure it.···238238239239config HISAX_NETJET240240 bool "NETjet card"241241- depends on PCI && (BROKEN || !(SPARC64 || PPC))241241+ depends on PCI && (BROKEN || !(SPARC || PPC || PARISC || M68K))242242 help243243 This enables HiSax support for the NetJet from Traverse244244 Technologies.···249249250250config HISAX_NETJET_U251251 bool "NETspider U card"252252- depends on PCI && (BROKEN || !(SPARC64 || PPC))252252+ depends on PCI && (BROKEN || !(SPARC || PPC || PARISC || M68K))253253 help254254 This enables HiSax support for the Netspider U interface ISDN card255255 from Traverse Technologies.···317317318318config HISAX_HFC_PCI319319 bool "HFC PCI-Bus cards"320320- depends on PCI && (BROKEN || !(SPARC64 || PPC))320320+ depends on PCI && (BROKEN || !(SPARC || PPC || PARISC || M68K))321321 help322322 This enables HiSax support for the HFC-S PCI 2BDS0 based cards.323323···344344345345config HISAX_ENTERNOW_PCI346346 bool "Formula-n enter:now PCI card"347347- depends on PCI && (BROKEN || !(SPARC64 || PPC))347347+ depends on PCI && (BROKEN || !(SPARC || PPC || PARISC || M68K))348348 help349349 This enables HiSax support for the Formula-n enter:now PCI350350 ISDN card.351351352352config HISAX_AMD7930353353 bool "Am7930 (EXPERIMENTAL)"354354- depends on EXPERIMENTAL && (SPARC32 || SPARC64)354354+ depends on EXPERIMENTAL && SPARC355355 help356356 This enables HiSax support for the AMD7930 chips on some SPARCs.357357 This code is not finished yet.
+1-1
drivers/isdn/pcbit/Kconfig
···33#44config ISDN_DRV_PCBIT55 tristate "PCBIT-D support"66- depends on ISDN_I4L && ISA && (BROKEN || !PPC)66+ depends on ISDN_I4L && ISA && (BROKEN || X86)77 help88 This enables support for the PCBIT ISDN-card. This card is99 manufactured in Portugal by Octal. For running this card,
···2424 * Major changes to get basic interrupt infrastructure working to2525 * hopefully be able to support all SuperIO devices. Currently2626 * works with serial. -- John Marvin <jsm@fc.hp.com>2727+ *2828+ * Converted superio_init() to be a PCI_FIXUP_FINAL callee.2929+ * -- Kyle McMartin <kyle@parisc-linux.org>2730 */28312932···144141}145142146143/* Initialize Super I/O device */147147-148148-static void __devinit149149-superio_init(struct superio_device *sio)144144+static void145145+superio_init(struct pci_dev *pcidev)150146{147147+ struct superio_device *sio = &sio_dev;151148 struct pci_dev *pdev = sio->lio_pdev;152149 u16 word;153150···163160 /* ...then properly fixup the USB to point at suckyio PIC */164161 sio->usb_pdev->irq = superio_fixup_irq(sio->usb_pdev);165162166166- printk (KERN_INFO "SuperIO: Found NS87560 Legacy I/O device at %s (IRQ %i) \n",167167- pci_name(pdev),pdev->irq);163163+ printk(KERN_INFO "SuperIO: Found NS87560 Legacy I/O device at %s (IRQ %i) \n",164164+ pci_name(pdev), pdev->irq);168165169166 pci_read_config_dword (pdev, SIO_SP1BAR, &sio->sp1_base);170167 sio->sp1_base &= ~1;···277274278275 sio->suckyio_irq_enabled = 1;279276}280280-277277+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87560_LIO, superio_init);281278282279static void superio_disable_irq(unsigned int irq)283280{···455452DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87415, superio_fixup_pci);456453457454458458-static int __devinit superio_probe(struct pci_dev *dev, const struct pci_device_id *id)455455+static int __devinit456456+superio_probe(struct pci_dev *dev, const struct pci_device_id *id)459457{458458+ struct superio_device *sio = &sio_dev;460459461460 /*462461 ** superio_probe(00:0e.0) ven 0x100b dev 0x2 sv 0x0 sd 0x0 class 0x1018a···471466 dev->subsystem_vendor, dev->subsystem_device,472467 dev->class);473468474474- superio_init(&sio_dev);469469+ if (!sio->suckyio_irq_enabled)470470+ BUG(); /* Enabled by PCI_FIXUP_FINAL */475471476472 if (dev->device == PCI_DEVICE_ID_NS_87560_LIO) { /* Function 1 */477473 superio_parport_init();···487481 DBG_INIT("superio_probe: WTF? Fire Extinguisher?\n");488482 }489483490490- /* Let appropriate other driver claim this device. */ 484484+ /* Let appropriate other driver claim this device. */491485 return -ENODEV;492486}493487494488static struct pci_device_id superio_tbl[] = {495495- { PCI_VENDOR_ID_NS, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },489489+ { PCI_DEVICE(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87560_LIO) },490490+ { PCI_DEVICE(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87560_USB) },491491+ { PCI_DEVICE(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87415) },496492 { 0, }497493};498494499495static struct pci_driver superio_driver = {500500- .name = "SuperIO",501501- .id_table = superio_tbl,502502- .probe = superio_probe,496496+ .name = "SuperIO",497497+ .id_table = superio_tbl,498498+ .probe = superio_probe,503499};504500505501static int __init superio_modinit(void)···513505{514506 pci_unregister_driver(&superio_driver);515507}516516-517508518509module_init(superio_modinit);519510module_exit(superio_exit);
+1-1
drivers/serial/Kconfig
···507507508508config SERIAL_MUX509509 tristate "Serial MUX support"510510- depends on PARISC510510+ depends on GSC511511 select SERIAL_CORE512512 default y513513 ---help---
+11-8
drivers/serial/mux.c
···65656666static struct timer_list mux_timer;67676868-#define UART_PUT_CHAR(p, c) __raw_writel((c), (unsigned long)(p)->membase + IO_DATA_REG_OFFSET)6969-#define UART_GET_FIFO_CNT(p) __raw_readl((unsigned long)(p)->membase + IO_DCOUNT_REG_OFFSET)6868+#define UART_PUT_CHAR(p, c) __raw_writel((c), (p)->membase + IO_DATA_REG_OFFSET)6969+#define UART_GET_FIFO_CNT(p) __raw_readl((p)->membase + IO_DCOUNT_REG_OFFSET)7070#define GET_MUX_PORTS(iodc_data) ((((iodc_data)[4] & 0xf0) >> 4) * 8) + 871717272/**···7979 */8080static unsigned int mux_tx_empty(struct uart_port *port)8181{8282- unsigned int cnt = __raw_readl((unsigned long)port->membase 8383- + IO_DCOUNT_REG_OFFSET);8484-8585- return cnt ? 0 : TIOCSER_TEMT;8282+ return UART_GET_FIFO_CNT(port) ? 0 : TIOCSER_TEMT;8683} 87848885/**···215218 __u32 start_count = port->icount.rx;216219217220 while(1) {218218- data = __raw_readl((unsigned long)port->membase219219- + IO_DATA_REG_OFFSET);221221+ data = __raw_readl(port->membase + IO_DATA_REG_OFFSET);220222221223 if (MUX_STATUS(data))222224 continue;···477481 port->ops = &mux_pops;478482 port->flags = UPF_BOOT_AUTOCONF;479483 port->line = port_cnt;484484+485485+ /* The port->timeout needs to match what is present in486486+ * uart_wait_until_sent in serial_core.c. Otherwise487487+ * the time spent in msleep_interruptable will be very488488+ * long, causing the appearance of a console hang.489489+ */490490+ port->timeout = HZ / 50;480491 spin_lock_init(&port->lock);481492 status = uart_add_one_port(&mux_driver, port);482493 BUG_ON(status);
+3-2
include/asm-parisc/irq.h
···88#define _ASM_PARISC_IRQ_H991010#include <linux/config.h>1111+#include <linux/cpumask.h>1112#include <asm/types.h>12131314#define NO_IRQ (-1)···5049extern int txn_claim_irq(int);5150extern unsigned int txn_alloc_data(unsigned int);5251extern unsigned long txn_alloc_addr(unsigned int);5252+extern unsigned long txn_affinity_addr(unsigned int irq, int cpu);53535454extern int cpu_claim_irq(unsigned int irq, struct hw_interrupt_type *, void *);5555-5656-extern int cpu_claim_irq(unsigned int irq, struct hw_interrupt_type *, void *);5555+extern int cpu_check_affinity(unsigned int irq, cpumask_t *dest);57565857/* soft power switch support (power.c) */5958extern struct tasklet_struct power_tasklet;
···1111 return *a == 0;1212}13131414-#define __raw_spin_lock_flags(lock, flags) __raw_spin_lock(lock)1414+#define __raw_spin_lock(lock) __raw_spin_lock_flags(lock, 0)1515#define __raw_spin_unlock_wait(x) \1616 do { cpu_relax(); } while (__raw_spin_is_locked(x))17171818-static inline void __raw_spin_lock(raw_spinlock_t *x)1818+static inline void __raw_spin_lock_flags(raw_spinlock_t *x,1919+ unsigned long flags)1920{2021 volatile unsigned int *a;21222223 mb();2324 a = __ldcw_align(x);2425 while (__ldcw(a) == 0)2525- while (*a == 0);2626+ while (*a == 0)2727+ if (flags & PSW_SM_I) {2828+ local_irq_enable();2929+ cpu_relax();3030+ local_irq_disable();3131+ } else3232+ cpu_relax();2633 mb();2734}2835···67606861static __inline__ void __raw_read_lock(raw_rwlock_t *rw)6962{7070- unsigned long flags;7171- local_irq_save(flags);7263 __raw_spin_lock(&rw->lock);73647465 rw->counter++;75667667 __raw_spin_unlock(&rw->lock);7777- local_irq_restore(flags);7868}79698070static __inline__ void __raw_read_unlock(raw_rwlock_t *rw)8171{8282- unsigned long flags;8383- local_irq_save(flags);8472 __raw_spin_lock(&rw->lock);85738674 rw->counter--;87758876 __raw_spin_unlock(&rw->lock);8989- local_irq_restore(flags);9077}91789279/* write_lock is less trivial. We optimistically grab the lock and check
+4-12
include/asm-parisc/tlbflush.h
···1212 * N class systems, only one PxTLB inter processor broadcast can be1313 * active at any one time on the Merced bus. This tlb purge1414 * synchronisation is fairly lightweight and harmless so we activate1515- * it on all SMP systems not just the N class. */1616-#ifdef CONFIG_SMP1515+ * it on all SMP systems not just the N class. We also need to have1616+ * preemption disabled on uniprocessor machines, and spin_lock does that1717+ * nicely.1818+ */1719extern spinlock_t pa_tlb_lock;18201921#define purge_tlb_start(x) spin_lock(&pa_tlb_lock)2022#define purge_tlb_end(x) spin_unlock(&pa_tlb_lock)2121-2222-#else2323-2424-#define purge_tlb_start(x) do { } while(0)2525-#define purge_tlb_end(x) do { } while (0)2626-2727-#endif2828-29233024extern void flush_tlb_all(void);3125···8288 if (npages >= 512) /* 2MB of space: arbitrary, should be tuned */8389 flush_tlb_all();8490 else {8585- preempt_disable();8691 mtsp(vma->vm_mm->context,1);8792 purge_tlb_start();8893 if (split_tlb) {···95102 pdtlb(start);96103 start += PAGE_SIZE;97104 }9898- preempt_enable();99105 }100106 purge_tlb_end();101107 }
+2
include/linux/mm.h
···940940941941/* Do stack extension */942942extern int expand_stack(struct vm_area_struct *vma, unsigned long address);943943+#ifdef CONFIG_IA64943944extern int expand_upwards(struct vm_area_struct *vma, unsigned long address);945945+#endif944946945947/* Look up the first VMA which satisfies addr < vm_end, NULL if none. */946948extern struct vm_area_struct * find_vma(struct mm_struct * mm, unsigned long addr);
+1-1
mm/mmap.c
···15011501 * PA-RISC uses this for its stack; IA64 for its Register Backing Store.15021502 * vma is the last one with address > vma->vm_end. Have to extend vma.15031503 */15041504-#ifdef CONFIG_STACK_GROWSUP15041504+#ifndef CONFIG_IA6415051505static inline15061506#endif15071507int expand_upwards(struct vm_area_struct *vma, unsigned long address)